Compare View

switch
from
...
to
 
Commits (4)
backend/controllers/CrossingUploadController.php
... ... @@ -10,10 +10,12 @@ namespace backend\controllers;
10 10  
11 11 use backend\components\base\BaseController;
12 12 use common\components\CustomVarDamp;
  13 +use yii\data\ArrayDataProvider;
13 14 use yii\filters\VerbFilter;
14 15 use yii\filters\AccessControl;
15 16 use backend\models\UploadFileCrossingForm;
16 17 use backend\models\DetailsCrosses;
  18 +use yii\multiparser\DynamicFormHelper;
17 19 use yii\web\UploadedFile;
18 20 use \Yii;
19 21  
... ... @@ -82,39 +84,165 @@ class CrossingUploadController extends BaseController
82 84  
83 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 243 } else {
117   - throw new \ErrorException( 'Ошибка загрузки данных' );
  244 + throw new \ErrorException( 'Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.' );
118 245 }
  246 +
119 247 }
120 248 }
121 249 \ No newline at end of file
... ...
backend/controllers/ParserController.php
... ... @@ -127,9 +127,9 @@ class ParserController extends BaseController
127 127  
128 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 134 } else {
135 135 // не прошла валидация форма загрузки файлов
... ...
backend/controllers/RgGrupController.php
... ... @@ -78,9 +78,9 @@ class RgGrupController extends BaseController
78 78 //запускаем парсинг
79 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 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 33 \ No newline at end of file
... ...
common/components/parsers/config.php
... ... @@ -46,7 +46,15 @@
46 46 "brand" => ['BRAND', 'CROSS_BRAND'],
47 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 59 'xml' =>
52 60 ['console' =>
... ...