Commit 22fcf59f959ce88426fe140a8355c9b4ea203414
1 parent
72d4becb
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 | |
| 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' => | ... | ... |