Commit 74072a2ae8b9c25878eb6433f4833efeb7cbcec4

Authored by Mihail
1 parent 474f35bf

add first version XML parser, add CSVconverter

backend/components/parsers/CustomCsvParser.php
... ... @@ -14,20 +14,19 @@ class CustomCsvParser extends \yii\multiparser\CsvParser {
14 14 //public $last_line = 10;
15 15 //public $hasHeaderRow = true;
16 16 // public $keys = ['first','second', 'third', 'forth', 'fifth'];
17   -
18   -
19   - protected function readRow()
  17 + public function setupConverter()
20 18 {
21 19  
22   - $row = parent::readRow();
23 20  
24   - if (is_array($row)) {
25   -
26   - $row = Encoder::encodeArray( Encoder::$in_charset, Encoder::$out_charset, $row );
  21 + if ($this->hasHeaderRow) {
  22 + // если у файла есть заголовок, то в результате имеем ассоциативный массив
  23 + $this->converter_conf['hasKey'] = 1;
27 24 }
28 25  
29   - return $row;
  26 + $this->converter = \Yii::createObject($this->converter_conf);
  27 + \common\components\CustomVarDamp::dumpAndDie($this);
30 28  
31 29 }
32 30  
  31 +
33 32 }
34 33 \ No newline at end of file
... ...
backend/components/parsers/CustomParserConfigurator.php deleted
1   -<?php
2   -
3   -namespace backend\components\parsers;
4   -use yii\multiparser\ParserConfigurator;
5   -
6   -class CustomParserConfigurator extends ParserConfigurator
7   -{
8   -
9   - protected static $configuration = [
10   - 'csv' =>
11   - ['web' =>
12   - ['class' => 'backend\components\parsers\CustomCsvParser',
13   - 'auto_detect_first_line' => true,]]];
14   -
15   -
16   -
17   - public static $basic_column = [
18   - "BRAND" => 'Бренд',
19   - "ARTICLE"=> 'Артикул',
20   - "PRICE" => 'Цена',
21   - "DESCR" => 'Наименование',
22   - "BOX" => 'Колво',
23   - "ADD_BOX"=> 'В пути',
24   - "GROUP" => 'Группа RG'
25   - ];
26   -
27   -
28   -}
29 0 \ No newline at end of file
backend/components/parsers/ValueFilter.php deleted
1   -<?php
2   -/**
3   - * Created by PhpStorm.
4   - * User: Cibermag
5   - * Date: 31.08.2015
6   - * Time: 12:50
7   - */
8   -
9   -namespace backend\components\parsers;
10   -
11   -// класс который содержит преобразователи значений (фильтры) используемые при парсинге
12   -class ValueFilter
13   -{
14   -
15   - public static function pricefilter($str)
16   - {
17   - if ($str == '') {
18   - $str = 0;
19   - }
20   - $str = trim(str_replace(",", ".", $str));
21   - $str = preg_replace("/[^0-9.]+/", "", strtoupper($str));
22   -
23   - if ($str == '') {
24   - return '';
25   - }
26   - $str = round( (float)$str, 2 );
27   -
28   - return $str;
29   - }
30   -
31   - public static function boxfilter($str)
32   - {
33   - if ($str == '') {
34   - $str = 0;
35   - }
36   - $str = trim(str_replace(",", ".", $str));
37   - $str = preg_replace("/[^0-9.]+/", "", strtoupper($str));
38   - if ($str == '') {
39   - return '';
40   - }
41   - $str = round((int)$str, 2);
42   -
43   - return $str;
44   - }
45   -}
46 0 \ No newline at end of file
backend/components/parsers/config.php 0 → 100644
  1 +<?php
  2 + return [
  3 + 'csv' =>
  4 + ['web' =>
  5 + ['class' => 'backend\components\parsers\CustomCsvParser',
  6 + 'auto_detect_first_line' => true,
  7 + 'converter_conf' => ['class' => 'yii\multiparser\CsvConverter',
  8 + 'configuration' => [
  9 + "string" => 'DESCR'
  10 + ]
  11 + ,]],
  12 +
  13 + 'basic_column' => [
  14 + "BRAND" => 'Бренд',
  15 + "ARTICLE"=> 'Артикул',
  16 + "PRICE" => 'Цена',
  17 + "DESCR" => 'Наименование',
  18 + "BOX" => 'Колво',
  19 + "ADD_BOX"=> 'В пути',
  20 + "GROUP" => 'Группа RG'
  21 + ],
  22 + ]];
  23 +
  24 +
  25 +//[
  26 +// "float" => 'PRICE',
  27 +// "integer" => ['BOX' , 'ADD_BOX' ],
  28 +// "prefix" => 'ARTICLE'
  29 +//]
0 30 \ No newline at end of file
... ...
backend/config/main.php
... ... @@ -5,6 +5,7 @@ $params = array_merge(
5 5 require(__DIR__ . '/params.php'),
6 6 require(__DIR__ . '/params-local.php')
7 7 );
  8 +$mp_configuration = require( __DIR__ . '/../components/parsers/config.php');
8 9  
9 10 return [
10 11 'id' => 'app-backend',
... ... @@ -41,6 +42,7 @@ return [
41 42 'multiparser'=>[
42 43  
43 44 'class' => 'yii\multiparser\YiiMultiparser',
  45 + 'configuration' => $mp_configuration,
44 46  
45 47 ],
46 48 ],
... ...
backend/controllers/ParserController.php
... ... @@ -8,7 +8,7 @@ use yii\filters\VerbFilter;
8 8 use backend\models\UploadFileParsingForm;
9 9 use yii\web\UploadedFile;
10 10 use yii\data\ArrayDataProvider;
11   -use backend\components\parsers\DynamicFormHelper;
  11 +use yii\multiparser\DynamicFormHelper;
12 12 use backend\components\parsers\CustomParserConfigurator;
13 13  
14 14 use common\components\CustomVarDamp;
... ... @@ -96,13 +96,14 @@ class ParserController extends BaseController
96 96 ],
97 97 ]);
98 98  
  99 + // CustomVarDamp::dumpAndDie($data);
