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  
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,178 +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' ] );
  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 249 \ 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' =>
... ...