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 | ... | ... |