diff --git a/backend/controllers/CrossingUploadController.php b/backend/controllers/CrossingUploadController.php index eecf624..69e7af9 100755 --- a/backend/controllers/CrossingUploadController.php +++ b/backend/controllers/CrossingUploadController.php @@ -10,10 +10,12 @@ namespace backend\controllers; use backend\components\base\BaseController; use common\components\CustomVarDamp; +use yii\data\ArrayDataProvider; use yii\filters\VerbFilter; use yii\filters\AccessControl; use backend\models\UploadFileCrossingForm; use backend\models\DetailsCrosses; +use yii\multiparser\DynamicFormHelper; use yii\web\UploadedFile; use \Yii; @@ -82,178 +84,165 @@ class CrossingUploadController extends BaseController $model->file->saveAs($model->file_path); //запускаем парсинг - // доп. опции для парсера - удаление префикса в артикулах - $options['mode'] = 'crosses'; - $fields = []; - if ($model->delete_prefix1) { - $fields[] = 'ARTICLE'; - } - if ($model->delete_prefix2) { - $fields[] = 'CROSS_ARTICLE'; + $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 ( $fields ) { - $options [ 'converter_conf' ] = [ 'configuration' => [ "article" => $fields , - "string" => ['ARTICLE', 'CROSS_ARTICLE'],] ]; - } else { - $options [ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'], ] ]; + if (isset($row_data['!_null'])) { + unset($row_data['!_null']); } - $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) ); + 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; + } - throw new \ErrorException( $errors_str ); + } + // сохраним подготовленные данные + 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]); - } else { - throw new \ErrorException( 'Ошибка загрузки данных' ); } + } + protected function getBasicColumns(){ -// 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]); -// -// } -// -// } + $basicColumns_array = Yii::$app->multiparser->getConfiguration( 'csv','crosses' ); + if ( isset( $basicColumns_array['basic_column'] ) ) { + return $basicColumns_array['basic_column']; + } else { + throw new \ErrorException( 'Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.' ); + } + + } } \ No newline at end of file diff --git a/common/components/parsers/config.php b/common/components/parsers/config.php index 9a67379..1863297 100755 --- a/common/components/parsers/config.php +++ b/common/components/parsers/config.php @@ -46,7 +46,15 @@ "brand" => ['BRAND', 'CROSS_BRAND'], "crosses" => [], ] - ],], + ], + 'basic_column' => [ + Null => 'Пусто', + "ARTICLE"=> 'Артикул', + "CROSS_ARTICLE" => 'Кросс артикул', + "BRAND" => 'Бренд', + "CROSS_BRAND" => 'Кросс бренд' + ], + ], ], 'xml' => ['console' => -- libgit2 0.21.4