99 100 $header_model = DynamicFormHelper::CreateDynamicModel( count( $data[0] ) );
100 101  
101   - //CustomVarDamp::dumpAndDie($header_model);
  102 + // CustomVarDamp::dumpAndDie(Yii::$app->multiparser->getConfiguration('csv','basic_column'));
102 103 return $this->render('results',
103 104 ['model' => $data,
104 105 'header_model' => $header_model,
105   - 'basic_column' => CustomParserConfigurator::$basic_column,
  106 + 'basic_column' => Yii::$app->multiparser->getConfiguration('csv','basic_column'),
106 107 'dataProvider' => $provider]);
107 108 }
108 109  
... ... @@ -113,7 +114,7 @@ public function actionWrite()
113 114 $arr_attributes = Yii::$app->request->post()['DynamicModel'];
114 115 $model = DynamicFormHelper::CreateDynamicModel( $arr_attributes );
115 116 foreach ($arr_attributes as $key => $value) {
116   - $model->addRule($key, 'in', ['range' => array_keys( CustomParserConfigurator::$basic_column )]);
  117 + $model->addRule($key, 'in', ['range' => array_keys( Yii::$app->multiparser->getConfiguration('csv','basic_column') )]);
117 118 }
118 119  
119 120 //CustomVarDamp::dumpAndDie($model);
... ...
backend/views/parser/results.php
1 1 <?php
2 2  
3 3 use yii\helpers\Html;
4   -use backend\components\parsers\DynamicFormHelper;
  4 +use yii\multiparser\DynamicFormHelper;
5 5 use yii\widgets\ActiveForm;
6 6  
7 7  
... ... @@ -20,7 +20,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
20 20  
21 21 $form = ActiveForm::begin(['action' => 'write']);
22 22 ?>
23   - <?= DynamicFormHelper::CreateDynamicGridViewWithDropDownListHeader( $dataProvider, $form, $header_model, $basic_column )?>
  23 + <?= DynamicFormHelper::CreateGridWithDropDownListHeader( $dataProvider, $form, $header_model, $basic_column )?>
