Commit 67adc7885f3d5afe0b8340909d5bf0cdd18affea

Authored by Mihail
1 parent 741ecd87

add converter interface, object creator, abstract class Parser

backend/controllers/ParserController.php
@@ -15,6 +15,7 @@ use backend\models\Importers; @@ -15,6 +15,7 @@ use backend\models\Importers;
15 use yii\base\ErrorException; 15 use yii\base\ErrorException;
16 use common\components\PriceWriter; 16 use common\components\PriceWriter;
17 use common\components\CustomVarDamp; 17 use common\components\CustomVarDamp;
  18 +use common\components\CustomArrayHelper;
18 19
19 /** 20 /**
20 * Parser controller 21 * Parser controller
@@ -54,7 +55,6 @@ class ParserController extends BaseController @@ -54,7 +55,6 @@ class ParserController extends BaseController
54 $model = new UploadFileParsingForm(); 55 $model = new UploadFileParsingForm();
55 // установим режим, 0 - ручная загрузка, 1 - автозагрузка 56 // установим режим, 0 - ручная загрузка, 1 - автозагрузка
56 $model->mode = $mode; 57 $model->mode = $mode;
57 - //CustomVarDamp::dumpAndDie(phpinfo());  
58 return $this->render('index', ['model' => $model]); 58 return $this->render('index', ['model' => $model]);
59 } 59 }
60 60
@@ -186,7 +186,7 @@ class ParserController extends BaseController @@ -186,7 +186,7 @@ class ParserController extends BaseController
186 186
187 // соотнесем отпарсенные данные с соответсивем полученным от пользователя 187 // соотнесем отпарсенные данные с соответсивем полученным от пользователя
188 // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию 188 // для этого преобразуем массив отпарсенных данных - назначим ключи согласно соответствию
189 - $data = \Yii::$app->multiparser->convertToAssocArray($data, $arr , 'attr_'); 189 + $data = CustomArrayHelper::createAssocArray( $data, $arr , 'attr_' );
190 190
191 // запустим специальный класс который запишет данные в таблицы связанные с прайсами 191 // запустим специальный класс который запишет данные в таблицы связанные с прайсами
192 $writer = new PriceWriter(); 192 $writer = new PriceWriter();
backend/models/UploadFileParsingForm.php
@@ -75,8 +75,8 @@ class UploadFileParsingForm extends Model @@ -75,8 +75,8 @@ class UploadFileParsingForm extends Model
75 throw new ErrorException("Ошибка чтения из файла прайса {$this->file_path}"); 75 throw new ErrorException("Ошибка чтения из файла прайса {$this->file_path}");
76 } 76 }
77 // файл больше не нужен - данные прочитаны и сохранены в кеш 77 // файл больше не нужен - данные прочитаны и сохранены в кеш
78 - if( file_exists($this->file_path) )  
79 - unlink($this->file_path); 78 +// if( file_exists($this->file_path) )
  79 +// unlink($this->file_path);
80 80
81 return $data; 81 return $data;
82 } 82 }
common/components/CustomArrayHelper.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Tsurkanov
  5 + * Date: 20.10.2015
  6 + * Time: 14:42
  7 + */
  8 +
  9 +namespace common\components;
  10 +
  11 +
  12 +class CustomArrayHelper extends \yii\helpers\ArrayHelper {
  13 +
  14 + /**
  15 + * @param $value_arr - двумерный массив значений, которому нужно присвоить ключи
  16 + * @param $key_array - ключи для вложенного массива
  17 + * @return array - таблица с проименованными колонками
  18 + */
  19 +
  20 + public static function createAssocArray(array $value_arr, array $key_array, $key_prefix = '')
  21 + {
  22 + // очистка служебного префикса в массиве заголовков
  23 + if ($key_prefix) {
  24 + // @todo оптимизировать - два переворота массива - избыточно
  25 + $key_array = array_flip($key_array);
  26 +
  27 + array_walk($key_array, function (&$value, $key, $key_prefix) {
  28 + $value = str_replace($key_prefix, '', $value);
  29 + }, $key_prefix);
  30 +
  31 + $key_array = array_flip($key_array);
  32 + //уберем пустые элементы
  33 + $key_array = array_filter($key_array, function ($value) {
  34 + return $value !== '';
  35 + });
  36 + }
  37 +
  38 + array_walk($value_arr,
  39 + function (&$value, $key, $key_array) {
  40 + $res = $value;
  41 + foreach ($res as $sub_key => $sub_value) {
  42 + if (isset($key_array[$sub_key])) {
  43 + // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим
  44 + $new_key = $key_array[$sub_key];
  45 + if (!array_key_exists($new_key, $res)) {
  46 + $res[$new_key] = $value[$sub_key];
  47 + }
  48 + }
  49 + unset($res[$sub_key]);
  50 + $value = $res;
  51 + }
  52 +
  53 + },
  54 + $key_array);
  55 +
  56 + return $value_arr;
  57 + }
  58 +
  59 + /**
  60 + * @param $value_arr - двумерный массив к которому нужно добавить колонки
  61 + * @param $add_array - массив с колонками (ключи) и значениями колонок
  62 + * @return mixed
  63 + */
  64 + public static function addColumns(array $value_arr, array $add_array)
  65 + {
  66 + $i = 0;
  67 + while ($i < count($value_arr)) {
  68 + foreach ($add_array as $add_key => $add_value) {
  69 + $value_arr[$i][$add_key] = $add_value;
  70 + }
  71 + $i++;
  72 + }
  73 + return $value_arr;
  74 + }
  75 +}
