[ 'class' => AccessControl::className(), 'rules' => [ [ 'allow' => true, 'roles' => ['@'], ], ], ], // 'verbs' => [ // 'class' => VerbFilter::className(), // 'actions' => [ // 'logout' => ['post'], // ], // ], ]; } /** * @inheritdoc */ public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], ]; } public function actionIndex($mode = 0) { $model = new UploadFileParsingForm(); // установим режим, 0 - ручная загрузка, 1 - автозагрузка $model->mode = $mode; //CustomVarDamp::dumpAndDie(phpinfo()); return $this->render('index', ['model' => $model]); } // public function beforeAction($action) // { // if($action->actionMethod ='actionResults'){ // CustomVarDamp::dumpAndDie(phpinfo()); // } // } public function actionResults($mode = 0) { $model = new UploadFileParsingForm(['mode' => $mode]); $data = []; if ($model->load(Yii::$app->request->post())) { $model->file = UploadedFile::getInstance($model, 'file'); // первый проход - валидируем, сохраняем файл, ложим в кеш (для ручной загрузки) отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся) if ($model->validate()) { // запишем дату загрузки файла в таблицу файлов поставщика (ImportersFiles) $files_model = new ImporterFiles(); // id поставщика получим из конфигурации $files_model->load(['ImporterFiles' => $model->toArray()]); try { $files_model->save(); } catch (ErrorException $e) { CustomVarDamp::dump($e->getMessage()); } // получим id только что записанной записи - его запишем в название файла $model->record_id = $files_model->find() ->where(['importer_id' => $files_model->importer_id]) ->orderBy(['id' => SORT_DESC]) ->one() ->id; $file_name = $model->record_id . '.' . $model->file->extension; if ($model->mode) { $model->file_path = Yii::getAlias('@auto_upload') . '/' . $file_name; } else { $model->file_path = Yii::getAlias('@manual_upload') . '/' . $file_name; } $model->file->saveAs($model->file_path); // для авто загрузки, обработка завершена if ($model->mode) { $model->success = true; return $this->render('index', ['model' => $model]); } // === ручная загрузка =========== //запускаем парсинг $data = $model->readFile(); // сохраняем в кеш отпарсенные даные Yii::$app->getCache()->set('parser_data', json_encode($data)); // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных Yii::$app->getCache()->set('parser_configuration', serialize($model)); } else { // не прошла валидация форма загрузки файлов //@todo - отправка на страницу ошибок $errors_arr = $model->getErrors(); foreach ($errors_arr as $error) { CustomVarDamp::dump(array_values($error)); } die; } // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные } else if (Yii::$app->getCache()->get('parser_data')) { $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); } $provider = new ArrayDataProvider([ 'allModels' => $data, 'pagination' => [ 'pageSize' => 10, ], ]); //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список) $header_model = DynamicFormHelper::CreateDynamicModel(count($data[0])); return $this->render('results', ['model' => $data, 'header_model' => $header_model, // список колонок для выбора 'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'), 'dataProvider' => $provider]); } public function actionWrite() { //получим колонки которые выбрал пользователь $arr_attributes = Yii::$app->request->post()['DynamicModel']; //соберем модель по полученным данным $model = DynamicFormHelper::CreateDynamicModel($arr_attributes); //добавим правила валидации (колонки должны быть те что указаны в конфиге) foreach ($arr_attributes as $key => $value) { $model->addRule($key, 'in', ['range' => array_keys(Yii::$app->multiparser->getConfiguration('csv', 'basic_column'))]); } // провалидируем выбранные колонки if ($model->validate()) { // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы $arr = $model->toArray(); // получим данные из кеша if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) { $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); $configuration = unserialize(Yii::$app->getCache()->get('parser_configuration')); } else { CustomVarDamp::dumpAndDie('Ошибка кеша'); } // соотнесем отпарсенные данные с соответсивем полученным от пользователя // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_'); // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles) // id загруженного файла получим из конфигурации $files_model = ImporterFiles::findOne( $configuration->record_id ); //$files_model->load(['ImporterFiles' => $configuration->toArray()]); $update_date = date('Y-m-d H:i:s'); $files_model->time_start = $update_date; // запишем дату начала загрузки if (!$files_model->save()) { CustomVarDamp::dumpAndDie($files_model->getErrors()); } // 2. запишем полученные данные в таблицу товаров (Details) $details_model = new Details(); // проверим все ли обязательные колонки были указаны пользователем $details_model->load(['Details' => $data[0]]); if ($details_model->validate()) { // дополним данные значением импортера и даты обновления цены $data = \Yii::$app->multiparser->addColumns($data, ['IMPORT_ID' => $configuration->importer_id, 'timestamp' => $update_date]); try { //@todo add transaction // попытаемся вставить данные в БД с апдейтом по ключам $details_model->ManualInsert($data); // 3. зафиксируем дату конца загрузки в файлах поставщика $files_model->time_end = date('Y-m-d H:i:s'); // CustomVarDamp::dumpAndDie($files_model); if (!$files_model->save()) { CustomVarDamp::dumpAndDie($files_model->getErrors()); } // 4. зафиксируем дату загрузки в таблице поставщиков $imp_model = Importer::findOne($configuration['importer_id']); $imp_model->price_date_update = $update_date; if (!$imp_model->save()) { CustomVarDamp::dumpAndDie($imp_model->getErrors()); } $configuration['success'] = true; // все прошло успешно - очищаем кеш Yii::$app->getCache()->delete('parser_data'); Yii::$app->getCache()->delete('parser_configuration'); unlink($configuration['file_path']); return $this->render('index', ['model' => $configuration]); } catch (ErrorException $e) { CustomVarDamp::dump($e->getMessage()); } } if ($details_model->hasErrors()) { $errors_arr = $details_model->getErrors(); foreach ($errors_arr as $error) { CustomVarDamp::dump(array_values($error)); } } } } public function actionAutoUpload() { $query = Importer::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]); $provider = new ActiveDataProvider([ 'query' => $query, 'pagination' => [ 'pageSize' => 10, ], ]); return $this->render('check_price', [ 'dataProvider' => $provider]); } public function actionServerFiles () { $arr_id = []; // получим список файлов которые ожидают к загрузке foreach (glob(Yii::getAlias('@auto_upload') . '/*') as $server_file) { $file_id = basename($server_file,".csv"); $arr_id[] = (int) $file_id; } $query = ImporterFiles::find()->where(['in', 'id', $arr_id])->orderBy(['upload_time' => SORT_DESC]); $provider = new ActiveDataProvider([ 'query' => $query, 'pagination' => [ 'pageSize' => 10, ], ]); return $this->render('server-files', [ 'dataProvider' => $provider]); } public function actionDelete ($id) { if(Yii::$app->request->isAjax){ CustomVarDamp::dumpAndDie(1); } $files_model = new ImporterFiles(); try { $files_model->delete($id); unlink(Yii::getAlias('@auto_upload') . '/' . $id . '.csv' ); } catch (ErrorException $e) { CustomVarDamp::dump($e->getMessage()); } $this->redirect('server-files'); } }