/** * @return \yii\db\ActiveQuery */ public function getPodruzkaPrices() { return $this->hasMany(PodruzkaPrice::className(), ['article' => 'article']); }
public function uploadInformProduct() { // проверяем существует есть ли файл $filename = \Yii::$app->basePath . '/web/files/upload.xlsx'; $chunkSize = 500; //размер считываемых строк за раз //начинаем читать со строки 2, в PHPExcel первая строка имеет индекс 1, и как правило это строка заголовков $startRow = 2; $exit = false; //флаг выхода $empty_value = 0; //счетчик пустых знаений $objReader = \PHPExcel_IOFactory::createReaderForFile($filename); $objReader->setReadDataOnly(true); $chunkFilter = new chunkReadFilter(); $objReader->setReadFilter($chunkFilter); /** Tell the Reader that we want to use the Read Filter that we've Instantiated **/ $objReader->setReadFilter($chunkFilter); //внешний цикл, пока файл не кончится while (!$exit) { $chunkFilter->setRows($startRow, $chunkSize); //устанавливаем знаечние фильтра $objPHPExcel = $objReader->load($filename); //открываем файл $objPHPExcel->setActiveSheetIndex(0); //устанавливаем индекс активной страницы $objWorksheet = $objPHPExcel->getActiveSheet(); //делаем активной нужную страницу //внутренний цикл по строкам for ($i = $startRow; $i < $startRow + $chunkSize; $i++) { //получаем первое знаение в строке $value = $objWorksheet->getCellByColumnAndRow(0, $i)->getValue(); if (!empty($value)) { if (!PodruzkaProduct::findOne(['article' => $value])) { $product = new PodruzkaProduct(); } else { $product = PodruzkaProduct::findOne(['article' => $value]); } $product->article = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(0, $i)->getValue())); $product->title = (string) $objWorksheet->getCellByColumnAndRow(1, $i)->getValue(); $product->arrival = (string) $objWorksheet->getCellByColumnAndRow(2, $i)->getValue(); $product->group = (string) $objWorksheet->getCellByColumnAndRow(3, $i)->getValue(); $product->category = (string) $objWorksheet->getCellByColumnAndRow(4, $i)->getValue(); $product->sub_category = (string) $objWorksheet->getCellByColumnAndRow(5, $i)->getValue(); $product->detail = (string) $objWorksheet->getCellByColumnAndRow(6, $i)->getValue(); $product->brand = (string) $objWorksheet->getCellByColumnAndRow(7, $i)->getValue(); $product->sub_brand = (string) $objWorksheet->getCellByColumnAndRow(8, $i)->getValue(); $product->line = (string) $objWorksheet->getCellByColumnAndRow(9, $i)->getValue(); $product->price = (string) $objWorksheet->getCellByColumnAndRow(10, $i)->getValue(); $product->ma_price = (string) $objWorksheet->getCellByColumnAndRow(11, $i)->getValue(); $product->save(); } $productPrice = new PodruzkaPrice(); $productPrice->article = $objWorksheet->getCellByColumnAndRow(0, $i)->getValue(); $productPrice->price = (string) $objWorksheet->getCellByColumnAndRow(10, $i)->getValue(); $productPrice->ma_price = (string) $objWorksheet->getCellByColumnAndRow(11, $i)->getValue(); if (!$productPrice->save()) { //TODO ? } //проверяем значение на пустоту if (empty($value)) { $empty_value++; } //после 1 пустого значения, завершаем обработку файла, думая, что это конец if ($empty_value == 1) { $exit = true; continue; } } $objPHPExcel->disconnectWorksheets(); //чистим unset($objPHPExcel); //память $startRow += $chunkSize; //переходим на следующий шаг цикла, увеличивая строку, с которой будем читать файл } unlink($filename); }