From 8894c93a4170eaa5022ae68411aa24e20e365ba6 Mon Sep 17 00:00:00 2001 From: Mihail Date: Fri, 18 Sep 2015 18:07:13 +0300 Subject: [PATCH] add Importers files AR, make write procedure to Details --- backend/components/parsers/CustomConverter.php | 20 +++++++++++++++++--- backend/components/parsers/CustomCsvParser.php | 20 ++++++++++++++------ backend/controllers/ParserController.php | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- backend/models/Details.php | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- backend/models/ImporterFiles.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ backend/models/UploadFileParsingForm.php | 10 ++++++---- backend/views/parser/index.php | 2 +- console/migrations/m150915_125129_addDetails.php | 70 +++++++++++++++++++++------------------------------------------------- vendor/yiisoft/multiparser/Converter.php | 19 ++++++++++--------- vendor/yiisoft/multiparser/CsvParser.php | 4 ++-- 10 files changed, 337 insertions(+), 107 deletions(-) create mode 100644 backend/models/ImporterFiles.php diff --git a/backend/components/parsers/CustomConverter.php b/backend/components/parsers/CustomConverter.php index 4f3de1b..1dc099d 100644 --- a/backend/components/parsers/CustomConverter.php +++ b/backend/components/parsers/CustomConverter.php @@ -11,15 +11,19 @@ class CustomConverter extends Converter { */ public static function convertToAssocArray ($value_arr, $key_array, $key_prefix = '') { + // очистка служебного префикса в массиве заголовков if ($key_prefix) { - $parametrs_array = array_fill( 0, count($key_array), $key_prefix ); - $key_array = array_map( function ($value, $key_prefix){ return str_replace( $key_prefix, '',$value ); }, $key_array, $parametrs_array ); + $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 ); + //уберем пустые элементы + $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); + // \common\components\CustomVarDamp::dumpAndDie($key_array); $result = array_map( function ($value, $key_array) { $res = $value; @@ -40,4 +44,14 @@ class CustomConverter extends Converter { return $result; } + public function addColumn ($value_arr, $add_key, $add_value) + { + $i = 0; + while ($i < count($value_arr)) { + $value_arr[$i][$add_key] = $add_value; + $i++; + } + + return $value_arr; + } } \ No newline at end of file diff --git a/backend/components/parsers/CustomCsvParser.php b/backend/components/parsers/CustomCsvParser.php index d58fe83..50c4f75 100644 --- a/backend/components/parsers/CustomCsvParser.php +++ b/backend/components/parsers/CustomCsvParser.php @@ -11,24 +11,32 @@ namespace backend\components\parsers; class CustomCsvParser extends \yii\multiparser\CsvParser { - public $last_line = 10; + public $last_line = 20; //public $hasHeaderRow = true; // public $keys = ['first','second', 'third', 'forth', 'fifth']; public function setupConverter() { - if ( count($this->converter_conf) ) { - + if (!count($this->converter_conf)) { if ($this->hasHeaderRow) { // если у файла есть заголовок, то в результате имеем ассоциативный массив $this->converter_conf['hasKey'] = 1; } - $this->converter = \Yii::createObject($this->converter_conf); - } - } + /** + * @param $arr + * @return mixed + * преобразовует значения прочитанного массива в нужные типы, согласно конфигурации конвертера + */ + protected function convert($arr) + { + $result = \Yii::$app->multiparser->convertByConfiguration( $arr, $this->converter_conf ); + + return $result; + + } } \ No newline at end of file diff --git a/backend/controllers/ParserController.php b/backend/controllers/ParserController.php index 6563c8c..1f8fc9f 100644 --- a/backend/controllers/ParserController.php +++ b/backend/controllers/ParserController.php @@ -10,16 +10,19 @@ use yii\web\UploadedFile; use yii\data\ArrayDataProvider; use yii\multiparser\DynamicFormHelper; use backend\components\parsers\CustomParserConfigurator; +use backend\models\Details; +use backend\models\ImporterFiles; +use yii\base\ErrorException; use common\components\CustomVarDamp; /** * Parser controller */ - class ParserController extends BaseController { public $layout = "/column"; + /** * @inheritdoc */ @@ -30,7 +33,7 @@ class ParserController extends BaseController 'class' => AccessControl::className(), 'rules' => [ [ - 'actions' => ['index','results','write'], + 'actions' => ['index', 'results', 'write'], 'allow' => true, 'roles' => ['@'], ], @@ -58,7 +61,6 @@ class ParserController extends BaseController } - public function actionIndex() { $model = new UploadFileParsingForm(); @@ -66,26 +68,31 @@ class ParserController extends BaseController return $this->render('index', ['model' => $model]); } - public function actionResults(){ + public function actionResults() + { $model = new UploadFileParsingForm(); $data = []; if ($model->load(Yii::$app->request->post())) { $model->file = UploadedFile::getInstance($model, 'file'); - + // первый проход - валидируем, сохраняем файл, ложим в кеш отпарсенные данные и параметры модели (потом при записи в базу данных они пригодятся) if ($model->validate()) { $filePath = Yii::getAlias('@webroot') . '/uploads/' . $model->file->baseName . '.' . $model->file->extension; - $model->file->saveAs( $filePath ); + $model->file->saveAs($filePath); + //запускаем парсинг $data = $model->readFile($filePath); + // сохраняем в кеш отпарсенные даные + Yii::$app->getCache()->set('parser_data', json_encode($data)); + // сохраняем в кеш модель - в ней настройки для дальнейшей обработки данных + Yii::$app->getCache()->set('parser_configuration', serialize($model)); - Yii::$app->getCache()->set( 'parser_data', json_encode($data) ); } + // листаем пагинатором, или повторно вызываем - считываем из кеша отпрасенные данные + } else if (Yii::$app->getCache()->get('parser_data')) { - } else if( Yii::$app->getCache()->get( 'parser_data' )) { - - $data = json_decode( Yii::$app->getCache()->get( 'parser_data' ),true ); + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); } @@ -96,40 +103,99 @@ class ParserController extends BaseController ], ]); - //CustomVarDamp::dumpAndDie($data); - $header_model = DynamicFormHelper::CreateDynamicModel( count( $data[0] ) ); + //формируем заголовок для пользователя, где он сможет выбрать соответсвие полей (выпадающий список) + $header_model = DynamicFormHelper::CreateDynamicModel(count($data[0])); - // CustomVarDamp::dumpAndDie(Yii::$app->multiparser->getConfiguration('csv','basic_column')); return $this->render('results', ['model' => $data, 'header_model' => $header_model, - 'basic_column' => Yii::$app->multiparser->getConfiguration('csv','basic_column'), + // список колонок для выбора + 'basic_column' => Yii::$app->multiparser->getConfiguration('csv', 'basic_column'), 'dataProvider' => $provider]); } -public function actionWrite() -{ - //CustomVarDamp::dumpAndDie(Yii::$app->request->post()); + public function actionWrite() + { - $arr_attributes = Yii::$app->request->post()['DynamicModel']; - $model = DynamicFormHelper::CreateDynamicModel( $arr_attributes ); - foreach ($arr_attributes as $key => $value) { - $model->addRule($key, 'in', ['range' => array_keys( Yii::$app->multiparser->getConfiguration('csv','basic_column') )]); - } + //получим колонки которые выбрал пользователь + $arr_attributes = Yii::$app->request->post()['DynamicModel']; + //соберем модель по полученным данным + $model = DynamicFormHelper::CreateDynamicModel($arr_attributes); + //добавим правила валидации (колонки должны быть те что указаны в конфиге) + foreach ($arr_attributes as $key => $value) { + $model->addRule($key, 'in', ['range' => array_keys(Yii::$app->multiparser->getConfiguration('csv', 'basic_column'))]); + } + // провалидируем выбранные колонки + if ($model->validate()) { - //CustomVarDamp::dumpAndDie($model); - if ($model->validate()) { - $arr = $model->toArray(); - $data = json_decode( Yii::$app->getCache()->get( 'parser_data' ),true ); + // валидация успешна у нас есть соответсвие колонок, преобразуем в массив данное соответсвие для дальнейшей работы + $arr = $model->toArray(); - $data = \Yii::$app->multiparser->convertToAssocArray( $data, $arr, 'attr_' ); - $data[1]['BOX'] = \Yii::$app->multiparser->convertToFloat( $data[1]['BOX'] ); - CustomVarDamp::dumpAndDie($data); - } + // получим данные из кеша + if (Yii::$app->getCache()->get('parser_data') && Yii::$app->getCache()->get('parser_configuration')) { + $data = json_decode(Yii::$app->getCache()->get('parser_data'), true); + $configuration = unserialize(Yii::$app->getCache()->get('parser_configuration')); + } else { + CustomVarDamp::dumpAndDie('Ошибка кеша'); + } + // соотнесем отпарсенные данные с соответсивем полученным от пользователя + // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию + $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr, 'attr_'); + + + // запишем дату старта в таблицу файлов поставщика (ImportersFiles) + $files_model = new ImporterFiles(); + // id поставщика получим из конфигурации + $files_model->load(['ImporterFiles' => $configuration->toArray()]); + if ($files_model->validate()) { + try { + $files_model->save(); + } catch (ErrorException $e) { + CustomVarDamp::dump($e->getMessage()); + } + + + // запишем полученные данные в таблицу товаров (Details) + $details_model = new Details('web'); + // проверим все ли обязательные колонки были указаны пользователем + $details_model->load(['Details' => $data[0]]); + if ($details_model->validate()) { + // проставим импортера + $data = $details_model->prepareData($data, $configuration); + + try { + // попытаемся вставить данные в БД с апдейтом по ключам + $details_model->save($data); + + // а также зафиксируем дату конца загрузки + $files_model->time_end = mktime(); // ошибка!!!!!!!!!!!!!!!! + $files_model->save(); + + // все прошло успешно - очищаем кеш + Yii::$app->getCache()->delete('parser_data'); + Yii::$app->getCache()->delete('parser_configuration'); + + CustomVarDamp::dumpAndDie('!!!'); + } catch (ErrorException $e) { + CustomVarDamp::dump($e->getMessage()); + } + } + if ($details_model->hasErrors()) { + $errors_arr = $details_model->getErrors(); + foreach ($errors_arr as $error) { + CustomVarDamp::dump(array_values($error)); + } + + } -} + } + + + } + + } } diff --git a/backend/models/Details.php b/backend/models/Details.php index f840698..1eca6e7 100644 --- a/backend/models/Details.php +++ b/backend/models/Details.php @@ -9,11 +9,127 @@ namespace backend\models; use yii\base\Model; +use Yii; class Details extends Model{ + const KEY_COLUMN = ['IMPORT_ID','BRAND','ARTICLE']; + const BATCH = 500; - public function save ($arr_value) + private $mode; + + // обязательные поля модели + public $BRAND; + public $ARTICLE; + public $PRICE; + public $BOX; + + function __construct($mode) + { + $this->mode = $mode; + } + + public function rules() + { + return [ + [['BRAND','ARTICLE', 'PRICE', 'BOX'], 'required' ], + ]; + } + + public function formName() + { + return 'Details'; + } + + + public static function tableName() + { + return '{{%details}}'; + } + + //@todo вероятно этой функции не место здесь + public function prepareData ( $data, $configuration ) + { + if ( isset($configuration['importer_id']) && $configuration['importer_id']) { + $data = \Yii::$app->multiparser->addColumn( $data, 'IMPORT_ID', $configuration['importer_id'] ); + } + // \common\components\CustomVarDamp::dumpAndDie($data); + return $data; + } + + /** + * @param $data - двумерный массив данных для записи в таблицу details + * @throws \yii\db\Exception + * вставляет записи с апдейтом при дубляже ключей + */ + public function save ($data) { + $table_name = self::tableName(); + $keys_arr = array_keys( $data[0] ); + // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить + $fields_arr_to_update = array_diff( $keys_arr, $this::KEY_COLUMN ); + + $query_update = ' on duplicate key update '; + foreach ($fields_arr_to_update as $field) { + $query_update .= "{$field} = values ({$field}),"; + } + // удалим последнюю запятую + $query_update = substr($query_update, 0, strlen($query_update) - 1); + + // запросы будем выполнять пакетами + // размер пакета установлен в константе + // разобъем массив на пакеты и будем их проходить + $data = array_chunk($data, $this::BATCH ); + foreach( $data as $current_batch_array ){ + + //воспользуемся пакетной вставкой от фреймворка, плюс сразу с экранированием и защитой от инъекций + $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; + // добавим фрагмент с апдейтом при дубляже + $query = "{$query_insert} {$query_update}"; + + $res = Yii::$app->db->createCommand($query)->execute(); + + } } -} \ No newline at end of file +} + +// + +//$q = " INSERT INTO {$table_name} ({$keys_string}) VALUES ("; + +//$q .= " on duplicate key update `FULL_ARTICLE` = values (`FULL_ARTICLE`), +// `PRICE` = values (`PRICE`), +// `DESCR` = values(`DESCR`), +// `BOX` = values(`BOX`), +// `ADD_BOX` = values(`ADD_BOX`), +// `GROUP` = values(`GROUP`);"; + +// INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) +// ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b); + + + +//INSERT INTO `books` (`UserId`, `BookId`, `Count`) VALUES (13, 1001, 3) +//ON DUPLICATE KEY UPDATE `Count` = `Count` + VALUES(`Count`); + +//$values_string = ''; +//$keys_arr = array_keys( $data[0] ); +//$keys_string = implode( ',', $keys_arr); +//$table_name = self::tableName(); +//$current_batch = 0; +//for ($i = $current_batch; $i < $this::BATCH AND $i < count($data); $i++) { +// $values_string .= '(' . implode( ',', $data[$i]) . '),'; +//} +// for ($current_batch = $this::BATCH; $current_batchdb->createCommand()->batchInsert($table_name, $keys_arr, $data)->sql; +//$query = "{$query_insert} on duplicate key update `PRICE` = values (`PRICE`),`DESCR` = values(`DESCR`),`BOX` = values(`BOX`)"; +//$res = Yii::$app->db->createCommand($query)->execute(); + + + +// Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $data)->sql execute(); \ No newline at end of file diff --git a/backend/models/ImporterFiles.php b/backend/models/ImporterFiles.php new file mode 100644 index 0000000..e4d01fd --- /dev/null +++ b/backend/models/ImporterFiles.php @@ -0,0 +1,51 @@ + Yii::t('app', 'ID'), + 'importer_id' => Yii::t('app', 'Importer ID'), + 'upload_time' => Yii::t('app', 'Upload Time'), + 'time_start' => Yii::t('app', 'Time Start'), + 'time_end' => Yii::t('app', 'Time End'), + ]; + } +} diff --git a/backend/models/UploadFileParsingForm.php b/backend/models/UploadFileParsingForm.php index ef94bc4..9b50b92 100644 --- a/backend/models/UploadFileParsingForm.php +++ b/backend/models/UploadFileParsingForm.php @@ -15,7 +15,7 @@ class UploadFileParsingForm extends Model * @var UploadedFile file attribute */ public $file; - public $importer; + public $importer_id; public $action; public $delimiter; public $delete_price; @@ -27,12 +27,12 @@ class UploadFileParsingForm extends Model public function rules() { return [ - ['importer', 'required', 'message' => 'Не указан поставщик!' ], + ['importer_id', 'required', 'message' => 'Не указан поставщик!' ], ['file', 'required', 'message' => 'Не выбран файл!' ], //@todo - not working this file validator!!! - fixed [['file'], 'file'],// 'extensions' => ['csv', 'xml'] ], // 'wrongMimeType' => 'Указан неподдерживаемый тип файла. Можно выбирать csv, xml файлы.' ], - ['importer', 'integer','max' => 999999, 'min' => 0 ], + ['importer_id', 'integer','max' => 999999, 'min' => 0 ], [['action','delete_prefix', 'delete_price'], 'boolean'], ['delimiter', 'string', 'max' => 1], ['delimiter', 'default', 'value' => ';'] @@ -44,7 +44,7 @@ class UploadFileParsingForm extends Model { return [ 'file' => Yii::t('app', 'Источник'), - 'importer' => Yii::t('app', 'Поставщик'), + 'importer_id' => Yii::t('app', 'Поставщик'), 'delimiter' => Yii::t('app', 'Разделитель'), ]; } @@ -55,6 +55,8 @@ class UploadFileParsingForm extends Model if( !is_array($data) ){ $data = ['No results']; } + return $data; } + } \ No newline at end of file diff --git a/backend/views/parser/index.php b/backend/views/parser/index.php index b630fe8..c587aa7 100644 --- a/backend/views/parser/index.php +++ b/backend/views/parser/index.php @@ -15,7 +15,7 @@ use yii\helpers\ArrayHelper;

Загрузка прайсов поставщиков

- field($model, 'importer')->dropDownList(ArrayHelper::map( Importer::find()->all(), 'id','name' )); ?> + field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importer::find()->all(), 'id','name' )); ?> field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']) ?> field($model, 'file')->fileInput()->label(false) ?> field($model, 'action')->radioList([1 => 'Стандартная обработка', 0 => 'С разделителем'])->label(false) ?> diff --git a/console/migrations/m150915_125129_addDetails.php b/console/migrations/m150915_125129_addDetails.php index d7a6604..d8d5419 100644 --- a/console/migrations/m150915_125129_addDetails.php +++ b/console/migrations/m150915_125129_addDetails.php @@ -7,45 +7,27 @@ class m150915_125129_addDetails extends Migration { public function up() { - $tableOptions = null; - if ($this->db->driverName === 'mysql') { - $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; - } - - $this->createTable('{{%details}}', [ - 'ID' => 'int(10) UNSIGNED NOT NULL', - 'IMPORT_ID' => 'int(6) unsigned NOT NULL', - 'BRAND' => 'varchar(100) NOT NULL', - 'ARTICLE' => 'varchar(100) NOT NULL', - 'FULL_ARTICLE' => 'varchar(150) NOT NULL', - 'PRICE' => 'float(15,2) unsigned NOT NULL', - 'DESCR' => 'varchar(200) NOT NULL', - 'BOX' => 'int(6) unsigned NOT NULL', - 'ADD_BOX' => 'int(6) unsigned NOT NULL DEFAULT 0', - 'GROUP' => 'varchar(200) NOT NULL', - 'timestamp' => 'timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP',], $tableOptions); - - //$this->dropPrimaryKey('ID','{{%details}}'); - $this->createIndex('ID_delete', '{{%details}}', 'ID', true); - $this->execute('ALTER TABLE details - CHANGE COLUMN ID ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT'); - $this->addPrimaryKey('importer_id', '{{%details}}', 'import_id, brand, ARTICLE'); - $this->createIndex('timestamp', '{{%details}}', 'timestamp', false); - $this->createIndex('ARTICLE', '{{%details}}', 'ARTICLE', 'BRAND', 'ADD_BOX', false); - $this->createIndex('IMPORT_ID', '{{%details}}', 'ARTICLE', false); - $this->createIndex('IMPORT_ID_2', '{{%details}}', 'IMPORT_ID', 'timestamp', false); - - - - -// PRIMARY KEY ('ARTICLE','BRAND','IMPORT_ID'), -// UNIQUE KEY 'ID_delete' ('ID'), -// KEY 'timestamp' ('timestamp'), -// KEY 'ARTICLE' ('ARTICLE','BRAND','BOX'), -// KEY 'BRAND' ('BRAND','ARTICLE'), -// KEY 'ARTICLE_2' ('ARTICLE','BRAND','ADD_BOX'), -// KEY 'IMPORT_ID' ('IMPORT_ID','ARTICLE'), -// KEY 'IMPORT_ID_2' ('IMPORT_ID','timestamp + $this->execute('CREATE TABLE `details` ( + `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, + `IMPORT_ID` int(6) unsigned NOT NULL, + `BRAND` varchar(100) NOT NULL, + `ARTICLE` varchar(100) NOT NULL, + `FULL_ARTICLE` varchar(150) NOT NULL, + `PRICE` float(15,2) unsigned NOT NULL, + `DESCR` varchar(200) NOT NULL, + `BOX` int(6) unsigned NOT NULL, + `ADD_BOX` int(6) unsigned NOT NULL DEFAULT 0, + `GROUP` varchar(200) NOT NULL DEFAULT \'\', + `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`ARTICLE`,`BRAND`,`IMPORT_ID`), + UNIQUE KEY `ID_delete` (`ID`), + KEY `timestamp` (`timestamp`), + KEY `ARTICLE` (`ARTICLE`,`BRAND`,`BOX`), + KEY `BRAND` (`BRAND`,`ARTICLE`), + KEY `ARTICLE_2` (`ARTICLE`,`BRAND`,`ADD_BOX`), + KEY `IMPORT_ID` (`IMPORT_ID`,`ARTICLE`), + KEY `IMPORT_ID_2` (`IMPORT_ID`,`timestamp`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8'); } @@ -55,14 +37,4 @@ class m150915_125129_addDetails extends Migration } - /* - // Use safeUp/safeDown to run migration code within a transaction - public function safeUp() - { - } - - public function safeDown() - { - } - */ } diff --git a/vendor/yiisoft/multiparser/Converter.php b/vendor/yiisoft/multiparser/Converter.php index 73b8178..eda4887 100644 --- a/vendor/yiisoft/multiparser/Converter.php +++ b/vendor/yiisoft/multiparser/Converter.php @@ -15,9 +15,9 @@ class Converter extends Behavior const METHOD_PREFIX = 'convertTo'; - public $configuration = []; + //public $configuration = []; - protected static function convertToFloat($value) + public static function convertToFloat($value) { echo 1; if ($value == '') { @@ -34,7 +34,7 @@ class Converter extends Behavior return $value; } - protected static function convertToInteger($value) + public static function convertToInteger($value) { if ($value == '') { $value = 0; @@ -49,7 +49,7 @@ class Converter extends Behavior return $value; } - protected static function convertToString($value) + public static function convertToString($value) { @@ -93,16 +93,17 @@ class Converter extends Behavior /** - * @param $arr - массив + * @param $arr - массив для конвертирования + * @param $configuration - массив конфигурация конвертирования * @return mixed * конвертирует массив по полученным настройкам, вызывая последовательно функции конвертации (указанные в конфигурации) */ - public function convertByConfiguration( $arr ) + public static function convertByConfiguration( $arr, $configuration ) { $result = $arr; - - $hasKey = isset( $this->configuration['hasKey'] ); - foreach ( $this->configuration as $key => $value ) { + //\common\components\CustomVarDamp::dumpAndDie($configuration); + $hasKey = isset( $configuration['hasKey'] ); + foreach ( $configuration['configuration'] as $key => $value ) { if ( $hasKey ){ // у нас ассоциативный массив, и мы можем конвертировать каждое значение в отдельности diff --git a/vendor/yiisoft/multiparser/CsvParser.php b/vendor/yiisoft/multiparser/CsvParser.php index ff065af..27d8a73 100644 --- a/vendor/yiisoft/multiparser/CsvParser.php +++ b/vendor/yiisoft/multiparser/CsvParser.php @@ -78,7 +78,7 @@ class CsvParser implements ParserInterface // если у файла есть заголовок, то в результате имеем ассоциативный массив $this->converter_conf['hasKey'] = 1; } - $this->converter->configuration = $this->converter_conf; + //$this->converter->configuration = $this->converter_conf; } } @@ -198,7 +198,7 @@ class CsvParser implements ParserInterface if (!is_null($converter)) { - $result = $converter->convertByConfiguration( $arr ); + $result = $converter->convertByConfiguration( $arr, $this->converter_conf ); } -- libgit2 0.21.4