[ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['index', 'result'], '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); //запускаем парсинг // доп. опции для парсера - удаление префикса в артикулах $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 { throw new \ErrorException( 'Ошибка загрузки данных' ); } } // public function actionResults() // { // $model = new UploadFileRgForm(); // $data = []; // // if ($model->load(Yii::$app->request->post())) { // $model->file = UploadedFile::getInstance($model, 'file'); // // первый проход - валидируем, сохраняем файл, ложим в кеш отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся) // if ($model->validate()) { // // $model->file_path = Yii::getAlias('@manual_upload') . '/' . $model->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); // // // } 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); // // // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список) // $header_array = Margins::getHeader(); // // return $this->render('results', // ['model' => $data, // 'header_model' => $header_model, // // список колонок для выбора // 'basic_column' => $header_array, // '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(Margins::getHeader())]); // } // // // провалидируем выбранные колонки // 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]); // // } // // } }