Commit 9be31ea0d78d871d306270a70f23d1aac624b2f6

Authored by Administrator
2 parents 27ba995c a4860367

Merge remote-tracking branch 'origin/master'

backend/controllers/CrossingUploadController.php
@@ -10,10 +10,12 @@ namespace backend\controllers; @@ -10,10 +10,12 @@ namespace backend\controllers;
10 10
11 use backend\components\base\BaseController; 11 use backend\components\base\BaseController;
12 use common\components\CustomVarDamp; 12 use common\components\CustomVarDamp;
  13 +use yii\data\ArrayDataProvider;
13 use yii\filters\VerbFilter; 14 use yii\filters\VerbFilter;
14 use yii\filters\AccessControl; 15 use yii\filters\AccessControl;
15 use backend\models\UploadFileCrossingForm; 16 use backend\models\UploadFileCrossingForm;
16 use backend\models\DetailsCrosses; 17 use backend\models\DetailsCrosses;
  18 +use yii\multiparser\DynamicFormHelper;
17 use yii\web\UploadedFile; 19 use yii\web\UploadedFile;
18 use \Yii; 20 use \Yii;
19 21
@@ -82,39 +84,165 @@ class CrossingUploadController extends BaseController @@ -82,39 +84,165 @@ class CrossingUploadController extends BaseController
82 84
83 $model->file->saveAs($model->file_path); 85 $model->file->saveAs($model->file_path);
84 //запускаем парсинг 86 //запускаем парсинг
85 - // доп. опции для парсера - удаление префикса в артикулах  
86 - $options['mode'] = 'crosses';  
87 - $fields = [];  
88 - if ($model->delete_prefix1) {  
89 - $fields[] = 'ARTICLE';  
90 - }  
91 - if ($model->delete_prefix2) {  
92 - $fields[] = 'CROSS_ARTICLE'; 87 + $data = $model->readFile();
  88 + // сохраняем в кеш отпарсенные даные
  89 + Yii::$app->getCache()->set('parser_data', json_encode($data), 1800);
  90 + // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
  91 + Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800);
  92 +
  93 +
  94 +// // доп. опции для парсера - удаление префикса в артикулах
  95 +// $options['mode'] = 'crosses';
  96 +// $fields = [];
  97 +// if ($model->delete_prefix1) {
  98 +// $fields[] = 'ARTICLE';
  99 +// }
  100 +// if ($model->delete_prefix2) {
  101 +// $fields[] = 'CROSS_ARTICLE';
  102 +// }
  103 +// if ( $fields ) {
  104 +// $options [ 'converter_conf' ] = [ 'configuration' => [ "article" => $fields ,
  105 +// "string" => ['ARTICLE', 'CROSS_ARTICLE'],] ];
  106 +// } else {
  107 +// $options [ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'], ] ];
  108 +// }
  109 +//
  110 +// $data = $model->readFile( $options );
  111 +// $crosses_model = new DetailsCrosses();
  112 +// $crosses_model->ManualInsertWithIgnore( $data );
  113 +//
  114 +// Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен');
  115 +// return $this->render('index', ['model' => $model]);
  116 +// }else{
  117 +// // не прошла валидация форма загрузки файлов
  118 +// $errors_str = '';
  119 +// foreach ($model->getErrors() as $error) {
  120 +// $errors_str .= implode( array_values($error) );
  121 +// }
  122 +// throw new \ErrorException( $errors_str );
  123 +// }
  124 +
  125 +
  126 + } else if (Yii::$app->getCache()->get('parser_data')) {
  127 +
  128 + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
  129 +
  130 + }
  131 + $provider = new ArrayDataProvider([
  132 + 'allModels' => $data,
  133 + 'pagination' => [
  134 + 'pageSize' => 10,
  135 + ],
  136 + ]);
  137 +
  138 + // создадим модель на столько реквизитов сколько колонок в отпарсенном файле
  139 + $last_index = end(array_flip($data[0]));
  140 + $header_counts = $last_index + 1;
  141 + $header_model = DynamicFormHelper::CreateDynamicModel($header_counts);
  142 +
  143 + // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список)
  144 + $basicColumns = $this->getBasicColumns();
  145 +
  146 + return $this->render('results',
  147 + ['model' => $data,
  148 + 'header_model' => $header_model,
  149 + // список колонок для выбора
  150 + 'basic_column' => $basicColumns,
  151 + 'dataProvider' => $provider]);
  152 + }
  153 + }
  154 +
  155 +
  156 +
  157 + public function actionWrite()
  158 + {
  159 + //получим колонки которые выбрал пользователь
  160 + $arr_attributes = Yii::$app->request->post()['DynamicModel'];
  161 + //соберем модель по полученным данным
  162 + $model = DynamicFormHelper::CreateDynamicModel($arr_attributes);
  163 + //добавим правила валидации (колонки должны быть те что в модели)
  164 + foreach ($arr_attributes as $key => $value) {
  165 + $model->addRule($key, 'in', [ 'range' => $this->getBasicColumns() ]);
  166 + }
  167 +
  168 + // провалидируем выбранные колонки
  169 + if ($model->validate()) {
  170 +
  171 + // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы
  172 + $arr = $model->toArray();
  173 +
  174 + // получим данные из кеша
  175 + if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) {
  176 + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);
  177 + $configuration = unserialize(Yii::$app->getCache()->get('parser_configuration'));
  178 + } else {
  179 + throw new \ErrorException('Ошибка кеша');
  180 + }
  181 +
  182 + array_walk($arr, function (&$val) {
  183 + $val = '!' . $val;
  184 + });
  185 +
  186 + // соотнесем отпарсенные данные с соответствием полученным от пользователя
  187 + // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
  188 + $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_');
  189 +
  190 + // в первой строке у нас заголовки - уберем
  191 + unset($data[0]);
  192 + // подготовим данные для записи в таблицу w_margins_groups
  193 + $arr_values = [];
  194 + $group = '';
  195 + $importer_id = $configuration['importer_id'];
  196 + foreach ($data as $row_data) {
  197 +
  198 + if (isset($row_data['!group'])) {
  199 + $group = $row_data['!group'];
  200 + unset($row_data['!group']);
93 } 201 }
94 - if ( $fields ) {  
95 - $options [ 'converter_conf' ] = [ 'configuration' => [ "article" => $fields ,  
96 - "string" => ['ARTICLE', 'CROSS_ARTICLE'],] ];  
97 - } else {  
98 - $options [ 'converter_conf' ] = [ 'configuration' => [ "string" => ['ARTICLE', 'CROSS_ARTICLE'], ] ]; 202 + if (isset($row_data['!_null'])) {
  203 + unset($row_data['!_null']);
99 } 204 }
100 205
101 - $data = $model->readFile( $options );  
102 - $crosses_model = new DetailsCrosses();  
103 - $crosses_model->ManualInsertWithIgnore( $data );  
104 -  
105 - Yii::$app->session->setFlash('success', 'Файл кроссов успешно загружен');  
106 - return $this->render('index', ['model' => $model]);  
107 - }else{  
108 - // не прошла валидация форма загрузки файлов  
109 - $errors_str = '';  
110 - foreach ($model->getErrors() as $error) {  
111 - $errors_str .= implode( array_values($error) ); 206 + foreach ($row_data as $key => $value) {
  207 + if ($group)
  208 + $row['group'] = trim($group);
  209 +
  210 + $row['importer_id'] = trim($importer_id);
  211 + $row['margin_id'] = ltrim($key, '!');
  212 + $row['koef'] = \Yii::$app->converter->convertTo('float', $value, ['precision' => 6]);
  213 +
  214 +
  215 + $arr_values[] = $row;
  216 +
112 } 217 }
113 - throw new \ErrorException( $errors_str ); 218 +
114 } 219 }
  220 + // сохраним подготовленные данные
  221 + MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] );
