diff --git a/backend/controllers/ParserController.php b/backend/controllers/ParserController.php index 7868577..5c135b3 100644 --- a/backend/controllers/ParserController.php +++ b/backend/controllers/ParserController.php @@ -263,17 +263,66 @@ class ParserController extends BaseController public function actionLaunchCroneUploads () { - foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) { +// foreach (glob(Yii::getAlias('@temp_upload') . '/*.csv') as $server_file) { +// +// $file_name = basename($server_file,".csv"); +// // rename( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'); +// copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' ); +// +// } +// Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' ); +// $this->redirect('server-files'); + $this->actionParseXml(); - $file_name = basename($server_file,".csv"); - // rename( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'); - copy( $server_file, Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv' ); + } + + protected function parseFileConsole( $file_path, $configuration ){ + if( !file_exists( $file_path ) ) + throw new ErrorException("$file_path - файл не найден!"); + + $parser_config = []; + if ( isset( $configuration['parser_config'] ) ) { + $parser_config = $configuration['parser_config']; } - Yii::$app->session->setFlash( 'server-files', 'Файл успешно загружен' ); - $this->redirect('server-files'); - } + $data = \Yii::$app->multiparser->parse( $file_path, $parser_config ); + if (! $data) { + // @todo переделать, что бы ошибка автоматически останавливала сценарий + return false; + } + + $writer = new PriceWriter(); + $writer->configuration = $configuration; + $writer->data = $data; + $writer->mode = 1; //console-режим + + if ( $writer->writeDataToDB() ){ + return true; + } + + return false; + } + public function actionParseXml () + { + // \Yii::info('Начало загрузки файлов прайсов xml','parser'); + foreach (glob( \Yii::getAlias('@auto_upload') . '/*.xml' ) as $file_path) { + $file_name = basename( $file_path,".xml" ); + // \Yii::info("Обработка файла - $file_path",'parser'); + + $config = ['record_id' => $file_name, + 'importer_id' => 1, + 'parser_config' => [ + 'mode' => 'console'] + ]; + if( $this->parseFileConsole( $file_path, $config ) ){ + unlink( \Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml' ); + // \Yii::info("Загрузка файла - $file_path успешно завершена",'parser'); + } else{ + // \Yii::error( "Загрузка файла - $file_path завершена с ошибкой", 'parser' ); + } + } + } } diff --git a/common/components/parsers/CustomConverter.php b/common/components/parsers/CustomConverter.php index e377092..340215a 100644 --- a/common/components/parsers/CustomConverter.php +++ b/common/components/parsers/CustomConverter.php @@ -11,39 +11,40 @@ class CustomConverter extends Converter { * @param $key_array - ключи для вложенного массива * @return array - таблица с проименованными колонками */ - public static function convertToAssocArray ( array $value_arr, array $key_array, $key_prefix = '') + public static function convertToAssocArray ( array $value_arr, array $key_array, $key_prefix = '' ) { // очистка служебного префикса в массиве заголовков if ($key_prefix) { - $params_array = array_fill( 0, count($key_array), $key_prefix ); - //@todo переписать с использованием array_walk - $key_array = array_map( function ($value, $key_prefix){ return str_replace( $key_prefix, '',$value ); }, $key_array, $params_array ); + array_walk( $key_array, function ( &$value, $key, $key_prefix ){ return str_replace( $key_prefix, '',$value ); }, $key_prefix ); //уберем пустые элементы $key_array = array_filter($key_array, function ($value){ return $value !==''; }); } - // преобразуем массив ключей (обернем в массив), для передачи его в качестве параметра в анонимную функцию для array_map - // для этого увеличим размерность массива, что бы при каждом обходе массива $value_arr , функции был доступен исходный массив ключей - $key_array = array_fill( 0, count($value_arr), $key_array ); - // \common\components\CustomVarDamp::dumpAndDie($key_array); - $result = array_map( - function ($value, $key_array) { + $key_array = array_flip($key_array); +// \common\components\CustomVarDamp::dump($value_arr); +// \common\components\CustomVarDamp::dumpAndDie($key_array); + + array_walk( $value_arr, + function ( &$value, $key, $key_array) { $res = $value; - foreach ($value as $key => $sub_value) { - if (isset($key_array[$key])) { + foreach ($res as $sub_key => $sub_value) { + if (isset($key_array[$sub_key])) { // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим - $new_key = $key_array[$key]; + $new_key = $key_array[$sub_key]; if( !array_key_exists( $new_key , $res ) ){ - $res[ $new_key ] = $res[$key]; + $res[ $new_key ] = $value[$sub_key]; } } - unset( $res[$key] ); + unset( $res[$sub_key] ); + $value = $res; + //\common\components\CustomVarDamp::dump($value); } - return $res; + //return $res; }, - $value_arr, $key_array); - return $result; + $key_array); + + return $value_arr; } /** diff --git a/common/components/parsers/config.php b/common/components/parsers/config.php index bf0ffc5..8413de0 100644 --- a/common/components/parsers/config.php +++ b/common/components/parsers/config.php @@ -33,18 +33,18 @@ ], ], 'xml' => - ['web' => + ['console' => ['class' => 'yii\multiparser\XmlParser', 'node' => 'Товар',], + 'basic_column' => [ + "BRAND" => 'Производитель', + "ARTICLE"=> 'Код', + "PRICE" => 'Розница', + "DESCR" => 'Наименование', + "BOX" => 'Колво', + "ADD_BOX"=> 'Ожидаемое', + "GROUP" => 'Группа' + ], ], - 'basic_column' => [ - "BRAND" => 'Производитель', - "ARTICLE"=> 'Код', - "PRICE" => 'Розница', - "DESCR" => 'Наименование', - "BOX" => 'Колво', - "ADD_BOX"=> 'Ожидаемое', - "GROUP" => 'Группа' - ], ]; diff --git a/console/controllers/ParserController.php b/console/controllers/ParserController.php index 058e356..15f5301 100644 --- a/console/controllers/ParserController.php +++ b/console/controllers/ParserController.php @@ -67,7 +67,23 @@ class ParserController extends Controller{ public function actionParseXml () { + \Yii::info('Начало загрузки файлов прайсов xml','parser'); + foreach (glob( \Yii::getAlias('@auto_upload') . '/*.xml' ) as $file_path) { + $file_name = basename( $file_path,".xml" ); + \Yii::info("Обработка файла - $file_path",'parser'); + $config = ['record_id' => $file_name, + 'importer_id' => 1, + 'parser_config' => [ + 'mode' => 'console'] + ]; + if( $this->parseFileConsole( $file_path, $config ) ){ + unlink( \Yii::getAlias('@auto_upload') . '/' . $file_name . '.xml' ); + \Yii::info("Загрузка файла - $file_path успешно завершена",'parser'); + } else{ + \Yii::error( "Загрузка файла - $file_path завершена с ошибкой", 'parser' ); + } + } } public function actionTest () diff --git a/vendor/yiisoft/multiparser/XmlParser.php b/vendor/yiisoft/multiparser/XmlParser.php index d376a4a..0e6e2db 100644 --- a/vendor/yiisoft/multiparser/XmlParser.php +++ b/vendor/yiisoft/multiparser/XmlParser.php @@ -22,8 +22,9 @@ class XmlParser implements ParserInterface{ $result = $result[$this->node]; } - DynamicFormHelper::CreateAssocArray($result, \Yii::$app->multiparser->getConfiguration('xml','basic_column')); - \common\components\CustomVarDamp::dumpAndDie($result); + $result = \Yii::$app->multiparser->convertToAssocArray($result, \Yii::$app->multiparser->getConfiguration('xml','basic_column')); + // \common\components\CustomVarDamp::dumpAndDie($result); + return $result; } public function setup() -- libgit2 0.21.4