Commit 99ab22f3a43423b4d01563588cedd5dc15cbc81c
1 parent
2df6295d
fixed convert to assoc array for xml parser
Showing
4 changed files
with
101 additions
and
35 deletions
Show diff stats
backend/controllers/ParserController.php
| ... | ... | @@ -263,17 +263,66 @@ class ParserController extends BaseController |
| 263 | 263 | |
| 264 | 264 | public function actionLaunchCroneUploads () |
| 265 | 265 | { |
| 266 | - foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) { | |
| 266 | +// foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) { | |
| 267 | +// | |
| 268 | +// $file_name = basename($server_file,".csv"); | |
| 269 | +// // rename( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'); | |
| 270 | +// copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' ); | |
| 271 | +// | |
| 272 | +// } | |
| 273 | +// Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' ); | |
| 274 | +// $this->redirect('server-files'); | |
| 275 | + $this->actionParseXml(); | |
| 267 | 276 | |
| 268 | - $file_name = basename($server_file,".csv"); | |
| 269 | - // rename( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'); | |
| 270 | - copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' ); | |
| 277 | + } | |
| 278 | + | |
| 279 | + protected function parseFileConsole( $file_path, $configuration ){ | |
| 271 | 280 | |
| 281 | + if( !file_exists( $file_path ) ) | |
| 282 | + throw new ErrorException("$file_path - файл не найден!"); | |
| 283 | + | |
| 284 | + $parser_config = []; | |
| 285 | + if ( isset( $configuration['parser_config'] ) ) { | |
| 286 | + $parser_config = $configuration['parser_config']; | |
| 272 | 287 | } |
| 273 | - Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' ); | |
| 274 | - $this->redirect('server-files'); | |
| 275 | - } | |
| 288 | + $data = \Yii::$app->multiparser->parse( $file_path, $parser_config ); | |
| 289 | + if (! $data) { | |
| 290 | + // @todo переделать, что бы ошибка автоматически останавливала сценарий | |
| 291 | + return false; | |
| 292 | + } | |
| 293 | + | |
| 294 | + $writer = new PriceWriter(); | |
| 295 | + $writer->configuration = $configuration; | |
| 296 | + $writer->data = $data; | |
| 297 | + $writer->mode = 1; //console-режим | |
| 298 | + | |
| 299 | + if ( $writer->writeDataToDB() ){ | |
| 276 | 300 | |
| 301 | + return true; | |
| 302 | + } | |
| 303 | + | |
| 304 | + return false; | |
| 305 | + } | |
| 277 | 306 | |
| 307 | + public function actionParseXml () | |
| 308 | + { | |
| 309 | + // \Yii::info('Начало загрузки файлов прайсов xml','parser'); | |
| 310 | + foreach (glob( \Yii::getAlias('@auto_upload') . '/*.xml' ) as $file_path) { | |
| 311 | + $file_name = basename( $file_path,".xml" ); | |
| 312 | + // \Yii::info("Обработка файла - $file_path",'parser'); | |
| 313 | + | |
| 314 | + $config = ['record_id' => $file_name, | |
| 315 | + 'importer_id' => 1, | |
| 316 | + 'parser_config' => [ | |
| 317 | + 'mode' => 'console'] | |
| 318 | + ]; | |
| 319 | + if( $this->parseFileConsole( $file_path, $config ) ){ | |
| 320 | + unlink( \Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml' ); | |
| 321 | + // \Yii::info("Загрузка файла - $file_path успешно завершена",'parser'); | |
| 322 | + } else{ | |
| 323 | + // \Yii::error( "Загрузка файла - $file_path завершена с ошибкой", 'parser' ); | |
| 324 | + } | |
| 325 | + } | |
| 326 | + } | |
| 278 | 327 | |
| 279 | 328 | } | ... | ... |
common/components/parsers/CustomConverter.php
| ... | ... | @@ -11,39 +11,40 @@ class CustomConverter extends Converter { |
| 11 | 11 | * @param $key_array - ключи для вложенного массива |
| 12 | 12 | * @return array - таблица с проименованными колонками |
| 13 | 13 | */ |
| 14 | - public static function convertToAssocArray ( array $value_arr, array $key_array, $key_prefix = '') | |
| 14 | + public static function convertToAssocArray ( array $value_arr, array $key_array, $key_prefix = '' ) | |
| 15 | 15 | { |
| 16 | 16 | // очистка служебного префикса в массиве заголовков |
| 17 | 17 | if ($key_prefix) { |
| 18 | - $params_array = array_fill( 0, count($key_array), $key_prefix ); | |
| 19 | - //@todo переписать с использованием array_walk | |
| 20 | - $key_array = array_map( function ($value, $key_prefix){ return str_replace( $key_prefix, '',$value ); }, $key_array, $params_array ); | |
| 18 | + array_walk( $key_array, function ( &$value, $key, $key_prefix ){ return str_replace( $key_prefix, '',$value ); }, $key_prefix ); | |
| 21 | 19 | //уберем пустые элементы |
| 22 | 20 | $key_array = array_filter($key_array, function ($value){ return $value !==''; }); |
| 23 | 21 | } |
| 24 | 22 | |
| 25 | - // преобразуем массив ключей (обернем в массив), для передачи его в качестве параметра в анонимную функцию для array_map | |
| 26 | - // для этого увеличим размерность массива, что бы при каждом обходе массива $value_arr , функции был доступен исходный массив ключей | |
| 27 | - $key_array = array_fill( 0, count($value_arr), $key_array ); | |
| 28 | - // \common\components\CustomVarDamp::dumpAndDie($key_array); | |
| 29 | - $result = array_map( | |
| 30 | - function ($value, $key_array) { | |
| 23 | + $key_array = array_flip($key_array); | |
| 24 | +// \common\components\CustomVarDamp::dump($value_arr); | |
| 25 | +// \common\components\CustomVarDamp::dumpAndDie($key_array); | |
| 26 | + | |
| 27 | + array_walk( $value_arr, | |
| 28 | + function ( &$value, $key, $key_array) { | |
| 31 | 29 | $res = $value; |
| 32 | - foreach ($value as $key => $sub_value) { | |
| 33 | - if (isset($key_array[$key])) { | |
| 30 | + foreach ($res as $sub_key => $sub_value) { | |
| 31 | + if (isset($key_array[$sub_key])) { | |
| 34 | 32 | // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим |
| 35 | - $new_key = $key_array[$key]; | |
| 33 | + $new_key = $key_array[$sub_key]; | |
| 36 | 34 | if( !array_key_exists( $new_key , $res ) ){ |
| 37 | - $res[ $new_key ] = $res[$key]; | |
| 35 | + $res[ $new_key ] = $value[$sub_key]; | |
| 38 | 36 | } |
| 39 | 37 | } |
| 40 | - unset( $res[$key] ); | |
| 38 | + unset( $res[$sub_key] ); | |
| 39 | + $value = $res; | |
| 40 | + //\common\components\CustomVarDamp::dump($value); | |
| 41 | 41 | } |
| 42 | 42 | |
| 43 | - return $res; | |
| 43 | + //return $res; | |
| 44 | 44 | }, |
| 45 | - $value_arr, $key_array); | |
| 46 | - return $result; | |
| 45 | + $key_array); | |
| 46 | + | |
| 47 | + return $value_arr; | |
| 47 | 48 | } |
| 48 | 49 | |
| 49 | 50 | /** | ... | ... |
common/components/parsers/config.php
| ... | ... | @@ -33,18 +33,18 @@ |
| 33 | 33 | ], |
| 34 | 34 | ], |
| 35 | 35 | 'xml' => |
| 36 | - ['web' => | |
| 36 | + ['console' => | |
| 37 | 37 | ['class' => 'yii\multiparser\XmlParser', |
| 38 | 38 | 'node' => 'Товар',], |
| 39 | + 'basic_column' => [ | |
| 40 | + "BRAND" => 'Производитель', | |
| 41 | + "ARTICLE"=> 'Код', | |
| 42 | + "PRICE" => 'Розница', | |
| 43 | + "DESCR" => 'Наименование', | |
| 44 | + "BOX" => 'Колво', | |
| 45 | + "ADD_BOX"=> 'Ожидаемое', | |
| 46 | + "GROUP" => 'Группа' | |
| 47 | + ], | |
| 39 | 48 | ], |
| 40 | - 'basic_column' => [ | |
| 41 | - "BRAND" => 'Производитель', | |
| 42 | - "ARTICLE"=> 'Код', | |
| 43 | - "PRICE" => 'Розница', | |
| 44 | - "DESCR" => 'Наименование', | |
| 45 | - "BOX" => 'Колво', | |
| 46 | - "ADD_BOX"=> 'Ожидаемое', | |
| 47 | - "GROUP" => 'Группа' | |
| 48 | - ], | |
| 49 | 49 | ]; |
| 50 | 50 | ... | ... |
console/controllers/ParserController.php
| ... | ... | @@ -67,7 +67,23 @@ class ParserController extends Controller{ |
| 67 | 67 | |
| 68 | 68 | public function actionParseXml () |
| 69 | 69 | { |
| 70 | + \Yii::info('Начало загрузки файлов прайсов xml','parser'); | |
| 71 | + foreach (glob( \Yii::getAlias('@auto_upload') . '/*.xml' ) as $file_path) { | |
| 72 | + $file_name = basename( $file_path,".xml" ); | |
| 73 | + \Yii::info("Обработка файла - $file_path",'parser'); | |
| 70 | 74 | |
| 75 | + $config = ['record_id' => $file_name, | |
| 76 | + 'importer_id' => 1, | |
| 77 | + 'parser_config' => [ | |
| 78 | + 'mode' => 'console'] | |
| 79 | + ]; | |
| 80 | + if( $this->parseFileConsole( $file_path, $config ) ){ | |
| 81 | + unlink( \Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml' ); | |
| 82 | + \Yii::info("Загрузка файла - $file_path успешно завершена",'parser'); | |
| 83 | + } else{ | |
| 84 | + \Yii::error( "Загрузка файла - $file_path завершена с ошибкой", 'parser' ); | |
| 85 | + } | |
| 86 | + } | |
| 71 | 87 | } |
| 72 | 88 | |
| 73 | 89 | public function actionTest () | ... | ... |