Commit 59eedf0ca8e8b129884cb5cc250e53a6fe042798
1 parent
bbee8d34
add form result for crossing
Showing
2 changed files
with
162 additions
and
165 deletions
Show diff stats
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' => |