Commit 59eedf0ca8e8b129884cb5cc250e53a6fe042798

Authored by Mihail
1 parent bbee8d34

add form result for crossing

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,178 +84,165 @@ class CrossingUploadController extends BaseController @@ -82,178 +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' ] );
  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]);
115 233
116 - } else {  
117 - throw new \ErrorException( 'Ошибка загрузки данных' );  
118 } 234 }
  235 +
119 } 236 }
120 237
  238 + protected function getBasicColumns(){
121 239
122 -// public function actionResults()  
123 -// {  
124 -// $model = new UploadFileRgForm();  
125 -// $data = [];  
126 -//  
127 -// if ($model->load(Yii::$app->request->post())) {  
128 -// $model->file = UploadedFile::getInstance($model, 'file');  
129 -// // первый проход - валидируем, сохраняем файл, ложим в кеш отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся)  
130 -// if ($model->validate()) {  
131 -//  
132 -// $model->file_path = Yii::getAlias('@manual_upload') . '/' . $model->file->name;  
133 -// $model->file->saveAs($model->file_path);  
134 -//  
135 -// //запускаем парсинг  
136 -// $data = $model->readFile();  
137 -// // сохраняем в кеш отпарсенные даные  
138 -// Yii::$app->getCache()->set('parser_data', json_encode($data), 1800);  
139 -// // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных  
140 -// Yii::$app->getCache()->set('parser_configuration', serialize($model), 1800);  
141 -//  
142 -//  
143 -// } else {  
144 -// // не прошла валидация форма загрузки файлов  
145 -// $errors_str = '';  
146 -// foreach ($model->getErrors() as $error) {  
147 -// $errors_str .= implode(array_values($error));  
148 -// }  
149 -// throw new \ErrorException($errors_str);  
150 -// }  
151 -// // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные  
152 -// } else if (Yii::$app->getCache()->get('parser_data')) {  
153 -//  
154 -// $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);  
155 -//  
156 -// }  
157 -// $provider = new ArrayDataProvider([  
158 -// 'allModels' => $data,  
159 -// 'pagination' => [  
160 -// 'pageSize' => 10,  
161 -// ],  
162 -// ]);  
163 -// // создадим модель на столько реквизитов сколько колонок в отпарсенном файле  
164 -// $last_index = end(array_flip($data[0]));  
165 -// $header_counts = $last_index + 1;  
166 -// $header_model = DynamicFormHelper::CreateDynamicModel($header_counts);  
167 -//  
168 -// // соберем массив данных из которых будет пользователь выбирать значения в конструкторе (выпадающий список)  
169 -// $header_array = Margins::getHeader();  
170 -//  
171 -// return $this->render('results',  
172 -// ['model' => $data,  
173 -// 'header_model' => $header_model,  
174 -// // список колонок для выбора  
175 -// 'basic_column' => $header_array,  
176 -// 'dataProvider' => $provider]);  
177 -// }  
178 -//  
179 -// public function actionWrite()  
180 -// {  
181 -// //получим колонки которые выбрал пользователь  
182 -// $arr_attributes = Yii::$app->request->post()['DynamicModel'];  
183 -// //соберем модель по полученным данным  
184 -// $model = DynamicFormHelper::CreateDynamicModel($arr_attributes);  
185 -// //добавим правила валидации (колонки должны быть те что в модели)  
186 -// foreach ($arr_attributes as $key => $value) {  
187 -// $model->addRule($key, 'in', ['range' => array_keys(Margins::getHeader())]);  
188 -// }  
189 -//  
190 -// // провалидируем выбранные колонки  
191 -// if ($model->validate()) {  
192 -//  
193 -// // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы  
194 -// $arr = $model->toArray();  
195 -//  
196 -// // получим данные из кеша  
197 -// if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) {  
198 -// $data = json_decode(Yii::$app->getCache()->get('parser_data'), true);  
199 -// $configuration = unserialize(Yii::$app->getCache()->get('parser_configuration'));  
200 -// } else {  
201 -// throw new \ErrorException('Ошибка кеша');  
202 -// }  
203 -//  
204 -// array_walk($arr, function (&$val) {  
205 -// $val = '!' . $val;  
206 -// });  
207 -//  
208 -// // соотнесем отпарсенные данные с соответсивем полученным от пользователя  
209 -// // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию  
210 -// $data = CustomArrayHelper::createAssocArray($data, $arr, 'attr_');  
211 -//  
212 -// // в первой строке у нас заголовки - уберем  
213 -// unset($data[0]);  
214 -// // подготовим данные для записи в таблицу w_margins_groups  
215 -// $arr_values = [];  
216 -// $group = '';  
217 -// $importer_id = $configuration['importer_id'];  
218 -// foreach ($data as $row_data) {  
219 -//  
220 -// if (isset($row_data['!group'])) {  
221 -// $group = $row_data['!group'];  
222 -// unset($row_data['!group']);  
223 -// }  
224 -// if (isset($row_data['!_null'])) {  
225 -// unset($row_data['!_null']);  
226 -// }  
227 -//  
228 -// foreach ($row_data as $key => $value) {  
229 -// if ($group)  
230 -// $row['group'] = trim($group);  
231 -//  
232 -// $row['importer_id'] = trim($importer_id);  
233 -// $row['margin_id'] = ltrim($key, '!');  
234 -// $row['koef'] = \Yii::$app->converter->convertTo('float', $value, ['precision' => 6]);  
235 -//  
236 -//  
237 -// $arr_values[] = $row;  
238 -//  
239 -// }  
240 -//  
241 -// }  
242 -// // сохраним подготовленные данные  
243 -// MarginsGroups::ManualInsertWithUpdate( $arr_values, [ 'group','importer_id','margin_id' ] );  
244 -//  
245 -//  
246 -// Yii::$app->session->setFlash('success', "Файл {$configuration['file']} успешно загружен");  
247 -// // все прошло успешно - очищаем кеш  
248 -// Yii::$app->getCache()->delete('parser_data');  
249 -// Yii::$app->getCache()->delete('parser_configuration');  
250 -//  
251 -// if (file_exists($configuration['file_path']))  
252 -// unlink($configuration['file_path']);  
253 -//  
254 -// return $this->render('index', ['model' => $configuration]);  
255 -//  
256 -// }  
257 -//  
258 -// } 240 + $basicColumns_array = Yii::$app->multiparser->getConfiguration( 'csv','crosses' );
  241 + if ( isset( $basicColumns_array['basic_column'] ) ) {
  242 + return $basicColumns_array['basic_column'];
  243 + } else {
  244 + throw new \ErrorException( 'Ошибка конфигурационного файла кроссов. Не указаны базовые колнки для пользовательской формы выбора.' );
  245 + }
  246 +
  247 + }
259 } 248 }
260 \ No newline at end of file 249 \ 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' =>