Commit fe1397b32ad0cdd5e060936a133d65ba0f5d0d27

Authored by Administrator
2 parents e4e4ce76 ead5cb60

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
backend/components/parsers/CustomCsvParser.php
@@ -9,6 +9,8 @@ @@ -9,6 +9,8 @@
9 namespace backend\components\parsers; 9 namespace backend\components\parsers;
10 10
11 11
  12 +use common\components\CustomVarDamp;
  13 +
12 class CustomCsvParser extends \yii\multiparser\CsvParser { 14 class CustomCsvParser extends \yii\multiparser\CsvParser {
13 15
14 public $last_line = 10; 16 public $last_line = 10;
@@ -33,9 +35,8 @@ class CustomCsvParser extends \yii\multiparser\CsvParser { @@ -33,9 +35,8 @@ class CustomCsvParser extends \yii\multiparser\CsvParser {
33 */ 35 */
34 protected function convert($arr) 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 <?php 1 <?php
2 return [ 2 return [
3 - 'global' =>  
4 - ['ini' => ['upload_max_filesize' => '20M',  
5 - 'post_max_size integer' => '30M',  
6 - ]],  
7 'csv' => 3 'csv' =>
8 ['web' => 4 ['web' =>
9 ['class' => 'backend\components\parsers\CustomCsvParser', 5 ['class' => 'backend\components\parsers\CustomCsvParser',
@@ -22,6 +18,27 @@ @@ -22,6 +18,27 @@
22 "ADD_BOX"=> 'В пути', 18 "ADD_BOX"=> 'В пути',
23 "GROUP" => 'Группа RG' 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 'xml' => 43 'xml' =>
27 ['web' => 44 ['web' =>
backend/config/main.php
@@ -28,7 +28,7 @@ return [ @@ -28,7 +28,7 @@ return [
28 ], 28 ],
29 ], 29 ],
30 'errorHandler' => [ 30 'errorHandler' => [
31 - 'errorAction' => 'site/error', 31 + 'errorAction' => 'parser/error',
32 ], 32 ],
33 'request'=>[ 33 'request'=>[
34 34
backend/controllers/CheckPriceController.php
@@ -8,8 +8,8 @@ use yii\filters\AccessControl; @@ -8,8 +8,8 @@ use yii\filters\AccessControl;
8 use backend\components\base\BaseController; 8 use backend\components\base\BaseController;
9 use yii\filters\VerbFilter; 9 use yii\filters\VerbFilter;
10 use backend\models\Details; 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 use yii\base\ErrorException; 13 use yii\base\ErrorException;
14 14
15 use common\components\CustomVarDamp; 15 use common\components\CustomVarDamp;
@@ -66,7 +66,11 @@ class CheckPriceController extends BaseController @@ -66,7 +66,11 @@ class CheckPriceController extends BaseController
66 } 66 }
67 67
68 //$query = (new Query())->select('*')->from('{{%importer_files}}')->where(['not', ['time_end' => null]])->orderBy(['upload_time' => SORT_DESC]); 68 //$query = (new Query())->select('*')->from('{{%importer_files}}')->where(['not', ['time_end' => null]])->orderBy(['upload_time' => SORT_DESC]);
  69 +<<<<<<< HEAD
69 $query = Importer::find()->where(['active' => true])->orderBy(['price_date_update' => SORT_DESC]); 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 $provider = new ActiveDataProvider([ 75 $provider = new ActiveDataProvider([
72 'query' => $query, 76 'query' => $query,
backend/controllers/ParserController.php
@@ -299,7 +299,7 @@ class ParserController extends BaseController @@ -299,7 +299,7 @@ class ParserController extends BaseController
299 } 299 }
300 } else { 300 } else {
301 // Yii::$app->log-> 301 // Yii::$app->log->
302 - // не дошли до конца по этому остаки вернем в кеш 302 + // не дошли до конца по этому остатки вернем в кеш
303 Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) ); 303 Yii::$app->cache->set( 'files_to_parse',json_encode( $arr_id_files ) );
304 } 304 }
305 } 305 }
backend/models/Importers.php 0 → 100644
  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 +}
backend/views/parser/error.php 0 → 100644
  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 <?php 1 <?php
2 use yii\widgets\ActiveForm; 2 use yii\widgets\ActiveForm;
3 use yii\helpers\Html; 3 use yii\helpers\Html;
4 -use backend\models\Importer; 4 +use backend\models\Importers;
5 use yii\helpers\ArrayHelper; 5 use yii\helpers\ArrayHelper;
6 if ( $model->mode ) { 6 if ( $model->mode ) {
7 // авто загрузка 7 // авто загрузка
@@ -27,7 +27,7 @@ if ( $model-&gt;mode ) { @@ -27,7 +27,7 @@ if ( $model-&gt;mode ) {
27 <h3>Загрузка прайсов поставщиков</h3> 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 <?php if ( !$mode ) { 32 <?php if ( !$mode ) {
33 echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']); 33 echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']);
backend/views/parser/server-files.php
1 <?php 1 <?php
2 use yii\helpers\Html; 2 use yii\helpers\Html;
  3 +use yii\helpers\Url;
3 use yii\grid\GridView; 4 use yii\grid\GridView;
4 use yii\grid\SerialColumn; 5 use yii\grid\SerialColumn;
5 use yii\grid\ActionColumn; 6 use yii\grid\ActionColumn;
@@ -44,7 +45,7 @@ Pjax::begin([&#39;id&#39; =&gt; &#39;server_files_grid&#39;]); @@ -44,7 +45,7 @@ Pjax::begin([&#39;id&#39; =&gt; &#39;server_files_grid&#39;]);
44 45
45 ]] );?> 46 ]] );?>
46 47
47 - 48 + <?= Html::a('Загрузить файлы', ['parse'],['class' => 'btn btn-success']) ?>
48 49
49 </div> 50 </div>
50 <?php 51 <?php
common/components/PriceWriter.php 0 → 100644
  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 \ No newline at end of file 104 \ No newline at end of file
common/models/WAccounts.php 0 → 100644
  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 +}
common/models/WAccountsSearch.php 0 → 100644
  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 +}
common/models/WDicCities.php 0 → 100644
  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/.gitignore 0 → 100644
  1 +/old_migrations
0 \ No newline at end of file 2 \ No newline at end of file
console/config/main.php
@@ -18,8 +18,14 @@ return [ @@ -18,8 +18,14 @@ return [
18 'class' => 'yii\log\FileTarget', 18 'class' => 'yii\log\FileTarget',
19 'levels' => ['error', 'warning'], 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 'params' => $params, 29 'params' => $params,
  30 +]
25 ]; 31 ];
console/controllers/ParserController.php 0 → 100644
  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 \ No newline at end of file 71 \ No newline at end of file
console/migrations/m150925_111922_add_foreign_key_ImportFiles.php
@@ -2,17 +2,29 @@ @@ -2,17 +2,29 @@
2 2
3 use yii\db\Schema; 3 use yii\db\Schema;
4 use yii\db\Migration; 4 use yii\db\Migration;
  5 +use backend\models\ImportersFiles;
5 6
6 class m150925_111922_add_foreign_key_ImportFiles extends Migration 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 public function down() 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,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 * Create a link if the string is a valid URL 228 * Create a link if the string is a valid URL
framework/lang/fr.yml
@@ -403,7 +403,11 @@ fr: @@ -403,7 +403,11 @@ fr:
403 DELETE: Supprime 403 DELETE: Supprime
404 DELETEDRECORDS: '{count} enregistrements supprimés.' 404 DELETEDRECORDS: '{count} enregistrements supprimés.'
405 EMPTYBEFOREIMPORT: 'Remplacer les données' 405 EMPTYBEFOREIMPORT: 'Remplacer les données'
  406 +<<<<<<< HEAD
406 IMPORT: 'Importer de CSV' 407 IMPORT: 'Importer de CSV'
  408 +=======
  409 + IMPORT: 'Importers de CSV'
  410 +>>>>>>> ead5cb60ac983cdb680ec70731de195b537be6cd
407 IMPORTEDRECORDS: '{count} enregistrements importés.' 411 IMPORTEDRECORDS: '{count} enregistrements importés.'
408 NOCSVFILE: 'Veuillez choisir un fichier CSV à importer' 412 NOCSVFILE: 'Veuillez choisir un fichier CSV à importer'
409 NOIMPORT: 'Rien à importer' 413 NOIMPORT: 'Rien à importer'
@@ -417,9 +421,15 @@ fr: @@ -417,9 +421,15 @@ fr:
417 IMPORTSPECTITLE: 'Spécification de %s' 421 IMPORTSPECTITLE: 'Spécification de %s'
418 ModelAdmin_Tools_ss: 422 ModelAdmin_Tools_ss:
419 FILTER: Filtrer 423 FILTER: Filtrer
  424 +<<<<<<< HEAD
420 IMPORT: Importer 425 IMPORT: Importer
421 ModelSidebar_ss: 426 ModelSidebar_ss:
422 IMPORT_TAB_HEADER: Importer 427 IMPORT_TAB_HEADER: Importer
  428 +=======
  429 + IMPORT: Importers
  430 + ModelSidebar_ss:
  431 + IMPORT_TAB_HEADER: Importers
  432 +>>>>>>> ead5cb60ac983cdb680ec70731de195b537be6cd
423 SEARCHLISTINGS: Rechercher 433 SEARCHLISTINGS: Rechercher
424 MoneyField: 434 MoneyField:
425 FIELDLABELAMOUNT: Quantité 435 FIELDLABELAMOUNT: Quantité
vendor/yiisoft/multiparser/Converter.php
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 */ 7 */
8 8
9 namespace yii\multiparser; 9 namespace yii\multiparser;
  10 +use common\components\CustomVarDamp;
10 use yii\base\Behavior; 11 use yii\base\Behavior;
11 12
12 // класс который содержит преобразователи значений (фильтры) используемые при парсинге 13 // класс который содержит преобразователи значений (фильтры) используемые при парсинге
@@ -19,7 +20,6 @@ class Converter extends Behavior @@ -19,7 +20,6 @@ class Converter extends Behavior
19 20
20 public static function convertToFloat($value) 21 public static function convertToFloat($value)
21 { 22 {
22 - echo 1;  
23 if ($value == '') { 23 if ($value == '') {
24 $value = 0; 24 $value = 0;
25 } 25 }
@@ -51,8 +51,6 @@ class Converter extends Behavior @@ -51,8 +51,6 @@ class Converter extends Behavior
51 51
52 public static function convertToString($value) 52 public static function convertToString($value)
53 { 53 {
54 -  
55 -  
56 $res = ''; 54 $res = '';
57 if (is_array($value)) { 55 if (is_array($value)) {
58 56
@@ -101,7 +99,7 @@ class Converter extends Behavior @@ -101,7 +99,7 @@ class Converter extends Behavior
101 public static function convertByConfiguration( $arr, $configuration ) 99 public static function convertByConfiguration( $arr, $configuration )
102 { 100 {
103 $result = $arr; 101 $result = $arr;
104 - //\common\components\CustomVarDamp::dumpAndDie($configuration); 102 + // \common\components\CustomVarDamp::dumpAndDie( $result );
105 $hasKey = isset( $configuration['hasKey'] ); 103 $hasKey = isset( $configuration['hasKey'] );
106 foreach ( $configuration['configuration'] as $key => $value ) { 104 foreach ( $configuration['configuration'] as $key => $value ) {
107 105
@@ -111,7 +109,7 @@ class Converter extends Behavior @@ -111,7 +109,7 @@ class Converter extends Behavior
111 foreach ($value as $sub_value) { 109 foreach ($value as $sub_value) {
112 if (isset($arr[$sub_value])) { 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,7 +117,7 @@ class Converter extends Behavior
119 117
120 if (isset($arr[$value])) { 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,6 +3,7 @@
3 3
4 */ 4 */
5 namespace yii\multiparser; 5 namespace yii\multiparser;
  6 +use common\components\CustomVarDamp;
6 7
7 8
8 /** 9 /**
@@ -97,7 +98,7 @@ class CsvParser implements ParserInterface @@ -97,7 +98,7 @@ class CsvParser implements ParserInterface
97 98
98 while (!$finish) { 99 while (!$finish) {
99 $j = 0; 100 $j = 0;
100 - $row = $this->readRow(); 101 + $row = $this->file->fgetcsv();;
101 if ($row === false) { 102 if ($row === false) {
102 continue; 103 continue;
103 } 104 }
@@ -129,7 +130,7 @@ class CsvParser implements ParserInterface @@ -129,7 +130,7 @@ class CsvParser implements ParserInterface
129 $empty_lines = 0; 130 $empty_lines = 0;
130 while ( $empty_lines < 3 ) { 131 while ( $empty_lines < 3 ) {
131 // прочтем строку из файла. Если там есть значения - то в ней массив, иначе - false 132 // прочтем строку из файла. Если там есть значения - то в ней массив, иначе - false
132 - $row = $this->readRow(); 133 + $row = $this->readRow( $current_line );
133 134
134 if ($row === false) { 135 if ($row === false) {
135 //счетчик пустых строк 136 //счетчик пустых строк
@@ -139,19 +140,10 @@ class CsvParser implements ParserInterface @@ -139,19 +140,10 @@ class CsvParser implements ParserInterface
139 // строка не пустая, имеем прочитанный массив значений 140 // строка не пустая, имеем прочитанный массив значений
140 $current_line++; 141 $current_line++;
141 if ($this->hasHeaderRow) { 142 if ($this->hasHeaderRow) {
  143 + // в файле есть заголовок, но он еще не назначен, назначим
142 if ($this->keys === NULL) { 144 if ($this->keys === NULL) {
143 $this->keys = array_values($row); 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 if (($this->last_line) && ($current_line > $this->last_line)) { 149 if (($this->last_line) && ($current_line > $this->last_line)) {
@@ -159,6 +151,8 @@ class CsvParser implements ParserInterface @@ -159,6 +151,8 @@ class CsvParser implements ParserInterface
159 } 151 }
160 // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД 152 // обнуляем счетчик, так как считаюся пустые строки ПОДРЯД
161 $empty_lines = 0; 153 $empty_lines = 0;
  154 +
  155 + $return[] = $row;
162 } 156 }
163 157
164 $this->closeHandler(); 158 $this->closeHandler();
@@ -174,16 +168,24 @@ class CsvParser implements ParserInterface @@ -174,16 +168,24 @@ class CsvParser implements ParserInterface
174 /** 168 /**
175 * @return array - одномерный массив результата парсинга строки 169 * @return array - одномерный массив результата парсинга строки
176 */ 170 */
177 - protected function readRow() 171 + protected function readRow( $current_line )
178 { 172 {
179 -  
180 $row = $this->file->fgetcsv(); 173 $row = $this->file->fgetcsv();
181 -  
182 if (is_array($row)) { 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 $row = $this->convert($row); 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 $row = array_slice($row, $this->first_column); 190 $row = array_slice($row, $this->first_column);
189 191
vendor/yiisoft/multiparser/YiiMultiparser.php
@@ -39,14 +39,5 @@ public $configuration; @@ -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 \ No newline at end of file 44 \ No newline at end of file