24 24  
25 25 <div class="form-group">
26 26 <?= Html::submitButton(Yii::t('app', 'Записать в БД'), ['class' => 'btn btn-primary']) ?>
... ...
vendor/yiisoft/multiparser/CSVConverter.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Created by PhpStorm.
  4 + * User: Cibermag
  5 +* Date: 31.08.2015
  6 +* Time: 12:50
  7 +*/
  8 +
  9 +namespace yii\multiparser;
  10 +
  11 +// класс который содержит преобразователи значений (фильтры) используемые при парсинге
  12 +class CSVConverter
  13 +{
  14 +
  15 + protected static $method_prefix = 'convertTo';
  16 +
  17 + public static $configuration = [];
  18 +
  19 + protected static function convertToFloat($value)
  20 + {
  21 +
  22 + if ($value == '') {
  23 + $value = 0;
  24 + }
  25 + $value = trim(str_replace(",", ".", $value));
  26 + $value = preg_replace("/[^0-9.]+/", "", strtoupper($value));
  27 +
  28 + if ($value == '') {
  29 + return '';
  30 + }
  31 + $value = round( (float)$value, 2 );
  32 +
  33 + return $value;
  34 + }
  35 +
  36 + protected static function convertToInteger($value)
  37 + {
  38 + if ($value == '') {
  39 + $value = 0;
  40 + }
  41 + $value = trim(str_replace(",", ".", $value));
  42 + $value = preg_replace("/[^0-9.]+/", "", strtoupper($value));
  43 + if ($value == '') {
  44 + return '';
  45 + }
  46 + $value = round((int)$value, 2);
  47 +
  48 + return $value;
  49 + }
  50 +
  51 + protected static function convertToString($value)
  52 + {
  53 + $res = '';
  54 + if (is_array($value)) {
  55 +
  56 + $res = Encoder::encodeArray($value);
  57 +
  58 + }elseif ( is_string($value) ) {
  59 +
  60 + $res = Encoder::encodeString($value);
  61 +
  62 + }
  63 +
  64 + return $res;
  65 + }
  66 +
  67 +
  68 + /**
  69 + * @param $name - имя метода конвертации
  70 + * @param $value - значение на конвертацию
  71 + * @return mixed
  72 + */
  73 + public static function __callStatic( $name, $value )
  74 + {
  75 + $method_name = self::$method_prefix . $name;
  76 + if ( is_callable( $method_name ) ) {
  77 +
  78 + self::$method_name( $value );
  79 +
  80 + } else{
  81 + // если такого метода конвертации не предусмотрено, то возвращаем не конвертируя
  82 + return $value;
  83 +
  84 + }
  85 + }
  86 +
  87 +
  88 + /**
  89 + * @param $arr - массив
  90 + * @return mixed
  91 + * конвертирует массив по полученным настройкам, вызывая последовательно функции конвертации (указанные в конфигурации)
  92 + */
  93 + public static function convertByConfiguration( $arr )
  94 + {
  95 + $result = $arr;
  96 +
  97 + $hasKey = isset( self::$configuration['hasKey'] );
  98 +
  99 + foreach ( self::$configuration as $key => $value ) {
  100 +
  101 + if ( $hasKey ){
  102 + // у нас ассоциативный массив, и мы можем конвертировать каждое значение в отдельности
  103 + if ( is_array( $value ) ) {
  104 + foreach ($value as $sub_value) {
  105 + if (isset($arr[$sub_value])) {
  106 + // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле
  107 + $result[$arr[$sub_value]] = self::$key( $arr[$sub_value] );
  108 + }
  109 +
  110 + }
  111 + } else {
  112 +
  113 + if (isset($arr[$value])) {
  114 + // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле
  115 + $result[$arr[$value]] = self::$key( $arr[$value] );
  116 + }
  117 +
  118 + }
  119 +
  120 + } else {
  121 + // нет заголовка - мы можем конвертировать только с року в целом
  122 + $result = self::$key( $arr );
  123 + }
  124 +
  125 + }
  126 +
  127 + return $result;
  128 + }
  129 +
  130 +
  131 +}
