Commit fe1397b32ad0cdd5e060936a133d65ba0f5d0d27
Merge branch 'master' of gitlab.artweb.com.ua:root/test_1
Conflicts: backend/components/parsers/CustomCsvParser.php backend/components/parsers/config.php backend/config/main.php backend/controllers/CheckPriceController.php backend/controllers/ParserController.php backend/views/layouts/column.php backend/views/parser/index.php backend/views/parser/server-files.php backend/web/css/plugins/daterangepicker/daterangepicker-bs3.css backend/web/css/plugins/daterangepicker/daterangepicker.js backend/web/css/plugins/daterangepicker/moment.js backend/web/css/plugins/daterangepicker/moment.min.js console/config/main.php console/migrations/m150925_111922_add_foreign_key_ImportFiles.php framework/core/Convert.php framework/lang/da.yml framework/lang/fr.yml framework/lang/nb.yml vendor/yiisoft/multiparser/Converter.php vendor/yiisoft/multiparser/CsvParser.php vendor/yiisoft/multiparser/YiiMultiparser.php
Showing
24 changed files
with
809 additions
and
106 deletions
Show diff stats
backend/components/parsers/CustomCsvParser.php
... | ... | @@ -9,6 +9,8 @@ |
9 | 9 | namespace backend\components\parsers; |
10 | 10 | |
11 | 11 | |
12 | +use common\components\CustomVarDamp; | |
13 | + | |
12 | 14 | class CustomCsvParser extends \yii\multiparser\CsvParser { |
13 | 15 | |
14 | 16 | public $last_line = 10; |
... | ... | @@ -33,9 +35,8 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { |
33 | 35 | */ |
34 | 36 | protected function convert($arr) |
35 | 37 | { |
36 | - $result = \Yii::$app->multiparser->convertByConfiguration( $arr, $this->converter_conf ); | |
37 | - | |
38 | - return $result; | |
38 | + $arr = \Yii::$app->multiparser->convertByConfiguration($arr, $this->converter_conf); | |
39 | + return $arr; | |
39 | 40 | |
40 | 41 | } |
41 | 42 | ... | ... |
backend/components/parsers/config.php
1 | 1 | <?php |
2 | 2 | return [ |
3 | - 'global' => | |
4 | - ['ini' => ['upload_max_filesize' => '20M', | |
5 | - 'post_max_size integer' => '30M', | |
6 | - ]], | |
7 | 3 | 'csv' => |
8 | 4 | ['web' => |
9 | 5 | ['class' => 'backend\components\parsers\CustomCsvParser', |
... | ... | @@ -22,6 +18,27 @@ |
22 | 18 | "ADD_BOX"=> 'В пути', |
23 | 19 | "GROUP" => 'Группа RG' |
24 | 20 | ], |
21 | + 'console' => | |
22 | + ['class' => 'backend\components\parsers\CustomCsvParser', | |
23 | + 'auto_detect_first_line' => true, | |
24 | + 'hasHeaderRow' => true, | |
25 | + 'converter_conf' => ['class' => ' backend\components\parsers\CustomConverter', | |
26 | + 'hasKey' => 1, | |
27 | + 'configuration' => ["string" => 'DESCR', | |
28 | + "float" => 'PRICE', | |
29 | + "integer" => ['BOX','ADD_BOX'] | |
30 | + ] | |
31 | + ],], | |
32 | + | |
33 | + 'basic_column' => [ | |
34 | + "BRAND" => 'Бренд', | |
35 | + "ARTICLE"=> 'Артикул', | |
36 | + "PRICE" => 'Цена', | |
37 | + "DESCR" => 'Наименование', | |
38 | + "BOX" => 'Колво', | |
39 | + "ADD_BOX"=> 'В пути', | |
40 | + "GROUP" => 'Группа RG' | |
41 | + ], | |
25 | 42 | ], |
26 | 43 | 'xml' => |
27 | 44 | ['web' => | ... | ... |
backend/config/main.php
backend/controllers/CheckPriceController.php
... | ... | @@ -8,8 +8,8 @@ use yii\filters\AccessControl; |
8 | 8 | use backend\components\base\BaseController; |
9 | 9 | use yii\filters\VerbFilter; |
10 | 10 | use backend\models\Details; |
11 | -use backend\models\ImporterFiles; | |
12 | -use backend\models\Importer; | |
11 | +use backend\models\ImportersFiles; | |
12 | +use backend\models\Importers; | |
13 | 13 | use yii\base\ErrorException; |
14 | 14 | |
15 | 15 | use common\components\CustomVarDamp; |
... | ... | @@ -66,7 +66,11 @@ class CheckPriceController extends BaseController |
66 | 66 | } |
67 | 67 | |
68 | 68 | //$query = (new Query())->select('*')->from('{{%importer_files}}')->where(['not', ['time_end' => null]])->orderBy(['upload_time' => SORT_DESC]); |
69 | +<<<<<<< HEAD | |
69 | 70 | $query = Importer::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]); |
71 | +======= | |
72 | + $query = Importers::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]); | |
73 | +>>>>>>> ead5cb60ac983cdb680ec70731de195b537be6cd | |
70 | 74 | |
71 | 75 | $provider = new ActiveDataProvider([ |
72 | 76 | 'query' => $query, | ... | ... |
backend/controllers/ParserController.php
... | ... | @@ -299,7 +299,7 @@ class ParserController extends BaseController |
299 | 299 | } |
300 | 300 | } else { |
301 | 301 | // Yii::$app->log-> |
302 | - // не дошли до конца по этому остаки вернем в кеш | |
302 | + // не дошли до конца по этому остатки вернем в кеш | |
303 | 303 | Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) ); |
304 | 304 | } |
305 | 305 | } | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace backend\models; | |
4 | + | |
5 | +use Yii; | |
6 | +use backend\components\base\BaseActiveRecord; | |
7 | + | |
8 | +/** | |
9 | + * This is the model class for table "{{%importer}}". | |
10 | + * | |
11 | + * @property integer $id | |
12 | + * @property string $code | |
13 | + * @property string $name | |
14 | + * @property string $name_price | |
15 | + * @property string $currency_id | |
16 | + * @property string $delivery | |
17 | + * @property string $email | |
18 | + * @property string $info | |
19 | + * @property integer $active | |
20 | + * @property integer $PARSER_IS_ACTIVE | |
21 | + * @property string $PARSER_COLUMN_COUNT | |
22 | + * @property string $PARSER_FIELD_BRAND | |
23 | + * @property string $PARSER_FIELD_ARTICLE | |
24 | + * @property integer $PARSER_FIELD_ARTICLE_PREFIX | |
25 | + * @property string $PARSER_FIELD_PRICE | |
26 | + * @property string $PARSER_FIELD_DESCR | |
27 | + * @property string $PARSER_FIELD_BOX | |
28 | + * @property string $PARSER_FIELD_ADD_BOX | |
29 | + * @property string $PARSER_FIELD_GROUP_RG | |
30 | + * @property string $PARSER_FIELD_SIGN | |
31 | + * @property double $PARSER_FIELD_MULTIPLIER | |
32 | + * @property string $price_date_update | |
33 | + */ | |
34 | +class Importers extends BaseActiveRecord | |
35 | +{ | |
36 | + | |
37 | + public function rules() | |
38 | + { | |
39 | + return [ | |
40 | + [['code', 'name', 'currency_id', 'delivery', 'price_date_update'], 'required'], | |
41 | + [['name_price', 'email', 'PARSER_FIELD_SIGN', 'info'], 'safe'], | |
42 | + [['currency_id', 'active', 'PARSER_IS_ACTIVE', 'PARSER_COLUMN_COUNT', 'PARSER_FIELD_BRAND', 'PARSER_FIELD_ARTICLE', 'PARSER_FIELD_ARTICLE_PREFIX', 'PARSER_FIELD_PRICE', 'PARSER_FIELD_DESCR', 'PARSER_FIELD_BOX', 'PARSER_FIELD_ADD_BOX', 'PARSER_FIELD_GROUP_RG'], 'integer'], | |
43 | + [['info'], 'string'], | |
44 | + [['PARSER_FIELD_MULTIPLIER'], 'number'], | |
45 | + [['code', 'name', 'name_price', 'delivery', 'email'], 'string', 'max' => 254], | |
46 | + [['PARSER_FIELD_SIGN'], 'string', 'max' => 1], | |
47 | + // [['price_date_update'], 'string', 'max' => 15], | |
48 | + [['code'], 'unique'], | |
49 | + [['name'], 'unique'] | |
50 | + ]; | |
51 | + } | |
52 | + | |
53 | + /** | |
54 | + * @inheritdoc | |
55 | + */ | |
56 | + public function attributeLabels() | |
57 | + { | |
58 | + return [ | |
59 | + 'id' => Yii::t('app', 'ID'), | |
60 | + 'code' => Yii::t('app', 'Code'), | |
61 | + 'name' => Yii::t('app', 'Name'), | |
62 | + 'name_price' => Yii::t('app', 'Name Price'), | |
63 | + 'currency_id' => Yii::t('app', 'Currency ID'), | |
64 | + 'delivery' => Yii::t('app', 'Delivery'), | |
65 | + 'email' => Yii::t('app', 'Email'), | |
66 | + 'info' => Yii::t('app', 'Info'), | |
67 | + 'active' => Yii::t('app', 'Active'), | |
68 | + 'PARSER_IS_ACTIVE' => Yii::t('app', 'Parser Is Active'), | |
69 | + 'PARSER_COLUMN_COUNT' => Yii::t('app', 'Parser Column Count'), | |
70 | + 'PARSER_FIELD_BRAND' => Yii::t('app', 'Parser Field Brand'), | |
71 | + 'PARSER_FIELD_ARTICLE' => Yii::t('app', 'Parser Field Article'), | |
72 | + 'PARSER_FIELD_ARTICLE_PREFIX' => Yii::t('app', 'Parser Field Article Prefix'), | |
73 | + 'PARSER_FIELD_PRICE' => Yii::t('app', 'Parser Field Price'), | |
74 | + 'PARSER_FIELD_DESCR' => Yii::t('app', 'Parser Field Descr'), | |
75 | + 'PARSER_FIELD_BOX' => Yii::t('app', 'Parser Field Box'), | |
76 | + 'PARSER_FIELD_ADD_BOX' => Yii::t('app', 'Parser Field Add Box'), | |
77 | + 'PARSER_FIELD_GROUP_RG' => Yii::t('app', 'Parser Field Group Rg'), | |
78 | + 'PARSER_FIELD_SIGN' => Yii::t('app', 'Parser Field Sign'), | |
79 | + 'PARSER_FIELD_MULTIPLIER' => Yii::t('app', 'Parser Field Multiplier'), | |
80 | + 'price_date_update' => Yii::t('app', 'Price Date Update'), | |
81 | + ]; | |
82 | + } | |
83 | + | |
84 | + | |
85 | + public function getKeys () | |
86 | + { | |
87 | + // возьмем только поля описанные в fields() - там как раз наши настройки парсера | |
88 | + $arr = $this->toArray(); | |
89 | + // отсортируем по ключам с учетом преобразования в число | |
90 | + asort($arr, SORT_NUMERIC); | |
91 | + // уберем нулевые колонки | |
92 | + $arr = array_filter($arr, function($val){ | |
93 | + return $val <> '0'; | |
94 | + }); | |
95 | + // нам нужны именно ключи | |
96 | + $arr = array_keys($arr); | |
97 | + return $arr; | |
98 | + | |
99 | + } | |
100 | + | |
101 | + public function fields() | |
102 | + { | |
103 | + return [ | |
104 | + 'BRAND' => 'PARSER_FIELD_BRAND', | |
105 | + 'ARTICLE' => 'PARSER_FIELD_ARTICLE', | |
106 | + 'PRICE' => 'PARSER_FIELD_PRICE', | |
107 | + 'DESCR' => 'PARSER_FIELD_DESCR', | |
108 | + 'BOX' => 'PARSER_FIELD_BOX', | |
109 | + 'ADD_BOX' => 'PARSER_FIELD_ADD_BOX', | |
110 | + 'GROUP_RG' => 'PARSER_FIELD_GROUP_RG' | |
111 | + ]; | |
112 | + | |
113 | + } | |
114 | + | |
115 | + | |
116 | +} | ... | ... |
1 | +<?php | |
2 | + | |
3 | +/* @var $this yii\web\View */ | |
4 | +/* @var $name string */ | |
5 | +/* @var $message string */ | |
6 | +/* @var $exception Exception */ | |
7 | + | |
8 | +use yii\helpers\Html; | |
9 | + | |
10 | +$this->title = $name; | |
11 | +?> | |
12 | +<div class="site-error"> | |
13 | + | |
14 | + <h1><?= Html::encode($this->title) ?></h1> | |
15 | + | |
16 | + <div class="alert alert-danger"> | |
17 | + <?= nl2br(Html::encode($message)) ?> | |
18 | + </div> | |
19 | + | |
20 | + <p> | |
21 | + | |
22 | + </p> | |
23 | + <p> | |
24 | + </p> | |
25 | + | |
26 | +</div> | ... | ... |
backend/views/parser/index.php
1 | 1 | <?php |
2 | 2 | use yii\widgets\ActiveForm; |
3 | 3 | use yii\helpers\Html; |
4 | -use backend\models\Importer; | |
4 | +use backend\models\Importers; | |
5 | 5 | use yii\helpers\ArrayHelper; |
6 | 6 | if ( $model->mode ) { |
7 | 7 | // авто загрузка |
... | ... | @@ -27,7 +27,7 @@ if ( $model->mode ) { |
27 | 27 | <h3>Загрузка прайсов поставщиков</h3> |
28 | 28 | |
29 | 29 | |
30 | - <?= $form->field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importer::find()->all(), 'id','name' )); ?> | |
30 | + <?= $form->field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->all(), 'id','name' )); ?> | |
31 | 31 | |
32 | 32 | <?php if ( !$mode ) { |
33 | 33 | echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']); | ... | ... |
backend/views/parser/server-files.php
1 | 1 | <?php |
2 | 2 | use yii\helpers\Html; |
3 | +use yii\helpers\Url; | |
3 | 4 | use yii\grid\GridView; |
4 | 5 | use yii\grid\SerialColumn; |
5 | 6 | use yii\grid\ActionColumn; |
... | ... | @@ -44,7 +45,7 @@ Pjax::begin(['id' => 'server_files_grid']); |
44 | 45 | |
45 | 46 | ]] );?> |
46 | 47 | |
47 | - | |
48 | + <?= Html::a('Загрузить файлы', ['parse'],['class' => 'btn btn-success']) ?> | |
48 | 49 | |
49 | 50 | </div> |
50 | 51 | <?php | ... | ... |
1 | +<?php | |
2 | +/** | |
3 | + * Created by PhpStorm. | |
4 | + * User: Cibermag | |
5 | + * Date: 30.09.2015 | |
6 | + * Time: 9:34 | |
7 | + */ | |
8 | + | |
9 | +namespace common\components; | |
10 | + | |
11 | + | |
12 | +use yii\base\ErrorException; | |
13 | +use backend\models\ImportersFiles; | |
14 | +use backend\models\Importers; | |
15 | +use backend\models\Details; | |
16 | + | |
17 | +class PriceWriter { | |
18 | + public $mode; | |
19 | + public $configuration; | |
20 | + public $data; | |
21 | + // public $errors = []; | |
22 | + | |
23 | + public function writeDataToDB () | |
24 | + { | |
25 | + // 1. запишем дату старта в таблицу файлов поставщика (ImportersFiles) | |
26 | + // id загруженного файла получим из конфигурации | |
27 | + $files_model = ImportersFiles::findOne( $this->configuration['record_id'] ); | |
28 | + | |
29 | + //$files_model->load(['ImportersFiles' => $this->configuration->toArray()]); | |
30 | + $update_date = date('Y-m-d H:i:s'); | |
31 | + $files_model->time_start = $update_date; | |
32 | + // запишем дату начала загрузки | |
33 | + if (!$files_model->save()) { | |
34 | + $this->errors[] = implode( ', ', $files_model->getErrors()); | |
35 | + return false; | |
36 | + //CustomVarDamp::dumpAndDie($files_model->implode ( ', ', getErrors())()); | |
37 | + } | |
38 | + | |
39 | + | |
40 | + // 2. запишем полученные данные в таблицу товаров (Details) | |
41 | + $details_model = new Details(); | |
42 | + // преобразуем числовые значения | |
43 | + foreach ($this->data as &$row) { | |
44 | + $row['PRICE'] = \Yii::$app->multiparser->convertToFloat($row['PRICE']); | |
45 | + $row['BOX'] = \Yii::$app->multiparser->convertToInteger($row['BOX']); | |
46 | + // присвоим полный артикул | |
47 | + $row['FULL_ARTICLE'] = $row['ARTICLE']; | |
48 | + if(isset($row['ADD_BOX'])) | |
49 | + $row['ADD_BOX'] = \Yii::$app->multiparser->convertToInteger($row['ADD_BOX']); | |
50 | + | |
51 | + // проверим все ли обязательные колонки были указаны пользователем | |
52 | + $details_model->load(['Details' => $row]); | |
53 | + | |
54 | + if (!$details_model->validate()) | |
55 | + break; | |
56 | + } | |
57 | + | |
58 | + if ($details_model->hasErrors()) { | |
59 | + //@todo предоставить более детальную информацию об ошибке | |
60 | + throw new \ErrorException('Ошибка записи товаров'); | |
61 | + } | |
62 | + else{ | |
63 | + // дополним данные значением импортера и даты обновления цены | |
64 | + $this->data = \Yii::$app->multiparser->addColumns($this->data, ['IMPORT_ID' => $this->configuration['importer_id'], 'timestamp' => $update_date]); | |
65 | + | |
66 | + try { | |
67 | + //@todo add transaction | |
68 | + // попытаемся вставить данные в БД с апдейтом по ключам | |
69 | + $details_model->ManualInsert($this->data); | |
70 | + | |
71 | + // 3. зафиксируем дату конца загрузки в файлах поставщика | |
72 | + | |
73 | + $files_model->time_end = date('Y-m-d H:i:s'); | |
74 | + // CustomVarDamp::dumpAndDie($files_model); | |
75 | + if (!$files_model->save()) { | |
76 | + throw new \ErrorException(implode( ', ', $files_model->getErrors())); | |
77 | +// $this->errors[] = $files_model->implode ( ', ', getErrors()); | |
78 | +// return false; | |
79 | + // CustomVarDamp::dumpAndDie($files_model->implode ( ', ', getErrors())()); | |
80 | + } | |
81 | + | |
82 | + // 4. зафиксируем дату загрузки в таблице поставщиков | |
83 | + $imp_model = Importers::findOne($this->configuration['importer_id']); | |
84 | + $imp_model->price_date_update = $update_date; | |
85 | + | |
86 | + if (!$imp_model->save()) { | |
87 | +// $this->errors[] = $imp_model->implode ( ', ', getErrors())(); | |
88 | +// return false; | |
89 | + throw new \ErrorException(implode( ', ', $imp_model->getErrors())); | |
90 | + // CustomVarDamp::dumpAndDie($imp_model->implode ( ', ', getErrors())()); | |
91 | + } | |
92 | + | |
93 | + | |
94 | + } catch (ErrorException $e) { | |
95 | + //CustomVarDamp::dump($e->getMessage()); | |
96 | + throw new \ErrorException( $e->getMessage() ); | |
97 | + } | |
98 | + } | |
99 | + | |
100 | + | |
101 | + return true; | |
102 | + } | |
103 | +} | |
0 | 104 | \ No newline at end of file | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace common\models; | |
4 | + | |
5 | +use Yii; | |
6 | + | |
7 | +/** | |
8 | + * This is the model class for table "w_accounts". | |
9 | + * | |
10 | + * @property integer $id | |
11 | + * @property integer $if_manager | |
12 | + * @property string $email | |
13 | + * @property string $pass | |
14 | + * @property integer $margin_id | |
15 | + * @property string $name | |
16 | + * @property string $phones | |
17 | + * @property integer $country | |
18 | + * @property integer $city | |
19 | + * @property string $address | |
20 | + * @property string $comment | |
21 | + * @property integer $rating | |
22 | + * @property string $dt | |
23 | + * @property integer $is_active | |
24 | + * @property integer $is_firm | |
25 | + * @property string $last_loginin | |
26 | + * @property string $firm_inn | |
27 | + * @property string $firm_bank | |
28 | + * @property double $balance | |
29 | + * @property integer $office_id | |
30 | + * @property integer $is_scribe | |
31 | + * @property integer $set_manager_id | |
32 | + * @property string $phones2 | |
33 | + * @property string $phones3 | |
34 | + * @property integer $car | |
35 | + * @property integer $mod | |
36 | + * @property string $snumb | |
37 | + * @property integer $deliveries | |
38 | + * @property integer $scode | |
39 | + * @property string $firm_ur_adr | |
40 | + * @property string $firm_fiz_adr | |
41 | + * @property string $firm_code_eg | |
42 | + * @property string $firm_rs | |
43 | + * @property string $firm_mfo | |
44 | + * @property string $firm_site | |
45 | + * @property string $company | |
46 | + */ | |
47 | +class WAccounts extends \yii\db\ActiveRecord | |
48 | +{ | |
49 | + /** | |
50 | + * @inheritdoc | |
51 | + */ | |
52 | + public static function tableName() | |
53 | + { | |
54 | + return 'w_accounts'; | |
55 | + } | |
56 | + | |
57 | + /** | |
58 | + * @inheritdoc | |
59 | + */ | |
60 | + public function rules() | |
61 | + { | |
62 | + return [ | |
63 | + [['if_manager', 'margin_id', 'country', 'city', 'rating', 'dt', 'is_active', 'is_firm', 'office_id', 'is_scribe', 'set_manager_id', 'car', 'mod', 'deliveries', 'scode'], 'integer'], | |
64 | + [['email', 'pass', 'name', 'phones', 'comment', 'dt', 'set_manager_id'], 'required'], | |
65 | + [['comment'], 'string'], | |
66 | + [['balance'], 'number'], | |
67 | + [['email', 'name', 'firm_site'], 'string', 'max' => 150], | |
68 | + [['pass'], 'string', 'max' => 30], | |
69 | + [['phones', 'phones2', 'phones3'], 'string', 'max' => 50], | |
70 | + [['address', 'firm_inn', 'firm_bank'], 'string', 'max' => 254], | |
71 | + [['last_loginin'], 'string', 'max' => 15], | |
72 | + [['snumb', 'firm_ur_adr', 'firm_fiz_adr', 'firm_code_eg', 'firm_rs', 'firm_mfo', 'company'], 'string', 'max' => 255], | |
73 | + [['email'], 'unique'] | |
74 | + ]; | |
75 | + } | |
76 | + | |
77 | + /** | |
78 | + * @inheritdoc | |
79 | + */ | |
80 | + public function attributeLabels() | |
81 | + { | |
82 | + return [ | |
83 | + 'id' => Yii::t('app', 'ID'), | |
84 | + 'if_manager' => Yii::t('app', 'If Manager'), | |
85 | + 'email' => Yii::t('app', 'Email'), | |
86 | + 'pass' => Yii::t('app', 'Pass'), | |
87 | + 'margin_id' => Yii::t('app', 'Margin ID'), | |
88 | + 'name' => Yii::t('app', 'Name'), | |
89 | + 'phones' => Yii::t('app', 'Phones'), | |
90 | + 'country' => Yii::t('app', 'Country'), | |
91 | + 'city' => Yii::t('app', 'City'), | |
92 | + 'address' => Yii::t('app', 'Address'), | |
93 | + 'comment' => Yii::t('app', 'Comment'), | |
94 | + 'rating' => Yii::t('app', 'Rating'), | |
95 | + 'dt' => Yii::t('app', 'Dt'), | |
96 | + 'is_active' => Yii::t('app', 'Is Active'), | |
97 | + 'is_firm' => Yii::t('app', 'Is Firm'), | |
98 | + 'last_loginin' => Yii::t('app', 'Last Loginin'), | |
99 | + 'firm_inn' => Yii::t('app', 'Firm Inn'), | |
100 | + 'firm_bank' => Yii::t('app', 'Firm Bank'), | |
101 | + 'balance' => Yii::t('app', 'Balance'), | |
102 | + 'office_id' => Yii::t('app', 'Office ID'), | |
103 | + 'is_scribe' => Yii::t('app', 'Is Scribe'), | |
104 | + 'set_manager_id' => Yii::t('app', 'Set Manager ID'), | |
105 | + 'phones2' => Yii::t('app', 'Phones2'), | |
106 | + 'phones3' => Yii::t('app', 'Phones3'), | |
107 | + 'car' => Yii::t('app', 'Car'), | |
108 | + 'mod' => Yii::t('app', 'Mod'), | |
109 | + 'snumb' => Yii::t('app', 'Snumb'), | |
110 | + 'deliveries' => Yii::t('app', 'Deliveries'), | |
111 | + 'scode' => Yii::t('app', 'Scode'), | |
112 | + 'firm_ur_adr' => Yii::t('app', 'Firm Ur Adr'), | |
113 | + 'firm_fiz_adr' => Yii::t('app', 'Firm Fiz Adr'), | |
114 | + 'firm_code_eg' => Yii::t('app', 'Firm Code Eg'), | |
115 | + 'firm_rs' => Yii::t('app', 'Firm Rs'), | |
116 | + 'firm_mfo' => Yii::t('app', 'Firm Mfo'), | |
117 | + 'firm_site' => Yii::t('app', 'Firm Site'), | |
118 | + 'company' => Yii::t('app', 'Company'), | |
119 | + ]; | |
120 | + } | |
121 | +} | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace common\models; | |
4 | + | |
5 | +use Yii; | |
6 | +use yii\base\Model; | |
7 | +use yii\data\ActiveDataProvider; | |
8 | +use common\models\WAccounts; | |
9 | + | |
10 | +/** | |
11 | + * WAccountsSearch represents the model behind the search form about `common\models\WAccounts`. | |
12 | + */ | |
13 | +class WAccountsSearch extends WAccounts | |
14 | +{ | |
15 | + /** | |
16 | + * @inheritdoc | |
17 | + */ | |
18 | + public function rules() | |
19 | + { | |
20 | + return [ | |
21 | + [['id', 'if_manager', 'margin_id', 'country', 'city', 'rating', 'dt', 'is_active', 'is_firm', 'office_id', 'is_scribe', 'set_manager_id', 'car', 'mod', 'deliveries', 'scode'], 'integer'], | |
22 | + [['email', 'pass', 'name', 'phones', 'address', 'comment', 'last_loginin', 'firm_inn', 'firm_bank', 'phones2', 'phones3', 'snumb', 'firm_ur_adr', 'firm_fiz_adr', 'firm_code_eg', 'firm_rs', 'firm_mfo', 'firm_site', 'company'], 'safe'], | |
23 | + [['balance'], 'number'], | |
24 | + ]; | |
25 | + } | |
26 | + | |
27 | + /** | |
28 | + * @inheritdoc | |
29 | + */ | |
30 | + public function scenarios() | |
31 | + { | |
32 | + // bypass scenarios() implementation in the parent class | |
33 | + return Model::scenarios(); | |
34 | + } | |
35 | + | |
36 | + /** | |
37 | + * Creates data provider instance with search query applied | |
38 | + * | |
39 | + * @param array $params | |
40 | + * | |
41 | + * @return ActiveDataProvider | |
42 | + */ | |
43 | + public function search($params) | |
44 | + { | |
45 | + $query = WAccounts::find(); | |
46 | + | |
47 | + $dataProvider = new ActiveDataProvider([ | |
48 | + 'query' => $query, | |
49 | + ]); | |
50 | + | |
51 | + $this->load($params); | |
52 | + | |
53 | + if (!$this->validate()) { | |
54 | + // uncomment the following line if you do not want to return any records when validation fails | |
55 | + // $query->where('0=1'); | |
56 | + return $dataProvider; | |
57 | + } | |
58 | + | |
59 | + $query->andFilterWhere([ | |
60 | + 'id' => $this->id, | |
61 | + 'if_manager' => $this->if_manager, | |
62 | + 'margin_id' => $this->margin_id, | |
63 | + 'country' => $this->country, | |
64 | + 'city' => $this->city, | |
65 | + 'rating' => $this->rating, | |
66 | + 'dt' => $this->dt, | |
67 | + 'is_active' => $this->is_active, | |
68 | + 'is_firm' => $this->is_firm, | |
69 | + 'balance' => $this->balance, | |
70 | + 'office_id' => $this->office_id, | |
71 | + 'is_scribe' => $this->is_scribe, | |
72 | + 'set_manager_id' => $this->set_manager_id, | |
73 | + 'car' => $this->car, | |
74 | + 'mod' => $this->mod, | |
75 | + 'deliveries' => $this->deliveries, | |
76 | + 'scode' => $this->scode, | |
77 | + ]); | |
78 | + | |
79 | + $query->andFilterWhere(['like', 'email', $this->email]) | |
80 | + ->andFilterWhere(['like', 'pass', $this->pass]) | |
81 | + ->andFilterWhere(['like', 'name', $this->name]) | |
82 | + ->andFilterWhere(['like', 'phones', $this->phones]) | |
83 | + ->andFilterWhere(['like', 'address', $this->address]) | |
84 | + ->andFilterWhere(['like', 'comment', $this->comment]) | |
85 | + ->andFilterWhere(['like', 'last_loginin', $this->last_loginin]) | |
86 | + ->andFilterWhere(['like', 'firm_inn', $this->firm_inn]) | |
87 | + ->andFilterWhere(['like', 'firm_bank', $this->firm_bank]) | |
88 | + ->andFilterWhere(['like', 'phones2', $this->phones2]) | |
89 | + ->andFilterWhere(['like', 'phones3', $this->phones3]) | |
90 | + ->andFilterWhere(['like', 'snumb', $this->snumb]) | |
91 | + ->andFilterWhere(['like', 'firm_ur_adr', $this->firm_ur_adr]) | |
92 | + ->andFilterWhere(['like', 'firm_fiz_adr', $this->firm_fiz_adr]) | |
93 | + ->andFilterWhere(['like', 'firm_code_eg', $this->firm_code_eg]) | |
94 | + ->andFilterWhere(['like', 'firm_rs', $this->firm_rs]) | |
95 | + ->andFilterWhere(['like', 'firm_mfo', $this->firm_mfo]) | |
96 | + ->andFilterWhere(['like', 'firm_site', $this->firm_site]) | |
97 | + ->andFilterWhere(['like', 'company', $this->company]); | |
98 | + | |
99 | + return $dataProvider; | |
100 | + } | |
101 | +} | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace common\models; | |
4 | + | |
5 | +use Yii; | |
6 | + | |
7 | +/** | |
8 | + * This is the model class for table "w_dic_cities". | |
9 | + * | |
10 | + * @property integer $id | |
11 | + * @property string $name | |
12 | + * @property integer $is_active | |
13 | + * @property integer $parent | |
14 | + */ | |
15 | +class WDicCities extends \yii\db\ActiveRecord | |
16 | +{ | |
17 | + /** | |
18 | + * @inheritdoc | |
19 | + */ | |
20 | + public static function tableName() | |
21 | + { | |
22 | + return 'w_dic_cities'; | |
23 | + } | |
24 | + | |
25 | + /** | |
26 | + * @inheritdoc | |
27 | + */ | |
28 | + public function rules() | |
29 | + { | |
30 | + return [ | |
31 | + [['name', 'parent'], 'required'], | |
32 | + [['is_active', 'parent'], 'integer'], | |
33 | + [['name'], 'string', 'max' => 254], | |
34 | + [['parent', 'name'], 'unique', 'targetAttribute' => ['parent', 'name'], 'message' => 'The combination of Name and Parent has already been taken.'] | |
35 | + ]; | |
36 | + } | |
37 | + | |
38 | + /** | |
39 | + * @inheritdoc | |
40 | + */ | |
41 | + public function attributeLabels() | |
42 | + { | |
43 | + return [ | |
44 | + 'id' => Yii::t('app', 'ID'), | |
45 | + 'name' => Yii::t('app', 'Name'), | |
46 | + 'is_active' => Yii::t('app', 'Is Active'), | |
47 | + 'parent' => Yii::t('app', 'Parent'), | |
48 | + ]; | |
49 | + } | |
50 | +} | ... | ... |
console/config/main.php
... | ... | @@ -18,8 +18,14 @@ return [ |
18 | 18 | 'class' => 'yii\log\FileTarget', |
19 | 19 | 'levels' => ['error', 'warning'], |
20 | 20 | ], |
21 | - ], | |
21 | + [ | |
22 | + 'class' => 'yii\log\FileTarget', | |
23 | + 'logFile' => 'C:\xampp\htdocs\ital\console\runtime\logs\parser.log', | |
24 | + 'levels' => ['info', 'error'], | |
25 | + // 'categories' => ['parser'], | |
26 | + ], | |
22 | 27 | ], |
23 | 28 | ], |
24 | 29 | 'params' => $params, |
30 | +] | |
25 | 31 | ]; | ... | ... |
1 | +<?php | |
2 | +namespace console\controllers; | |
3 | + | |
4 | +use yii\console\Controller; | |
5 | +use yii\helpers\Console; | |
6 | +use common\components\PriceWriter; | |
7 | +use backend\models\ImportersFiles; | |
8 | + | |
9 | +class ParserController extends Controller{ | |
10 | + public function actionParseCSV () | |
11 | + { | |
12 | + \common\components\CustomVarDamp::dumpAndDie(45); | |
13 | + if( $arr_id_files = Yii::$app->cache->get( 'files_to_parse' ) ) { | |
14 | + $arr_id_files = json_decode( $arr_id_files ); | |
15 | + foreach ( $arr_id_files as $file_name ) { | |
16 | + $file_path = Yii::getAlias('@auto_upload') . '/' . $file_name . '.csv'; | |
17 | + $config = ['record_id' => $file_name, | |
18 | + 'importer_id' => ImportersFiles::findOne(['id' => $file_name])->id, | |
19 | + 'parser_config' => ['keys' => ['DESCR', 'ARTICLE', 'BRAND', 'PRICE', 'BOX']] | |
20 | + ]; | |
21 | + if( $this->parseFileConsole( $file_path, $config ) ){ | |
22 | + unlink( $file_path ); | |
23 | + if (isset( $arr_id_files[$file_path] ) ) { | |
24 | + unset($arr_id_files[$file_path]); | |
25 | + } | |
26 | + } else { | |
27 | + // Yii::$app->log-> | |
28 | + // не дошли до конца по этому остаки вернем в кеш | |
29 | + Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) ); | |
30 | + } | |
31 | + } | |
32 | + if ( !count( $arr_id_files ) ) { | |
33 | + Yii::$app->cache->delete( 'files_to_parse' ); | |
34 | + } | |
35 | + } | |
36 | + } | |
37 | + public function actionParseXML () | |
38 | + { | |
39 | + | |
40 | + } | |
41 | + protected function parseFileConsole( $file_path, $configuration ){ | |
42 | + $parser_config = []; | |
43 | + if ( isset( $configuration['parser_config'] ) ) { | |
44 | + $parser_config = $configuration['parser_config']; | |
45 | + } | |
46 | + | |
47 | + $data = Yii::$app->multiparser->parse( $file_path, $parser_config ); | |
48 | + | |
49 | + $writer = new PriceWriter(); | |
50 | + $writer->configuration = $configuration; | |
51 | + $writer->data = $data; | |
52 | + $writer->mode = 1; //console-режим | |
53 | + if ( $writer->writeDataToDB() ){ | |
54 | + Console::output('It is working'); | |
55 | + return true; | |
56 | + } | |
57 | + | |
58 | + return false; | |
59 | + } | |
60 | + | |
61 | + public function actionTest () | |
62 | + { | |
63 | + // Console::output('It is working '); | |
64 | + \Yii::warning('1'); | |
65 | + \Yii::info('2'); | |
66 | +// \Yii::info('3'); | |
67 | +// \Yii::warning('4'); | |
68 | + | |
69 | + } | |
70 | +} | |
0 | 71 | \ No newline at end of file | ... | ... |
console/migrations/m150925_111922_add_foreign_key_ImportFiles.php
... | ... | @@ -2,17 +2,29 @@ |
2 | 2 | |
3 | 3 | use yii\db\Schema; |
4 | 4 | use yii\db\Migration; |
5 | +use backend\models\ImportersFiles; | |
5 | 6 | |
6 | 7 | class m150925_111922_add_foreign_key_ImportFiles extends Migration |
7 | 8 | { |
8 | - public function up() | |
9 | + public function safeUp() | |
9 | 10 | { |
10 | - $this->addForeignKey('importer_fk', '{{%importer_files}}', 'importer_id', '{{%importer}}', 'id'); | |
11 | + // сначала отберем записи которых нет уже в поставщиках | |
12 | + $id_arr = (new \yii\db\Query()) | |
13 | + ->select(['{{%importers_files}}.id']) | |
14 | + ->from('{{%importers_files}}') | |
15 | + ->leftJoin('{{%importers}}', 'importer_id = {{%importers}}.id') | |
16 | + ->where(['name' => null]) | |
17 | + ->all(); | |
18 | + $id_arr = array_column($id_arr,'id'); | |
19 | + // удалим их | |
20 | + $this->delete('{{%importers_files}}',['id' => $id_arr]); | |
21 | + | |
22 | + $this->addForeignKey('importer_fk', '{{%importers_files}}', 'importer_id', '{{%importers}}', 'id'); | |
11 | 23 | } |
12 | 24 | |
13 | 25 | public function down() |
14 | 26 | { |
15 | - $this->dropForeignKey('importer_fk', '{{%importer_files}}'); | |
27 | + $this->dropForeignKey('importer_fk', '{{%importers_files}}'); | |
16 | 28 | } |
17 | 29 | |
18 | 30 | } | ... | ... |
console/migrations/m150929_110456_addTempTableUser.php
0 → 100644
1 | +<?php | |
2 | + | |
3 | +use yii\db\Schema; | |
4 | +use yii\db\Migration; | |
5 | + | |
6 | +class m150929_110456_addTempTableUser extends Migration | |
7 | +{ | |
8 | + public function up() | |
9 | + { | |
10 | + $tableOptions = null; | |
11 | + if ($this->db->driverName === 'mysql') { | |
12 | + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci | |
13 | + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; | |
14 | + } | |
15 | + | |
16 | + $this->createTable('user', [ | |
17 | + 'id' => $this->primaryKey(), | |
18 | + 'username' => $this->string()->notNull()->unique(), | |
19 | + 'auth_key' => $this->string(32)->notNull(), | |
20 | + 'password_hash' => $this->string()->notNull(), | |
21 | + 'password_reset_token' => $this->string()->unique(), | |
22 | + 'email' => $this->string()->notNull()->unique(), | |
23 | + | |
24 | + 'status' => $this->smallInteger()->notNull()->defaultValue(10), | |
25 | + 'created_at' => $this->integer()->notNull(), | |
26 | + 'updated_at' => $this->integer()->notNull(), | |
27 | + ], $tableOptions); | |
28 | + | |
29 | + $user_array = [ | |
30 | + 'username' => 'admin', | |
31 | + 'auth_key' => 'admin', | |
32 | + 'password_hash' => Yii::$app->security->generatePasswordHash('admin'), | |
33 | + 'password_reset_token' => 'admin', | |
34 | + 'email'=> 'admin@test.com', | |
35 | + 'status' => '10', | |
36 | + 'created_at'=>'000000', | |
37 | + 'updated_at' => '000000' | |
38 | + ]; | |
39 | + $this->insert('user', $user_array); | |
40 | + } | |
41 | + | |
42 | + public function down() | |
43 | + { | |
44 | + $this->dropTable('user'); | |
45 | + } | |
46 | +} | ... | ... |
console/migrations/m150929_113358_change_Importer_dataPrice.php
0 → 100644
1 | +<?php | |
2 | + | |
3 | +use yii\db\Schema; | |
4 | +use yii\db\Migration; | |
5 | + | |
6 | +class m150929_113358_change_Importer_dataPrice extends Migration | |
7 | +{ | |
8 | + public function safeUp() | |
9 | + { | |
10 | + // увеличим размерность строки, так как при преобразовании из таймстампа в дату может не хватить символов | |
11 | + $this->alterColumn('{{%importers}}','price_date_update','VARCHAR(80)' ); | |
12 | + // конвертем в дату | |
13 | + $this->update('{{%importers}}',['price_date_update'=> new yii\db\Expression('FROM_UNIXTIME(price_date_update)')]); | |
14 | + // а из даты в таймстамп | |
15 | + $this->alterColumn('{{%importers}}','price_date_update','TIMESTAMP NOT NULL' ); | |
16 | + $this->createIndex('price_date', '{{%importers}}', 'price_date_update', false); | |
17 | + | |
18 | + } | |
19 | + | |
20 | + | |
21 | + public function safedown() | |
22 | + { | |
23 | + $this->alterColumn('{{%importers}}','price_date','varchar(15)' ); | |
24 | + $this->dropIndex('price_date', '{{%importers}}'); | |
25 | + } | |
26 | + | |
27 | +} | ... | ... |
framework/core/Convert.php
... | ... | @@ -166,63 +166,63 @@ class Convert { |
166 | 166 | } |
167 | 167 | |
168 | 168 | /** |
169 | - * Converts an XML string to a PHP array | |
170 | - * See http://phpsecurity.readthedocs.org/en/latest/Injection-Attacks.html#xml-external-entity-injection | |
171 | - * | |
172 | - * @uses recursiveXMLToArray() | |
173 | - * @param string $val | |
174 | - * @param boolean $disableDoctypes Disables the use of DOCTYPE, and will trigger an error if encountered. | |
175 | - * false by default. | |
176 | - * @param boolean $disableExternals Disables the loading of external entities. false by default. | |
177 | - * @return array | |
178 | - */ | |
179 | - public static function xml2array($val, $disableDoctypes = false, $disableExternals = false) { | |
180 | - // Check doctype | |
181 | - if($disableDoctypes && preg_match('/\<\!DOCTYPE.+]\>/', $val)) { | |
182 | - throw new InvalidArgumentException('XML Doctype parsing disabled'); | |
183 | - } | |
169 | + * Converts an XML string to a PHP array | |
170 | + * See http://phpsecurity.readthedocs.org/en/latest/Injection-Attacks.html#xml-external-entity-injection | |
171 | + * | |
172 | + * @uses recursiveXMLToArray() | |
173 | + * @param string $val | |
174 | + * @param boolean $disableDoctypes Disables the use of DOCTYPE, and will trigger an error if encountered. | |
175 | + * false by default. | |
176 | + * @param boolean $disableExternals Disables the loading of external entities. false by default. | |
177 | + * @return array | |
178 | + */ | |
179 | + public static function xml2array($val, $disableDoctypes = false, $disableExternals = false) { | |
180 | + // Check doctype | |
181 | + if($disableDoctypes && preg_match('/\<\!DOCTYPE.+]\>/', $val)) { | |
182 | + throw new InvalidArgumentException('XML Doctype parsing disabled'); | |
183 | + } | |
184 | 184 | |
185 | - // Disable external entity loading | |
186 | - if($disableExternals) $oldVal = libxml_disable_entity_loader($disableExternals); | |
187 | - try { | |
188 | - $xml = new SimpleXMLElement($val); | |
189 | - $result = self::recursiveXMLToArray($xml); | |
190 | - } catch(Exception $ex) { | |
191 | - if($disableExternals) libxml_disable_entity_loader($oldVal); | |
192 | - throw $ex; | |
193 | - } | |
194 | - if($disableExternals) libxml_disable_entity_loader($oldVal); | |
195 | - return $result; | |
196 | - } | |
185 | + // Disable external entity loading | |
186 | + if($disableExternals) $oldVal = libxml_disable_entity_loader($disableExternals); | |
187 | + try { | |
188 | + $xml = new SimpleXMLElement($val); | |
189 | + $result = self::recursiveXMLToArray($xml); | |
190 | + } catch(Exception $ex) { | |
191 | + if($disableExternals) libxml_disable_entity_loader($oldVal); | |
192 | + throw $ex; | |
193 | + } | |
194 | + if($disableExternals) libxml_disable_entity_loader($oldVal); | |
195 | + return $result; | |
196 | + } | |
197 | 197 | |
198 | - /** | |
199 | - * Convert a XML string to a PHP array recursively. Do not | |
200 | - * call this function directly, Please use {@link Convert::xml2array()} | |
201 | - * | |
202 | - * @param SimpleXMLElement | |
203 | - * | |
204 | - * @return mixed | |
205 | - */ | |
206 | - protected static function recursiveXMLToArray($xml) { | |
207 | - if(is_object($xml) && get_class($xml) == 'SimpleXMLElement') { | |
208 | - $attributes = $xml->attributes(); | |
209 | - foreach($attributes as $k => $v) { | |
210 | - if($v) $a[$k] = (string) $v; | |
211 | - } | |
212 | - $x = $xml; | |
213 | - $xml = get_object_vars($xml); | |
214 | - } | |
215 | - if(is_array($xml)) { | |
216 | - if(count($xml) == 0) return (string) $x; // for CDATA | |
217 | - foreach($xml as $key => $value) { | |
218 | - $r[$key] = self::recursiveXMLToArray($value); | |
219 | - } | |
220 | - if(isset($a)) $r['@'] = $a; // Attributes | |
221 | - return $r; | |
222 | - } | |
223 | - | |
224 | - return (string) $xml; | |
225 | - } | |
198 | + /** | |
199 | + * Convert a XML string to a PHP array recursively. Do not | |
200 | + * call this function directly, Please use {@link Convert::xml2array()} | |
201 | + * | |
202 | + * @param SimpleXMLElement | |
203 | + * | |
204 | + * @return mixed | |
205 | + */ | |
206 | + protected static function recursiveXMLToArray($xml) { | |
207 | + if(is_object($xml) && get_class($xml) == 'SimpleXMLElement') { | |
208 | + $attributes = $xml->attributes(); | |
209 | + foreach($attributes as $k => $v) { | |
210 | + if($v) $a[$k] = (string) $v; | |
211 | + } | |
212 | + $x = $xml; | |
213 | + $xml = get_object_vars($xml); | |
214 | + } | |
215 | + if(is_array($xml)) { | |
216 | + if(count($xml) == 0) return (string) $x; // for CDATA | |
217 | + foreach($xml as $key => $value) { | |
218 | + $r[$key] = self::recursiveXMLToArray($value); | |
219 | + } | |
220 | + if(isset($a)) $r['@'] = $a; // Attributes | |
221 | + return $r; | |
222 | + } | |
223 | + | |
224 | + return (string) $xml; | |
225 | + } | |
226 | 226 | |
227 | 227 | /** |
228 | 228 | * Create a link if the string is a valid URL | ... | ... |
framework/lang/fr.yml
... | ... | @@ -403,7 +403,11 @@ fr: |
403 | 403 | DELETE: Supprime |
404 | 404 | DELETEDRECORDS: '{count} enregistrements supprimés.' |
405 | 405 | EMPTYBEFOREIMPORT: 'Remplacer les données' |
406 | +<<<<<<< HEAD | |
406 | 407 | IMPORT: 'Importer de CSV' |
408 | +======= | |
409 | + IMPORT: 'Importers de CSV' | |
410 | +>>>>>>> ead5cb60ac983cdb680ec70731de195b537be6cd | |
407 | 411 | IMPORTEDRECORDS: '{count} enregistrements importés.' |
408 | 412 | NOCSVFILE: 'Veuillez choisir un fichier CSV à importer' |
409 | 413 | NOIMPORT: 'Rien à importer' |
... | ... | @@ -417,9 +421,15 @@ fr: |
417 | 421 | IMPORTSPECTITLE: 'Spécification de %s' |
418 | 422 | ModelAdmin_Tools_ss: |
419 | 423 | FILTER: Filtrer |
424 | +<<<<<<< HEAD | |
420 | 425 | IMPORT: Importer |
421 | 426 | ModelSidebar_ss: |
422 | 427 | IMPORT_TAB_HEADER: Importer |
428 | +======= | |
429 | + IMPORT: Importers | |
430 | + ModelSidebar_ss: | |
431 | + IMPORT_TAB_HEADER: Importers | |
432 | +>>>>>>> ead5cb60ac983cdb680ec70731de195b537be6cd | |
423 | 433 | SEARCHLISTINGS: Rechercher |
424 | 434 | MoneyField: |
425 | 435 | FIELDLABELAMOUNT: Quantité | ... | ... |
vendor/yiisoft/multiparser/Converter.php
... | ... | @@ -7,6 +7,7 @@ |
7 | 7 | */ |
8 | 8 | |
9 | 9 | namespace yii\multiparser; |
10 | +use common\components\CustomVarDamp; | |
10 | 11 | use yii\base\Behavior; |
11 | 12 | |
12 | 13 | // класс который содержит преобразователи значений (фильтры) используемые при парсинге |
... | ... | @@ -19,7 +20,6 @@ class Converter extends Behavior |
19 | 20 | |
20 | 21 | public static function convertToFloat($value) |
21 | 22 | { |
22 | - echo 1; | |
23 | 23 | if ($value == '') { |
24 | 24 | $value = 0; |
25 | 25 | } |
... | ... | @@ -51,8 +51,6 @@ class Converter extends Behavior |
51 | 51 | |
52 | 52 | public static function convertToString($value) |
53 | 53 | { |
54 | - | |
55 | - | |
56 | 54 | $res = ''; |
57 | 55 | if (is_array($value)) { |
58 | 56 | |
... | ... | @@ -101,7 +99,7 @@ class Converter extends Behavior |
101 | 99 | public static function convertByConfiguration( $arr, $configuration ) |
102 | 100 | { |
103 | 101 | $result = $arr; |
104 | - //\common\components\CustomVarDamp::dumpAndDie($configuration); | |
102 | + // \common\components\CustomVarDamp::dumpAndDie( $result ); | |
105 | 103 | $hasKey = isset( $configuration['hasKey'] ); |
106 | 104 | foreach ( $configuration['configuration'] as $key => $value ) { |
107 | 105 | |
... | ... | @@ -111,7 +109,7 @@ class Converter extends Behavior |
111 | 109 | foreach ($value as $sub_value) { |
112 | 110 | if (isset($arr[$sub_value])) { |
113 | 111 | // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле |
114 | - $result[$arr[$sub_value]] = self::$key( $arr[$sub_value] ); | |
112 | + $result[$sub_value] = self::$key( $arr[$sub_value] ); | |
115 | 113 | } |
116 | 114 | |
117 | 115 | } |
... | ... | @@ -119,7 +117,7 @@ class Converter extends Behavior |
119 | 117 | |
120 | 118 | if (isset($arr[$value])) { |
121 | 119 | // конвертируем только те ячейки которые сопоставлены в прочитанном массиве с колонками в конфигурационном файле |
122 | - $result[$arr[$value]] = self::$key( $arr[$value] ); | |
120 | + $result[$value] = self::$key( $arr[$value] ); | |
123 | 121 | } |
124 | 122 | |
125 | 123 | } | ... | ... |
vendor/yiisoft/multiparser/CsvParser.php
... | ... | @@ -3,6 +3,7 @@ |
3 | 3 | |
4 | 4 | */ |
5 | 5 | namespace yii\multiparser; |
6 | +use common\components\CustomVarDamp; | |
6 | 7 | |
7 | 8 | |
8 | 9 | /** |
... | ... | @@ -97,7 +98,7 @@ class CsvParser implements ParserInterface |
97 | 98 | |
98 | 99 | while (!$finish) { |
99 | 100 | $j = 0; |
100 | - $row = $this->readRow(); | |
101 | + $row = $this->file->fgetcsv();; | |
101 | 102 | if ($row === false) { |
102 | 103 | continue; |
103 | 104 | } |
... | ... | @@ -129,7 +130,7 @@ class CsvParser implements ParserInterface |
129 | 130 | $empty_lines = 0; |
130 | 131 | while ( $empty_lines < 3 ) { |
131 | 132 | // прочтем строку из файла. Если там есть значения - то в ней массив, иначе - false |
132 | - $row = $this->readRow(); | |
133 | + $row = $this->readRow( $current_line ); | |
133 | 134 | |
134 | 135 | if ($row === false) { |
135 | 136 | //счетчик пустых строк |
... | ... | @@ -139,19 +140,10 @@ class CsvParser implements ParserInterface |
139 | 140 | // строка не пустая, имеем прочитанный массив значений |
140 | 141 | $current_line++; |
141 | 142 | if ($this->hasHeaderRow) { |
143 | + // в файле есть заголовок, но он еще не назначен, назначим | |
142 | 144 | if ($this->keys === NULL) { |
143 | 145 | $this->keys = array_values($row); |
144 | - } else { | |
145 | - | |
146 | - if (count($this->keys) !== count($row)) { | |
147 | -// | |
148 | - throw new \ErrorException("Invalid columns detected on line # {$current_line}", 0, 1, $this->file->getBasename(), $current_line); | |
149 | - } | |
150 | - | |
151 | - $return[] = array_combine($this->keys, $row); | |
152 | 146 | } |
153 | - } else { | |
154 | - $return[] = $row; | |
155 | 147 | } |
156 | 148 | // если у нас установлен лимит, при его достижении прекращаем парсинг |
157 | 149 | if (($this->last_line) && ($current_line > $this->last_line)) { |
... | ... | @@ -159,6 +151,8 @@ class CsvParser implements ParserInterface |
159 | 151 | } |
160 | 152 | // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД |
161 | 153 | $empty_lines = 0; |
154 | + | |
155 | + $return[] = $row; | |
162 | 156 | } |
163 | 157 | |
164 | 158 | $this->closeHandler(); |
... | ... | @@ -174,16 +168,24 @@ class CsvParser implements ParserInterface |
174 | 168 | /** |
175 | 169 | * @return array - одномерный массив результата парсинга строки |
176 | 170 | */ |
177 | - protected function readRow() | |
171 | + protected function readRow( $current_line ) | |
178 | 172 | { |
179 | - | |
180 | 173 | $row = $this->file->fgetcsv(); |
181 | - | |
182 | 174 | if (is_array($row)) { |
183 | - // попытаемся конвертировать прочитанные занчения согдасно конфигурации котнвертера значений | |
175 | + // если есть заголовок, то перед конвертацией его нужно назначить | |
176 | + if ($this->hasHeaderRow && $this->keys !== NULL) { | |
177 | + | |
178 | + if (count($this->keys) !== count($row)) { | |
179 | +// | |
180 | + throw new \ErrorException("Ошибка парсинга файла в строке # {$current_line}. Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными", 0, 1, $this->file->getBasename(), $current_line); | |
181 | + } | |
182 | + | |
183 | + $row = array_combine($this->keys, $row); | |
184 | + } | |
185 | + // попытаемся конвертировать прочитанные значения согласно конфигурации котнвертера значений | |
184 | 186 | $row = $this->convert($row); |
185 | - // \common\components\CustomVarDamp::dump($row); | |
186 | - if ($this->first_column) { | |
187 | + // обрежем массив к первой значимой колонке | |
188 | + if ( $this->first_column ) { | |
187 | 189 | |
188 | 190 | $row = array_slice($row, $this->first_column); |
189 | 191 | ... | ... |
vendor/yiisoft/multiparser/YiiMultiparser.php
... | ... | @@ -39,14 +39,5 @@ public $configuration; |
39 | 39 | |
40 | 40 | } |
41 | 41 | |
42 | - public function init() | |
43 | - { | |
44 | - if( isset($this->configuration['glob']) && isset($this->configuration['glob']['ini'])){ | |
45 | - foreach ($this->configuration['glob']['ini'] as $ini_setting => $ini_setting_value) { | |
46 | - ini_set( $ini_setting, $ini_setting_value ); | |
47 | - } | |
48 | - } | |
49 | - | |
50 | - } | |
51 | 42 | |
52 | 43 | } |
53 | 44 | \ No newline at end of file | ... | ... |