115 222
  223 +
  224 + Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен");
  225 + // все прошло успешно - очищаем кеш
  226 + Yii::$app->getCache()->delete('parser_data');
  227 + Yii::$app->getCache()->delete('parser_configuration');
  228 +
  229 + if (file_exists($configuration['file_path']))
  230 + unlink($configuration['file_path']);
  231 +
  232 + return $this->render('index', ['model' => $configuration]);
  233 +
  234 + }
  235 +
  236 + }
  237 +
  238 + protected function getBasicColumns(){
  239 +
  240 + $basicColumns_array = Yii::$app->multiparser->getConfiguration( 'csv','crosses' );
  241 + if ( isset( $basicColumns_array['basic_column'] ) ) {
  242 + return $basicColumns_array['basic_column'];
116 } else { 243 } else {
117 - throw new \ErrorException( 'Ошибка загрузки данных' ); 244 + throw new \ErrorException( 'Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.' );
118 } 245 }
  246 +
119 } 247 }
120 } 248 }
121 \ No newline at end of file 249 \ No newline at end of file
backend/controllers/ParserController.php
@@ -127,9 +127,9 @@ class ParserController extends BaseController @@ -127,9 +127,9 @@ class ParserController extends BaseController
127 127
128 $data = $model->readFile( $options ); 128 $data = $model->readFile( $options );
129 // сохраняем в кеш отпарсенные даные 129 // сохраняем в кеш отпарсенные даные
130 - Yii::$app->getCache()->set('parser_data', json_encode($data)); 130 + Yii::$app->getCache()->set('parser_data', json_encode($data), 1800);
131 // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных 131 // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
132 - Yii::$app->getCache()->set('parser_configuration', serialize($model)); 132 + Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800);
133 133
134 } else { 134 } else {
135 // не прошла валидация форма загрузки файлов 135 // не прошла валидация форма загрузки файлов
backend/controllers/RgGrupController.php
@@ -78,9 +78,9 @@ class RgGrupController extends BaseController @@ -78,9 +78,9 @@ class RgGrupController extends BaseController
78 //запускаем парсинг 78 //запускаем парсинг
79 $data = $model->readFile(); 79 $data = $model->readFile();
80 // сохраняем в кеш отпарсенные даные 80 // сохраняем в кеш отпарсенные даные
81 - Yii::$app->getCache()->set('parser_data', json_encode($data)); 81 + Yii::$app->getCache()->set('parser_data', json_encode($data), 1800);
82 // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных 82 // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных
83 - Yii::$app->getCache()->set('parser_configuration', serialize($model)); 83 + Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800);
84 84
85 85
86 } else { 86 } else {
backend/views/crossing-upload/results.php 0 → 100644
  1 +<?php
  2 +
  3 +use yii\helpers\Html;
  4 +use yii\multiparser\DynamicFormHelper;
  5 +use yii\widgets\ActiveForm;
  6 +
  7 +
  8 +/* @var $this yii\web\View */
  9 +/* @var $searchModel backend\models\CatalogSearch */
  10 +/* @var $dataProvider yii\data\ActiveDataProvider */
  11 +
  12 +$this->title = 'Отпарсенные данные файла';
  13 +$this->params['breadcrumbs'][] = $this->title;
  14 +?>
  15 +<div class="catalog-index">
  16 +
  17 + <h1><?= Html::encode($this->title) ?></h1>
  18 + <?php // echo $this->render('_search', ['model' => $searchModel]);
  19 +
  20 +
  21 + $form = ActiveForm::begin(['action' => 'write']);
  22 + ?>
  23 + <?= DynamicFormHelper::CreateGridWithDropDownListHeader( $dataProvider, $form, $header_model, $basic_column )?>
  24 +
  25 + <div class="form-group">
  26 + <?= Html::submitButton(Yii::t('app', 'Записать в БД'), ['class' => 'btn btn-primary']) ?>
  27 + </div>
  28 +
  29 + <?php ActiveForm::end() ?>
  30 + <?= Html::a('Вернуться', ['crossing-upload/index'], ['class' => 'btn btn-primary', 'name' => 'Return',]) ?>
  31 +
  32 +</div>
0 \ No newline at end of file 33 \ No newline at end of file
common/components/parsers/config.php
@@ -46,7 +46,15 @@ @@ -46,7 +46,15 @@
46 "brand" => ['BRAND', 'CROSS_BRAND'], 46 "brand" => ['BRAND', 'CROSS_BRAND'],
47 "crosses" => [], 47 "crosses" => [],
48 ] 48 ]
49 - ],], 49 + ],
  50 + 'basic_column' => [
  51 + Null => 'Пусто',
  52 + "ARTICLE"=> 'Артикул',
  53 + "CROSS_ARTICLE" => 'Кросс артикул',
  54 + "BRAND" => 'Бренд',
  55 + "CROSS_BRAND" => 'Кросс бренд'
  56 + ],
  57 + ],
50 ], 58 ],
51 'xml' => 59 'xml' =>
52 ['console' => 60 ['console' =>