0 132 \ No newline at end of file
... ...
vendor/yiisoft/multiparser/CsvParser.php
... ... @@ -45,10 +45,14 @@ class CsvParser implements ParserInterface
45 45 * используется при автоопределении первой строки*/
46 46 public $min_column_quantity = 5;
47 47  
  48 + /** @var array - конфигурация конвертера значений */
  49 + public $converter_conf = [];
  50 + /** @var array - конвертер созданный по конфигурации */
  51 + public $converter = NULL;
48 52  
49 53  
50 54 /**
51   - метод устанвливает нужные настройки объекта SplFileObject, для работы с csv
  55 + * метод устанвливает нужные настройки объекта SplFileObject, для работы с csv
52 56 */
53 57 public function setup()
54 58 {
... ... @@ -58,9 +62,27 @@ class CsvParser implements ParserInterface
58 62 if ($this->auto_detect_first_line) {
59 63 $this->shiftToFirstValuableLine();
60 64 }
  65 + $this->setupConverter();
  66 +
61 67 }
62 68  
63 69 /**
  70 + * устанавливает конвертер значений согласно конфигурационным настройкам
  71 + */
  72 + public function setupConverter()
  73 + {
  74 + if (!count($this->converter_conf)) {
  75 + $this->converter = new CSVConverter();
  76 + if ($this->hasHeaderRow) {
  77 + // если у файла есть заголовок, то в результате имеем ассоциативный массив
  78 + $this->converter_conf['hasKey'] = 1;
  79 + }
  80 + $this->converter->configuration = $this->converter_conf;
  81 + }
  82 + }
  83 +
  84 +
  85 + /**
64 86 * определяет первую значимую строку,
65 87 * считывается файл пока в нем не встретится строка с непустыми колонками
66 88 * в количестве указанном в атрибуте min_column_quantity
... ... @@ -112,14 +134,12 @@ class CsvParser implements ParserInterface
112 134  
113 135 if (count($this->keys) !== count($row)) {
114 136 //
115   - throw new \ErrorException( "Invalid columns detected on line # {$current_line}", 0, 1, $this->file->getBasename(), $current_line);
  137 + throw new \ErrorException("Invalid columns detected on line # {$current_line}", 0, 1, $this->file->getBasename(), $current_line);
116 138 }
117 139  
118 140 $return[] = array_combine($this->keys, $row);
119 141 }
120   - }
121   - else
122   - {
  142 + } else {
123 143 $return[] = $row;
124 144 }
125 145 // если у нас установлен лимит, при его достижении прекращаем парсинг
... ... @@ -134,7 +154,6 @@ class CsvParser implements ParserInterface
134 154 }
135 155  
136 156  
137   -
138 157 protected function closeHandler()
139 158 {
140 159 $this->file = NULL;
... ... @@ -147,10 +166,15 @@ class CsvParser implements ParserInterface
147 166 {
148 167  
149 168 $row = $this->file->fgetcsv();
150   - if (is_array($row) && $this->first_column) {
  169 + if (is_array($row)) {
  170 + // попытаемся конвертировать прочитанные занчения согдасно конфигурации котнвертера значений
  171 + $row = $this->convert($row);
  172 +
  173 + if ($this->first_column) {
151 174  
152   - $row = array_slice($row, $this->first_column);
  175 + $row = array_slice($row, $this->first_column);
153 176  
  177 + }
154 178 }
155 179 if (is_null($row))
156 180 $row = false;
... ... @@ -159,5 +183,27 @@ class CsvParser implements ParserInterface
159 183  
160 184 }
161 185  
  186 + /**
  187 + * @param $arr
  188 + * @return mixed
  189 + * преобразовует значения прочитанного массива в нужные типы, согласно конфигурации конвертера
  190 + */
  191 + protected function convert($arr)
  192 + {
  193 + $result = $arr;
  194 + $converter = $this->converter;
  195 +
  196 + //\common\components\CustomVarDamp::dumpAndDie($this);
  197 +
  198 + if (!is_null($converter)) {
  199 +
  200 + $result = $converter::convertByConfiguration($arr);
  201 +
  202 + }
  203 +
  204 + return $result;
  205 +
  206 + }
  207 +
