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