From 282531690a747620ec70fe555c589a30fbd3edb9 Mon Sep 17 00:00:00 2001 From: Mihail Date: Wed, 16 Sep 2015 11:33:21 +0300 Subject: [PATCH] add converter as behaviour, add table - Details by migration --- backend/components/parsers/CustomConverter.php | 43 +++++++++++++++++++++++++++++++++++++++++++ backend/components/parsers/CustomCsvParser.php | 12 ++++++++---- backend/components/parsers/config.php | 8 +++----- backend/config/main.php | 3 +++ backend/controllers/ParserController.php | 8 +++++--- backend/models/Details.php | 19 +++++++++++++++++++ console/migrations/m150915_125129_addDetails.php | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vendor/yiisoft/multiparser/Converter.php | 30 ++++++++++-------------------- vendor/yiisoft/multiparser/CsvParser.php | 4 ++-- vendor/yiisoft/multiparser/DynamicFormHelper.php | 30 ------------------------------ 10 files changed, 161 insertions(+), 64 deletions(-) create mode 100644 backend/components/parsers/CustomConverter.php create mode 100644 backend/models/Details.php create mode 100644 console/migrations/m150915_125129_addDetails.php diff --git a/backend/components/parsers/CustomConverter.php b/backend/components/parsers/CustomConverter.php new file mode 100644 index 0000000..4f3de1b --- /dev/null +++ b/backend/components/parsers/CustomConverter.php @@ -0,0 +1,43 @@ + $sub_value) { + if (isset($key_array[$key])) { + // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим + $new_key = $key_array[$key]; + if( !array_key_exists( $new_key , $res ) ){ + $res[ $new_key ] = $res[$key]; + } + } + unset( $res[$key] ); + } + + return $res; + }, + $value_arr, $key_array); + return $result; + } + +} \ No newline at end of file diff --git a/backend/components/parsers/CustomCsvParser.php b/backend/components/parsers/CustomCsvParser.php index 5674511..d58fe83 100644 --- a/backend/components/parsers/CustomCsvParser.php +++ b/backend/components/parsers/CustomCsvParser.php @@ -16,13 +16,17 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { // public $keys = ['first','second', 'third', 'forth', 'fifth']; public function setupConverter() { + if ( count($this->converter_conf) ) { + + if ($this->hasHeaderRow) { + // если у файла есть заголовок, то в результате имеем ассоциативный массив + $this->converter_conf['hasKey'] = 1; + } + + $this->converter = \Yii::createObject($this->converter_conf); - if ($this->hasHeaderRow) { - // если у файла есть заголовок, то в результате имеем ассоциативный массив - $this->converter_conf['hasKey'] = 1; } - $this->converter = \Yii::createObject($this->converter_conf); } diff --git a/backend/components/parsers/config.php b/backend/components/parsers/config.php index 6e14618..de0fcdf 100644 --- a/backend/components/parsers/config.php +++ b/backend/components/parsers/config.php @@ -4,11 +4,9 @@ ['web' => ['class' => 'backend\components\parsers\CustomCsvParser', 'auto_detect_first_line' => true, - 'converter_conf' => ['class' => 'yii\multiparser\Converter', - 'configuration' => [ - "string" => 'DESCR' - ] - ,]], + 'converter_conf' => ['class' => ' backend\components\parsers\CustomConverter', + 'configuration' => ["string" => 'DESCR'],] + ], 'basic_column' => [ Null => 'Пусто', diff --git a/backend/config/main.php b/backend/config/main.php index 386e300..390ddbc 100644 --- a/backend/config/main.php +++ b/backend/config/main.php @@ -43,6 +43,9 @@ return [ 'class' => 'yii\multiparser\YiiMultiparser', 'configuration' => $mp_configuration, + 'as behavior' => [ + 'class' => 'backend\components\parsers\CustomConverter', + ], ], ], diff --git a/backend/controllers/ParserController.php b/backend/controllers/ParserController.php index eb6dab9..6563c8c 100644 --- a/backend/controllers/ParserController.php +++ b/backend/controllers/ParserController.php @@ -96,7 +96,7 @@ class ParserController extends BaseController ], ]); - // CustomVarDamp::dumpAndDie($data); + //CustomVarDamp::dumpAndDie($data); $header_model = DynamicFormHelper::CreateDynamicModel( count( $data[0] ) ); // CustomVarDamp::dumpAndDie(Yii::$app->multiparser->getConfiguration('csv','basic_column')); @@ -117,13 +117,15 @@ public function actionWrite() $model->addRule($key, 'in', ['range' => array_keys( Yii::$app->multiparser->getConfiguration('csv','basic_column') )]); } + //CustomVarDamp::dumpAndDie($model); if ($model->validate()) { $arr = $model->toArray(); $data = json_decode( Yii::$app->getCache()->get( 'parser_data' ),true ); - // CustomVarDamp::dumpAndDie(DynamicFormHelper::CreateAssocArray($data, $arr)); - CustomVarDamp::dumpAndDie($arr); + $data = \Yii::$app->multiparser->convertToAssocArray( $data, $arr, 'attr_' ); + $data[1]['BOX'] = \Yii::$app->multiparser->convertToFloat( $data[1]['BOX'] ); + CustomVarDamp::dumpAndDie($data); } diff --git a/backend/models/Details.php b/backend/models/Details.php new file mode 100644 index 0000000..f840698 --- /dev/null +++ b/backend/models/Details.php @@ -0,0 +1,19 @@ +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 + + } + + public function down() + { + $this->dropTable('{{%details}}'); + + } + + /* + // 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 360e695..73b8178 100644 --- a/vendor/yiisoft/multiparser/Converter.php +++ b/vendor/yiisoft/multiparser/Converter.php @@ -7,9 +7,10 @@ */ namespace yii\multiparser; +use yii\base\Behavior; // класс который содержит преобразователи значений (фильтры) используемые при парсинге -class Converter +class Converter extends Behavior { const METHOD_PREFIX = 'convertTo'; @@ -18,7 +19,7 @@ class Converter protected static function convertToFloat($value) { - + echo 1; if ($value == '') { $value = 0; } @@ -51,6 +52,7 @@ class Converter protected static function convertToString($value) { + $res = ''; if (is_array($value)) { @@ -61,26 +63,9 @@ class Converter $res = Encoder::encodeString($value); } - return $res; } -// protected static function convertToAssocArray($arr) -// { -// -// $res = ''; -// if (is_array($value)) { -// -// $res = Encoder::encodeArray($value); -// -// }elseif ( is_string($value) ) { -// -// $res = Encoder::encodeString($value); -// -// } -// -// return $res; -// } /** * @param $name - имя метода конвертации @@ -90,7 +75,7 @@ class Converter public static function __callStatic( $name, $value ) { $method_name = self::METHOD_PREFIX . $name; - if ( method_exists( self::class ,$method_name ) ) { + if ( method_exists( self::class, $method_name ) ) { return self::$method_name( $value[0] ); @@ -101,6 +86,11 @@ class Converter } } + public function __call($name, $params) + { + return self::__callStatic( $name, $params ); + } + /** * @param $arr - массив diff --git a/vendor/yiisoft/multiparser/CsvParser.php b/vendor/yiisoft/multiparser/CsvParser.php index 51f284a..ff065af 100644 --- a/vendor/yiisoft/multiparser/CsvParser.php +++ b/vendor/yiisoft/multiparser/CsvParser.php @@ -168,11 +168,11 @@ class CsvParser implements ParserInterface { $row = $this->file->fgetcsv(); + if (is_array($row)) { // попытаемся конвертировать прочитанные занчения согдасно конфигурации котнвертера значений - // \common\components\CustomVarDamp::dump($row,1); $row = $this->convert($row); - // \common\components\CustomVarDamp::dump($row,2); + // \common\components\CustomVarDamp::dump($row); if ($this->first_column) { $row = array_slice($row, $this->first_column); diff --git a/vendor/yiisoft/multiparser/DynamicFormHelper.php b/vendor/yiisoft/multiparser/DynamicFormHelper.php index 515fc29..26c1dc1 100644 --- a/vendor/yiisoft/multiparser/DynamicFormHelper.php +++ b/vendor/yiisoft/multiparser/DynamicFormHelper.php @@ -22,7 +22,6 @@ class DynamicFormHelper { const KEY_PREFIX = 'attr_'; - private static $key_array; /** * @param $source - int or array @@ -68,33 +67,4 @@ class DynamicFormHelper } - public static function CreateAssocArray ($value_arr, $key_array) - { - - self::$key_array = $key_array; - $result = array_map( - function ($value) { - - foreach ($value as $key => $sub_value) { - return self::change_key( $key, self::$key_array[$sub_value], $value ); - } - - - // array_combine( self::$key_array, $value ); - - }, - $value_arr); - return $result; - } - - protected static function change_key( $key, $new_key, $arr ){ - $res = $arr; - if(!array_key_exists($new_key,$arr)){ - $arr[$new_key]=$arr[$key]; - unset($arr[$key]); - $res = $arr; - } - return $res; - } - } \ No newline at end of file -- libgit2 0.21.4