162 208  
163 209 }
164 210 \ No newline at end of file
... ...
backend/components/parsers/DynamicFormHelper.php renamed to vendor/yiisoft/multiparser/DynamicFormHelper.php
... ... @@ -6,7 +6,7 @@
6 6 * Time: 14:50
7 7 */
8 8  
9   -namespace backend\components\parsers;
  9 +namespace yii\multiparser;
10 10  
11 11 use yii\base\DynamicModel;
12 12 use yii\grid\GridView;
... ... @@ -48,8 +48,8 @@ class DynamicFormHelper
48 48 return $model;
49 49 }
50 50  
51   - // @todo - rewrite on two functions, add comments
52   - public static function CreateDynamicGridViewWithDropDownListHeader( $dataProvider, $form, $header_model, $arr_header_values )
  51 + // @todo add comments
  52 + public static function CreateGridWithDropDownListHeader( $dataProvider, $form, $header_model, $arr_header_values )
53 53 {
54 54 $columns_config = [['class' => SerialColumn::className()]];
55 55 $i = 0;
... ... @@ -59,8 +59,6 @@ class DynamicFormHelper
59 59 $i++;
60 60 }
61 61  
62   - //\common\components\CustomVarDamp::dumpAndDie($columns_config);
63   -
64 62 $dynamic_grid_view = GridView::widget( ['dataProvider' => $dataProvider,
65 63 'columns' => $columns_config ] );
66 64  
... ...
backend/components/parsers/Encoder.php renamed to vendor/yiisoft/multiparser/Encoder.php
... ... @@ -6,7 +6,7 @@
6 6 * Time: 13:36
7 7 */
8 8  
9   -namespace backend\components\parsers;
  9 +namespace yii\multiparser;
10 10  
11 11 // @todo add comments
12 12 class Encoder
... ... @@ -26,16 +26,18 @@ class Encoder
26 26 @fclose($file);
27 27 }
28 28  
29   - public static function encodeArray($in_charset, $out_charset, $array)
  29 + public static function encodeArray( $array, $in_charset = '', $out_charset = '')