0 \ No newline at end of file 76 \ No newline at end of file
common/components/PriceWriter.php
@@ -62,20 +62,20 @@ class PriceWriter @@ -62,20 +62,20 @@ class PriceWriter
62 // преобразуем числовые значения 62 // преобразуем числовые значения
63 foreach ($this->data as &$row) { 63 foreach ($this->data as &$row) {
64 64
65 - $row['PRICE'] = \Yii::$app->multiparser->convertToFloat($row['PRICE']);  
66 - $row['BOX'] = \Yii::$app->multiparser->convertToInteger($row['BOX']); 65 + $row['PRICE'] = \Yii::$app->converter->convertTo('float',$row['PRICE']);
  66 + $row['BOX'] = \Yii::$app->converter->convertTo('integer',$row['BOX']);
67 // присвоим полный артикул 67 // присвоим полный артикул
68 68
69 $row['FULL_ARTICLE'] = $row['ARTICLE']; 69 $row['FULL_ARTICLE'] = $row['ARTICLE'];
70 if ((int)$this->configuration['delete_prefix']) { 70 if ((int)$this->configuration['delete_prefix']) {
71 - $row = \Yii::$app->multiparser->convertToArticle( $row, $this->configuration['importer_id'] ); 71 + $row = \Yii::$app->converter->convertTo( 'Article', $row, ['importer_id' => $this->configuration['importer_id']] );
72 } else { 72 } else {
73 - $row['ARTICLE'] = \Yii::$app->multiparser->convertToArticle( $row['ARTICLE'] ); 73 + $row['ARTICLE'] = \Yii::$app->converter->convertTo( 'Article', $row['ARTICLE'] );
74 } 74 }
75 75
76 76
77 if (isset($row['ADD_BOX'])) 77 if (isset($row['ADD_BOX']))
78 - $row['ADD_BOX'] = \Yii::$app->multiparser->convertToInteger($row['ADD_BOX']); 78 + $row['ADD_BOX'] = \Yii::$app->converter->convertTo( 'integer', $row['ADD_BOX'] );
79 79
80 // проверим все ли обязательные колонки были указаны пользователем 80 // проверим все ли обязательные колонки были указаны пользователем
81 $details_model->load(['Details' => $row]); 81 $details_model->load(['Details' => $row]);
@@ -87,7 +87,7 @@ class PriceWriter @@ -87,7 +87,7 @@ class PriceWriter
87 } 87 }
88 88
89 // дополним данные значением импортера и даты обновления цены 89 // дополним данные значением импортера и даты обновления цены
90 - $this->data = \Yii::$app->multiparser->addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]); 90 + $this->data = CustomArrayHelper::addColumns( $this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date] );
91 try { 91 try {
92 //@todo add transaction 92 //@todo add transaction
93 93
common/components/parsers/CustomConverter.php
@@ -10,71 +10,11 @@ use backend\models\ImportersPrefix; @@ -10,71 +10,11 @@ use backend\models\ImportersPrefix;
10 class CustomConverter extends Converter 10 class CustomConverter extends Converter
11 { 11 {
12 12
13 - /**  
14 - * @param $value_arr - двумерный массив значений, которому нужно присвоить ключи  
15 - * @param $key_array - ключи для вложенного массива  
16 - * @return array - таблица с проименованными колонками  
17 - */  
18 public static $sign; 13 public static $sign;
19 public static $multiplier; 14 public static $multiplier;
20 public static $importer_id; 15 public static $importer_id;
21 public static $brand; 16 public static $brand;
22 17
23 - public static function convertToAssocArray(array $value_arr, array $key_array, $key_prefix = '')  
24 - {  
25 - // очистка служебного префикса в массиве заголовков  
26 - if ($key_prefix) {  
27 - // @todo оптимизировать - два переворота массива - избыточно  
28 - $key_array = array_flip($key_array);  
29 -  
30 - array_walk($key_array, function (&$value, $key, $key_prefix) {  
31 - $value = str_replace($key_prefix, '', $value);  
32 - }, $key_prefix);  
33 -  
34 - $key_array = array_flip($key_array);  
35 - //уберем пустые элементы  
36 - $key_array = array_filter($key_array, function ($value) {  
37 - return $value !== '';  
38 - });  
39 - }  
40 -  
41 - array_walk($value_arr,  
42 - function (&$value, $key, $key_array) {  
43 - $res = $value;  
44 - foreach ($res as $sub_key => $sub_value) {  
45 - if (isset($key_array[$sub_key])) {  
46 - // если такой ключ в базовом массиве (массиве ключей) есть, то заменим новым, иначе просто удалим  
47 - $new_key = $key_array[$sub_key];  
48 - if (!array_key_exists($new_key, $res)) {  
49 - $res[$new_key] = $value[$sub_key];  
50 - }  
51 - }  
52 - unset($res[$sub_key]);  
53 - $value = $res;  
54 - }  
55 -  
56 - },  
57 - $key_array);  
58 -  
59 - return $value_arr;  
60 - }  
61 -  
62 - /**  
63 - * @param $value_arr - двумерный массив к которому нужно добавить колонки  
64 - * @param $add_array - массив с колонками (ключи) и значениями колонок  
65 - * @return mixed  
66 - */  
67 - public function addColumns(array $value_arr, array $add_array)  
68 - {  
69 - $i = 0;  
70 - while ($i < count($value_arr)) {  
71 - foreach ($add_array as $add_key => $add_value) {  
72 - $value_arr[$i][$add_key] = $add_value;  
73 - }  
74 - $i++;  
75 - }  
76 - return $value_arr;  
77 - }  
78 18
79 public static function convertToDetails(array $row) 19 public static function convertToDetails(array $row)
80 { 20 {
@@ -143,11 +83,8 @@ class CustomConverter extends Converter @@ -143,11 +83,8 @@ class CustomConverter extends Converter
143 83
144 } 84 }
145 85
146 - public static function convertToArticle( $value, $importer_id = '' ) 86 + public static function convertToArticle( $value )
147 { 87 {
148 - if(isset( $importer_id )){  
149 - self::$importer_id = $importer_id;  
150 - }  
151 88
152 if (is_array($value)) { 89 if (is_array($value)) {
153 90
@@ -189,7 +126,7 @@ class CustomConverter extends Converter @@ -189,7 +126,7 @@ class CustomConverter extends Converter
189 126
190 public static function convertToBrand($value) 127 public static function convertToBrand($value)
191 { 128 {
192 - $res = parent::convertToEncode($value);; 129 + $res = self::convertToEncode($value);;
193 $res = trim(strtoupper($res)); 130 $res = trim(strtoupper($res));
194 $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res))))); 131 $res = str_replace("Ä", "A", str_replace("Ö", "O", str_replace("Ü", "U", str_replace("Ë", "E", str_replace("Ò", "O", $res)))));
195 $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res); 132 $res = str_replace(array('@', '#', '~', '"', "'", "?", "!"), '', $res);
@@ -197,12 +134,5 @@ class CustomConverter extends Converter @@ -197,12 +134,5 @@ class CustomConverter extends Converter
197 return $res; 134 return $res;
198 } 135 }
199 136
200 - public static function convertToString($value)  
201 - {  
202 - $value = parent::convertToEncode($value);  
203 -  
204 - return str_replace(array('!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '-', '~', '`', '"', "'", ' ', '№', '%', ';', ':', '[', ']', '{', '}', '*', '?', '/', '\'', '|', '.', ',', '<', '>', '\\'), '', $value);  
205 - }  
206 -  
207 137
208 } 138 }
209 \ No newline at end of file 139 \ No newline at end of file
common/components/parsers/CustomCsvParser.php
@@ -19,31 +19,19 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { @@ -19,31 +19,19 @@ class CustomCsvParser extends \yii\multiparser\CsvParser {
19 public $last_line = 100; 19 public $last_line = 100;
20 //public $hasHeaderRow = true; 20 //public $hasHeaderRow = true;
21 // public $keys = ['first','second', 'third', 'forth', 'fifth']; 21 // public $keys = ['first','second', 'third', 'forth', 'fifth'];
22 - public function setupConverter()  
23 - {  
24 - if (!count($this->converter_conf)) {  
25 - if ($this->hasHeaderRow) {  
26 - // если у файла есть заголовок, то в результате имеем ассоциативный массив  
27 - $this->converter_conf['hasKey'] = 1;  
28 -  
29 - }  
30 -  
31 - }  
32 -// $this->converter = \Yii::createObject( $this->converter_conf );  
33 -// CustomVarDamp::dumpAndDie($this->converter);  
34 - }  
35 -  
36 - /**  
37 - * @param $arr  
38 - * @return mixed  
39 - * преобразовует значения прочитанного массива в нужные типы, согласно конфигурации конвертера  
40 - */  
41 - protected function convert($arr)  
42 - {  
43 - $arr = \Yii::$app->multiparser->convertByConfiguration( $arr, $this->converter_conf );  
44 -  
45 - return $arr;  
46 -  
47 - } 22 +// public function setupConverter()
  23 +// {
  24 +// if (!count($this->converter_conf)) {
  25 +// if ($this->hasHeaderRow) {
  26 +// // если у файла есть заголовок, то в результате имеем ассоциативный массив
  27 +// $this->converter_conf['hasKey'] = 1;
  28 +//
  29 +// }
  30 +//
  31 +// }
  32 +//// $this->converter = \Yii::createObject( $this->converter_conf );
  33 +// }
  34 +
  35 +
48 36
49 } 37 }
50 \ No newline at end of file 38 \ No newline at end of file
common/components/parsers/config.php
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 ['class' => 'common\components\parsers\CustomCsvParser', 5 ['class' => 'common\components\parsers\CustomCsvParser',
6 'auto_detect_first_line' => true, 6 'auto_detect_first_line' => true,
7 'converter_conf' => [ 7 'converter_conf' => [
8 - //'class' => ' common\components\parsers\CustomConverter', // @todo переделать на компонент 8 + 'class' => 'common\components\parsers\CustomConverter',
9 'configuration' => ["encode" => 'DESCR'],] 9 'configuration' => ["encode" => 'DESCR'],]
10 ], 10 ],
11 'console' => 11 'console' =>
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 'auto_detect_first_line' => true, 13 'auto_detect_first_line' => true,
14 'hasHeaderRow' => true, 14 'hasHeaderRow' => true,
15 'converter_conf' => [ 15 'converter_conf' => [
16 - //'class' => ' common\components\parsers\CustomConverter', 16 + 'class' => ' common\components\parsers\CustomConverter',
17 'hasKey' => 1, 17 'hasKey' => 1,
18 'configuration' => ["string" => 'DESCR', 18 'configuration' => ["string" => 'DESCR',
19 "float" => 'PRICE', 19 "float" => 'PRICE',
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 'hasHeaderRow' => true, 42 'hasHeaderRow' => true,
43 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'], 43 'keys' =>['ARTICLE', 'CROSS_ARTICLE', 'BRAND', 'CROSS_BRAND'],
44 'converter_conf' => [ 44 'converter_conf' => [
45 - //'class' => ' common\components\parsers\CustomConverter', 45 + 'class' => ' common\components\parsers\CustomConverter',
46 'hasKey' => 1, 46 'hasKey' => 1,
47 'configuration' => [ 47 'configuration' => [
48 "brand" => ['BRAND', 'CROSS_BRAND'], 48 "brand" => ['BRAND', 'CROSS_BRAND'],
@@ -55,7 +55,7 @@ @@ -55,7 +55,7 @@
55 ['class' => 'yii\multiparser\XmlParser', 55 ['class' => 'yii\multiparser\XmlParser',
56 'node' => 'Товар', 56 'node' => 'Товар',
57 'converter_conf' => [ 57 'converter_conf' => [
58 - //'class' => ' common\components\parsers\CustomConverter', 58 + 'class' => ' common\components\parsers\CustomConverter',
59 'hasKey' => 1, 59 'hasKey' => 1,
60 'configuration' => ["details" => [] 60 'configuration' => ["details" => []
61 ],], 61 ],],
common/config/main.php
@@ -15,14 +15,15 @@ return [ @@ -15,14 +15,15 @@ return [
15 ] 15 ]
16 ], 16 ],
17 'multiparser'=>[ 17 'multiparser'=>[
18 -  
19 'class' => 'yii\multiparser\YiiMultiparser', 18 'class' => 'yii\multiparser\YiiMultiparser',
20 'configuration' => $mp_configuration, 19 'configuration' => $mp_configuration,
21 - 'as behavior' => [  
22 - 'class' => 'common\components\parsers\CustomConverter', 20 + ],
  21 + 'converter'=>[
  22 + 'class' => 'yii\multiparser\YiiConverter',
  23 + 'configuration' => [
  24 + 'class' => 'common\components\parsers\CustomConverter'
  25 + ],
23 ], 26 ],
24 27
25 ], 28 ],
26 - ],  
27 -  
28 ]; 29 ];
common/models/DetailsCurrency.php
@@ -6,7 +6,7 @@ use Yii; @@ -6,7 +6,7 @@ use Yii;
6 6
7 /** 7 /**
8 * This is the model class for table "{{%details_currency}}". 8 * This is the model class for table "{{%details_currency}}".
9 - * 9 + * w_details_currency - СПЕЦИАЛЬНО СОЗАДННАЯ ВЬЮШКА ДЛЯ ДОСТУПА К СПИСКУ ТОВАРОВ С ВАЛЮТАМИ И ИХ КУРСАМИ
10 * @property string $ID 10 * @property string $ID
11 * @property string $IMPORT_ID 11 * @property string $IMPORT_ID
12 * @property string $BRAND 12 * @property string $BRAND