[ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error', 'download-photo','delete-image','result' ], 'allow' => true, ], [ 'actions' => ['logout', 'index','create','update','view','delete',], 'allow' => true, 'roles' => ['@'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], ], ], ]; } /** * @inheritdoc */ public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], ]; } public function actionIndex() { $model = new UploadFileCrossingForm(); return $this->render('index', ['model' => $model]); } public function actionResult() { $model = new UploadFileCrossingForm(); $data = []; if ($model->load(Yii::$app->request->post())) { $model->file = UploadedFile::getInstance($model, 'file'); if ($model->validate()) { $file_name = $model->file->name; $model->file_path = Yii::getAlias('@temp_upload') . '/' . $file_name; $model->file->saveAs($model->file_path); //запускаем парсинг $data = $model->readFile(); // сохраняем в кеш отпарсенные даные Yii::$app->getCache()->set('parser_data', json_encode($data), 1800); // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800); // // доп. опции для парсера - удаление префикса в артикулах // $options['mode'] = 'crosses'; // $fields = []; // if ($model->delete_prefix1) { // $fields[] = 'ARTICLE'; // } // if ($model->delete_prefix2) { // $fields[] = 'CROSS_ARTICLE'; // } // if ( $fields ) { // $options [ 'converter_conf' ] = [ 'configuration' => [ "article" => $fields , // "string" => ['ARTICLE', 'CROSS_ARTICLE'],] ]; // } else { // $options [ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'], ] ]; // } // // $data = $model->readFile( $options ); // $crosses_model = new DetailsCrosses(); // $crosses_model->ManualInsertWithIgnore( $data ); // // Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен'); // return $this->render('index', ['model' => $model]); // }else{ // // не прошла валидация форма загрузки файлов // $errors_str = ''; // foreach ($model->getErrors() as $error) { // $errors_str .= implode( array_values($error) ); // } // throw new \ErrorException( $errors_str ); // } } 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, ], ]); // создадим модель на столько реквизитов сколько колонок в отпарсенном файле $last_index = end(array_flip($data[0])); $header_counts = $last_index + 1; $header_model = DynamicFormHelper::CreateDynamicModel($header_counts); // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) $basicColumns = $this->getBasicColumns(); return $this->render('results', ['model' => $data, 'header_model' => $header_model, // список колонок для выбора 'basic_column' => $basicColumns, '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' => $this->getBasicColumns() ]); } // провалидируем выбранные колонки 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 { throw new \ErrorException('Ошибка кеша'); } array_walk($arr, function (&$val) { $val = '!' . $val; }); // соотнесем отпарсенные данные с соответствием полученным от пользователя // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_'); // в первой строке у нас заголовки - уберем unset($data[0]); // подготовим данные для записи в таблицу w_margins_groups $arr_values = []; $group = ''; $importer_id = $configuration['importer_id']; foreach ($data as $row_data) { if (isset($row_data['!group'])) { $group = $row_data['!group']; unset($row_data['!group']); } if (isset($row_data['!_null'])) { unset($row_data['!_null']); } foreach ($row_data as $key => $value) { if ($group) $row['group'] = trim($group); $row['importer_id'] = trim($importer_id); $row['margin_id'] = ltrim($key, '!'); $row['koef'] = \Yii::$app->converter->convertTo('float', $value, ['precision' => 6]); $arr_values[] = $row; } } // сохраним подготовленные данные MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] ); Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен"); // все прошло успешно - очищаем кеш Yii::$app->getCache()->delete('parser_data'); Yii::$app->getCache()->delete('parser_configuration'); if (file_exists($configuration['file_path'])) unlink($configuration['file_path']); return $this->render('index', ['model' => $configuration]); } } protected function getBasicColumns(){ $basicColumns_array = Yii::$app->multiparser->getConfiguration( 'csv','crosses' ); if ( isset( $basicColumns_array['basic_column'] ) ) { return $basicColumns_array['basic_column']; } else { throw new \ErrorException( 'Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.' ); } } }