Commit 943f3ebe2d4b3337e31f232e78539c242633005c

Authored by Mihail
1 parent 9ad78536

fixed convert to assoc array for xml parser

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()
... ...