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,17 +263,66 @@ class ParserController extends BaseController | ||
263 | 263 | ||
264 | public function actionLaunchCroneUploads () | 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,39 +11,40 @@ class CustomConverter extends Converter { | ||
11 | * @param $key_array - ключи для вложенного массива | 11 | * @param $key_array - ключи для вложенного массива |
12 | * @return array - таблица с проименованными колонками | 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 | if ($key_prefix) { | 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 | $key_array = array_filter($key_array, function ($value){ return $value !==''; }); | 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 | $res = $value; | 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 | if( !array_key_exists( $new_key , $res ) ){ | 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,18 +33,18 @@ | ||
33 | ], | 33 | ], |
34 | ], | 34 | ], |
35 | 'xml' => | 35 | 'xml' => |
36 | - ['web' => | 36 | + ['console' => |
37 | ['class' => 'yii\multiparser\XmlParser', | 37 | ['class' => 'yii\multiparser\XmlParser', |
38 | 'node' => 'Товар',], | 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,7 +67,23 @@ class ParserController extends Controller{ | ||
67 | 67 | ||
68 | public function actionParseXml () | 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 | public function actionTest () | 89 | public function actionTest () |
vendor/yiisoft/multiparser/XmlParser.php
@@ -22,8 +22,9 @@ class XmlParser implements ParserInterface{ | @@ -22,8 +22,9 @@ class XmlParser implements ParserInterface{ | ||
22 | $result = $result[$this->node]; | 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 | public function setup() | 30 | public function setup() |