Compare View
Commits (4)
Showing
5 changed files
Show diff stats
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 { | ... | ... |
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' => | ... | ... |