30 30 {
  31 + if (isset($in_charset))
  32 + self::$in_charset = isset($in_charset);
31 33  
32   - self::$in_charset = $in_charset;
  34 + if (isset($out_charset))
33 35 self::$out_charset = $out_charset;
34 36  
35 37 $result = array_map(
36 38 function ( $array) {
37 39  
38   - return self::encode( self::$in_charset, self::$out_charset, $array );
  40 + return self::encodeString( $array, self::$in_charset, self::$out_charset );
39 41  
40 42 },
41 43 $array);
... ... @@ -43,9 +45,15 @@ class Encoder
43 45 return $result;
44 46 }
45 47  
46   - private static function encode( $in_charset, $out_charset, $source ){
  48 + public static function encodeString( $source, $in_charset = '', $out_charset = '' ){
47 49  
48   - return iconv($in_charset, $out_charset, $source);
  50 + if (isset($in_charset))
  51 + self::$in_charset = isset($in_charset);
  52 +
  53 + if (isset($out_charset))
  54 + self::$out_charset = $out_charset;
  55 +
  56 + return iconv( self::$in_charset, self::$out_charset, $source );
49 57  
50 58 }
51 59 }
52 60 \ No newline at end of file
... ...
vendor/yiisoft/multiparser/ParserConfigurator.php
... ... @@ -4,23 +4,29 @@ namespace yii\multiparser;
4 4 class ParserConfigurator
5 5 {
6 6  
7   - protected static $configuration = [
8   - 'csv' =>
9   - ['web' =>
10   - ['class' => 'backend\components\parsers\CustomCsvParser',
11   - 'auto_detect_first_line' => true,]]];
  7 + protected static $configuration;
12 8  
13   -
14   - public static function getConfiguration($extension, $mode)
  9 + public static function getConfiguration($extension, $parameter)
15 10 {
  11 + self::setConfiguration();
  12 +
16 13 if (!isset( self::$configuration[$extension] )){
17 14 throw new \ErrorException( "Parser do not maintain file with extension {$extension}");
18 15 }
19   - if (!isset( self::$configuration[$extension][$mode] )){
20   - throw new \ErrorException( "Parser configurator do not have settings for {$mode} mode");
  16 + if (!isset( self::$configuration[$extension][$parameter] )){
  17 + throw new \ErrorException( "Parser configurator do not have settings for {$parameter} parameter");
21 18 }
22 19  
23   - return self::$configuration[$extension][$mode];
  20 + return self::$configuration[$extension][$parameter];
24 21 }
25 22  
  23 + protected static function setConfiguration()
  24 + {
  25 +
  26 + self::$configuration = require(__DIR__ . '/config.php');
  27 +
  28 + }
  29 +
  30 +
  31 +
26 32 }
27 33 \ No newline at end of file
... ...
vendor/yiisoft/multiparser/XmlParser.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: Cibermag
  5 + * Date: 10.09.2015
  6 + * Time: 17:47
  7 + */
  8 +
  9 +namespace yii\multiparser;
  10 +
  11 +
  12 +class XmlParser implements ParserInterface{
  13 + public function read()
  14 + {
  15 + // TODO: Implement read() method.
  16 + }
  17 +
  18 + public function setup()
  19 + {
  20 + // TODO: Implement setup() method.
  21 + }
  22 +
  23 +
  24 + /**
  25 + * Converts an XML string to a PHP array
  26 + * See http://phpsecurity.readthedocs.org/en/latest/Injection-Attacks.html#xml-external-entity-injection
  27 + *
  28 + * @uses recursiveXMLToArray()
  29 + * @param string $val
  30 + * @param boolean $disableDoctypes Disables the use of DOCTYPE, and will trigger an error if encountered.
  31 + * false by default.
  32 + * @param boolean $disableExternals Disables the loading of external entities. false by default.
  33 + * @return array
  34 + */
  35 + public static function xml2array($val, $disableDoctypes = false, $disableExternals = false) {
  36 + // Check doctype
  37 + if($disableDoctypes && preg_match('/\<\!DOCTYPE.+]\>/', $val)) {
  38 + throw new InvalidArgumentException('XML Doctype parsing disabled');
  39 + }
  40 +
  41 + // Disable external entity loading
  42 + if($disableExternals) $oldVal = libxml_disable_entity_loader($disableExternals);
  43 + try {
  44 + $xml = new SimpleXMLElement($val);
  45 + $result = self::recursiveXMLToArray($xml);
  46 + } catch(Exception $ex) {
  47 + if($disableExternals) libxml_disable_entity_loader($oldVal);
  48 + throw $ex;
  49 + }
  50 + if($disableExternals) libxml_disable_entity_loader($oldVal);
  51 + return $result;
  52 + }
  53 +
  54 + /**
  55 + * Convert a XML string to a PHP array recursively. Do not
  56 + * call this function directly, Please use {@link Convert::xml2array()}
  57 + *
  58 + * @param SimpleXMLElement
  59 + *
  60 + * @return mixed
  61 + */
  62 + protected static function recursiveXMLToArray($xml) {
  63 + if(is_object($xml) && get_class($xml) == 'SimpleXMLElement') {
  64 + $attributes = $xml->attributes();
  65 + foreach($attributes as $k => $v) {
  66 + if($v) $a[$k] = (string) $v;
  67 + }
  68 + $x = $xml;
  69 + $xml = get_object_vars($xml);
  70 + }
  71 + if(is_array($xml)) {
  72 + if(count($xml) == 0) return (string) $x; // for CDATA
  73 + foreach($xml as $key => $value) {
  74 + $r[$key] = self::recursiveXMLToArray($value);
  75 + }
  76 + if(isset($a)) $r['@'] = $a; // Attributes
  77 + return $r;
  78 + }
  79 +
  80 + return (string) $xml;
  81 + }
  82 +}
0 83 \ No newline at end of file
... ...
vendor/yiisoft/multiparser/YiiMultiparser.php
... ... @@ -11,8 +11,26 @@ namespace yii\multiparser;
11 11 use yii\base\Component;
12 12  
13 13  
  14 +
  15 +
14 16 class YiiMultiparser extends Component{
15 17  
  18 +public $configuration;
  19 +
  20 + public function getConfiguration($extension, $conf_parameter){
  21 +
  22 + if (!isset( $this->configuration[$extension] )){
  23 + throw new \ErrorException( "Parser do not maintain file with extension {$extension}");
  24 + }
  25 + if (!isset( $this->configuration[$extension][$conf_parameter] )){
  26 + throw new \ErrorException( "Parser configurator do not have settings for {$conf_parameter} parameter");
  27 + }
  28 +
  29 + return $this->configuration[$extension][$conf_parameter];
  30 +
  31 + }
  32 +
  33 +
16 34 public function parse( $filePath, $options = [] ){
17 35  
18 36 $parser = new YiiParserHandler( $filePath, $options );
... ...
vendor/yiisoft/multiparser/YiiParserHandler.php
... ... @@ -12,4 +12,72 @@ namespace yii\multiparser;
12 12 class YiiParserHandler extends ParserHandler{
13 13  
14 14  
  15 + /**
  16 + * @param $filePath
  17 + * @param array $options
  18 + * проверяет читабенльность переданного файла, а также наличие настроек парсера в конфигурационном файле для данного типа файла
  19 + */
  20 + public function __construct($filePath, $options = [])
  21 + {
  22 + $this->filePath = $filePath;
  23 + if (isset($options['mode'])) {
  24 +
  25 + $this->mode = $options['mode'];
  26 + unset($options['mode']);
  27 +
  28 + } else {
  29 +
  30 + $this->mode = self::DEFAULT_MODE;
  31 +
  32 + }
  33 +
  34 + $this->options = $options;
  35 +
  36 + try {
  37 + $this->fileObject = new \SplFileObject($this->filePath, 'r');
  38 + } catch (\ErrorException $e) {
  39 + // Yii::warning("Ошибка открытия файла {$this->filePath}");
  40 + echo "Ошибка открытия файла {$this->filePath}";
  41 + return [];
  42 + }
  43 +
  44 + $options['file'] = $this->fileObject;
  45 + $this->extension = $this->fileObject->getExtension();
  46 +
  47 + try {
  48 + $this->configuration = \Yii::$app->multiparser->getConfiguration($this->extension, $this->mode);
  49 + $this->configuration = array_merge($this->configuration, $options);
  50 +
  51 + } catch (\ErrorException $e) {
  52 + echo $e->getMessage();
  53 + return [];
  54 + }
  55 +
  56 + }
  57 +
  58 + public function run()
  59 + {
  60 +
  61 + $result = [];
  62 +
  63 + // \common\components\CustomVarDamp::dumpAndDie($this);
  64 + if (count($this->configuration)) {
  65 + $parser = \Yii::createObject($this->configuration);
  66 +
  67 + try {
  68 +
  69 + $parser->setup();
  70 + $result = $parser->read();
  71 +
  72 + } catch (\ErrorException $e) {
  73 +
  74 + echo $e->getMessage();
  75 +
  76 + }
  77 +
  78 + }
  79 +
  80 + return $result;
  81 + }
  82 +
15 83 }
16 84 \ No newline at end of file
... ...
vendor/yiisoft/multiparser/config.php 0 → 100644
  1 +<?php
  2 +return
  3 + [
  4 + 'csv' =>
  5 + ['web' =>
  6 + ['class' => 'yii\multiparser\CsvParser',
  7 + 'auto_detect_first_line' => true,
  8 + 'converter_conf' => [
  9 + "float" => 'PRICE',
  10 + "integer" => 'QUANTITY',
  11 + "string" => 'DESCR'
  12 + ]],
  13 + 'basic_column' => [
  14 + "ARTICLE" => 'Артикул',
  15 + "PRICE" => 'Цена',
  16 + "DESCR" => 'Наименование',
  17 + "QUANTITY" => 'Колво'
  18 +
  19 + ],
  20 + ]];
... ...