Commit 943f3ebe2d4b3337e31f232e78539c242633005c
1 parent
9ad78536
fixed convert to assoc array for xml parser
Showing
5 changed files
with
104 additions
and
37 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 () | ... | ... |
vendor/yiisoft/multiparser/XmlParser.php
... | ... | @@ -22,8 +22,9 @@ class XmlParser implements ParserInterface{ |
22 | 22 | $result = $result[$this->node]; |
23 | 23 | } |
24 | 24 | |
25 | - DynamicFormHelper::CreateAssocArray($result, \Yii::$app->multiparser->getConfiguration('xml','basic_column')); | |
26 | - \common\components\CustomVarDamp::dumpAndDie($result); | |
25 | + $result = \Yii::$app->multiparser->convertToAssocArray($result, \Yii::$app->multiparser->getConfiguration('xml','basic_column')); | |
26 | + // \common\components\CustomVarDamp::dumpAndDie($result); | |
27 | + return $result; | |
27 | 28 | } |
28 | 29 | |
29 | 30 | public function setup() | ... | ... |