Commit f32f4cbc677ff7d884f6e0148d75f7746acd0748

Authored by Mihail
1 parent 5c35d76d

fixed details page after testing

backend/controllers/CheckPriceController.php
@@ -10,7 +10,7 @@ use yii\data\ActiveDataProvider; @@ -10,7 +10,7 @@ use yii\data\ActiveDataProvider;
10 use yii\filters\AccessControl; 10 use yii\filters\AccessControl;
11 use backend\components\base\BaseController; 11 use backend\components\base\BaseController;
12 use yii\filters\VerbFilter; 12 use yii\filters\VerbFilter;
13 -use backend\models\Details; 13 +use common\models\Details;
14 use backend\models\ImportersFiles; 14 use backend\models\ImportersFiles;
15 use backend\models\Importers; 15 use backend\models\Importers;
16 use yii\base\ErrorException; 16 use yii\base\ErrorException;
backend/controllers/DetailsController.php
@@ -105,7 +105,8 @@ class DetailsController extends Controller @@ -105,7 +105,8 @@ class DetailsController extends Controller
105 $model = $this->findModel($IMPORT_ID, $BRAND, $ARTICLE); 105 $model = $this->findModel($IMPORT_ID, $BRAND, $ARTICLE);
106 106
107 if ($model->load(Yii::$app->request->post()) && $model->save()) { 107 if ($model->load(Yii::$app->request->post()) && $model->save()) {
108 - return $this->redirect(['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]); 108 + //return $this->redirect(['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]);
  109 + return $this->redirect(['index']);
109 } else { 110 } else {
110 return $this->render('update', [ 111 return $this->render('update', [
111 'model' => $model, 112 'model' => $model,
backend/controllers/ParserController.php
1 <?php 1 <?php
2 namespace backend\controllers; 2 namespace backend\controllers;
3 3
4 -use backend\models\Details; 4 +use common\models\Details;
5 use common\components\exceptions\CrossParsingException; 5 use common\components\exceptions\CrossParsingException;
6 use common\components\exceptions\OrdinaryActiveRecordException; 6 use common\components\exceptions\OrdinaryActiveRecordException;
7 use common\components\exceptions\PriceParsingException; 7 use common\components\exceptions\PriceParsingException;
backend/views/details/_form.php
@@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
2 2
3 use yii\helpers\Html; 3 use yii\helpers\Html;
4 use yii\widgets\ActiveForm; 4 use yii\widgets\ActiveForm;
  5 +use yii\helpers\ArrayHelper;
  6 +use backend\models\Importers;
5 7
6 /* @var $this yii\web\View */ 8 /* @var $this yii\web\View */
7 /* @var $model common\models\Details */ 9 /* @var $model common\models\Details */
@@ -12,7 +14,7 @@ use yii\widgets\ActiveForm; @@ -12,7 +14,7 @@ use yii\widgets\ActiveForm;
12 14
13 <?php $form = ActiveForm::begin(); ?> 15 <?php $form = ActiveForm::begin(); ?>
14 16
15 - <?= $form->field($model, 'IMPORT_ID')->textInput() ?> 17 + <?= $form->field($model, 'IMPORT_ID')->dropDownList( ArrayHelper::map( Importers::find()->orderBy('name')->all(), 'id','name' ) ) ?>
16 18
17 <?= $form->field($model, 'BRAND')->textInput(['maxlength' => true]) ?> 19 <?= $form->field($model, 'BRAND')->textInput(['maxlength' => true]) ?>
18 20
@@ -30,11 +32,11 @@ use yii\widgets\ActiveForm; @@ -30,11 +32,11 @@ use yii\widgets\ActiveForm;
30 32
31 <?= $form->field($model, 'GROUP')->textInput(['maxlength' => true]) ?> 33 <?= $form->field($model, 'GROUP')->textInput(['maxlength' => true]) ?>
32 34
33 - <?= $form->field($model, 'timestamp')->textInput() ?>  
34 35
35 <div class="form-group"> 36 <div class="form-group">
36 - <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 37 + <?= Html::submitButton($model->isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
37 </div> 38 </div>
  39 + <?= Html::a('Вернуться', ['index'], ['class' => 'btn btn-primary']) ?>
38 40
39 <?php ActiveForm::end(); ?> 41 <?php ActiveForm::end(); ?>
40 42
backend/views/details/index.php
@@ -7,7 +7,7 @@ use yii\grid\GridView; @@ -7,7 +7,7 @@ use yii\grid\GridView;
7 /* @var $searchModel common\models\DetailsSearch */ 7 /* @var $searchModel common\models\DetailsSearch */
8 /* @var $dataProvider yii\data\ActiveDataProvider */ 8 /* @var $dataProvider yii\data\ActiveDataProvider */
9 9
10 -$this->title = 'Список запчастей'; 10 +$this->title = 'Товары поставщиков';
11 $this->params['breadcrumbs'][] = $this->title; 11 $this->params['breadcrumbs'][] = $this->title;
12 ?> 12 ?>
13 <div class="details-index"> 13 <div class="details-index">
@@ -16,7 +16,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title; @@ -16,7 +16,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
16 <?php // echo $this->render('_search', ['model' => $searchModel]); ?> 16 <?php // echo $this->render('_search', ['model' => $searchModel]); ?>
17 17
18 <p> 18 <p>
19 - <?= Html::a('Создать', ['create'], ['class' => 'btn btn-success']) ?> 19 + <?= Html::a('Добавить', ['create'], ['class' => 'btn btn-success']) ?>
20 </p> 20 </p>
21 21
22 <?= GridView::widget([ 22 <?= GridView::widget([
@@ -27,7 +27,10 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title; @@ -27,7 +27,10 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
27 ['class' => 'yii\grid\SerialColumn'], 27 ['class' => 'yii\grid\SerialColumn'],
28 'ARTICLE', 28 'ARTICLE',
29 'BRAND', 29 'BRAND',
30 - 'IMPORT_ID', 30 +
  31 + ['attribute' => 'IMPORT_ID',
  32 + 'value' => function($model){return $model->importer;}],
  33 +
31 'DESCR', 34 'DESCR',
32 'BOX', 35 'BOX',
33 'ADD_BOX', 36 'ADD_BOX',
@@ -35,7 +38,8 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title; @@ -35,7 +38,8 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
35 'GROUP', 38 'GROUP',
36 // 'timestamp', 39 // 'timestamp',
37 40
38 - ['class' => 'yii\grid\ActionColumn'], 41 + ['class' => 'yii\grid\ActionColumn',
  42 + 'template' => '{update},{delete}'],
39 ], 43 ],
40 ]); ?> 44 ]); ?>
41 45
backend/views/details/update.php
@@ -5,7 +5,7 @@ use yii\helpers\Html; @@ -5,7 +5,7 @@ use yii\helpers\Html;
5 /* @var $this yii\web\View */ 5 /* @var $this yii\web\View */
6 /* @var $model common\models\Details */ 6 /* @var $model common\models\Details */
7 7
8 -$this->title = 'Update Details: ' . ' ' . $model->IMPORT_ID; 8 +$this->title = 'Редактирование записи: ' . ' ' . $model->IMPORT_ID;
9 $this->params['breadcrumbs'][] = ['label' => 'Details', 'url' => ['index']]; 9 $this->params['breadcrumbs'][] = ['label' => 'Details', 'url' => ['index']];
10 $this->params['breadcrumbs'][] = ['label' => $model->IMPORT_ID, 'url' => ['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]]; 10 $this->params['breadcrumbs'][] = ['label' => $model->IMPORT_ID, 'url' => ['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]];
11 $this->params['breadcrumbs'][] = 'Update'; 11 $this->params['breadcrumbs'][] = 'Update';
backend/views/parser/index.php
@@ -24,7 +24,7 @@ if ( $model-&gt;mode ) { @@ -24,7 +24,7 @@ if ( $model-&gt;mode ) {
24 <h3>Загрузка прайсов поставщиков</h3> 24 <h3>Загрузка прайсов поставщиков</h3>
25 25
26 26
27 - <?= $form->field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->all(), 'id','name' )); ?> 27 + <?= $form->field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->orderBy('name')->all(), 'id','name' )); ?>
28 28
29 <?php if ( !$mode ) { 29 <?php if ( !$mode ) {
30 echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']); 30 echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']);
common/components/PriceWriter.php
@@ -12,7 +12,7 @@ namespace common\components; @@ -12,7 +12,7 @@ namespace common\components;
12 use yii\base\ErrorException; 12 use yii\base\ErrorException;
13 use backend\models\ImportersFiles; 13 use backend\models\ImportersFiles;
14 use backend\models\Importers; 14 use backend\models\Importers;
15 -use backend\models\Details; 15 +use common\models\Details;
16 use common\components\ModelArrayValidator; 16 use common\components\ModelArrayValidator;
17 17
18 /** 18 /**
common/components/parsers/CustomConverter.php
@@ -3,7 +3,7 @@ namespace common\components\parsers; @@ -3,7 +3,7 @@ namespace common\components\parsers;
3 3
4 use common\components\CustomVarDamp; 4 use common\components\CustomVarDamp;
5 use common\components\parsers\Converter; 5 use common\components\parsers\Converter;
6 -use backend\models\Details; 6 +use common\models\Details;
7 use backend\models\DetailsCrosses; 7 use backend\models\DetailsCrosses;
8 use backend\models\ImportersPrefix; 8 use backend\models\ImportersPrefix;
9 9
common/models/Details.php 0 → 100644
  1 +<?php
  2 +
  3 +namespace common\models;
  4 +
  5 +use backend\models\Importers;
  6 +use common\components\CustomVarDamp;
  7 +use Yii;
  8 +use backend\components\base\BaseActiveRecord;
  9 +
  10 +/**
  11 + * This is the model class for table "{{%details}}".
  12 + *
  13 + * @property string $ID
  14 + * @property string $IMPORT_ID
  15 + * @property string $BRAND
  16 + * @property string $ARTICLE
  17 + * @property string $FULL_ARTICLE
  18 + * @property double $PRICE
  19 + * @property string $DESCR
  20 + * @property string $BOX
  21 + * @property string $ADD_BOX
  22 + * @property string $GROUP
  23 + * @property string $timestamp
  24 + *
  25 + *
  26 + */
  27 +class Details extends BaseActiveRecord
  28 +{
  29 + /**
  30 + *обязательные колонки
  31 + */
  32 + const KEY_COLUMN = 'IMPORT_ID~~BRAND~~ARTICLE';
  33 +
  34 + /**
  35 + * int - размер пакета запроса
  36 + */
  37 + const BATCH = 500;
  38 +
  39 + /**
  40 + * @var bool - признак необходимости удалить префикс Артикула перед вставкой
  41 + */
  42 +
  43 + public $delete_price = false;
  44 +
  45 + /**
  46 + * @inheritdoc
  47 + */
  48 + public static function tableName()
  49 + {
  50 + return '{{%details}}';
  51 + }
  52 +
  53 + public function getImporter ()
  54 + {
  55 + return Importers::findOne(['id' => $this->IMPORT_ID])->name;
  56 + }
  57 +
  58 + /**
  59 + * @inheritdoc
  60 + */
  61 + public function rules()
  62 + {
  63 + return [
  64 + [['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required' , 'on' => ['default','form_upload_validation']],
  65 + // [['PRICE'], 'number', 'on' => 'default'],
  66 + [['PRICE'], \common\components\CommaNumberValidator::className(), 'on' => 'default'],
  67 + [['BOX'], 'integer' , 'on' => 'default'],
  68 + [['timestamp'], 'safe' , 'on' => 'default'],
  69 + [['BRAND', 'ARTICLE'], 'string', 'max' => 100 , 'on' => 'default'],
  70 + [['FULL_ARTICLE'], 'string', 'max' => 150 , 'on' => 'default'],
  71 + [['DESCR', 'GROUP'], 'string', 'max' => 200 , 'on' => 'default']
  72 + ];
  73 + }
  74 +
  75 + /**
  76 + * @inheritdoc
  77 + */
  78 + public function attributeLabels()
  79 + {
  80 + return [
  81 + 'ID' => Yii::t('app', 'ID'),
  82 + 'IMPORT_ID' => Yii::t('app', 'ПОСТАВЩИК'),
  83 + 'Importer' => Yii::t('app', 'ПОСТАВЩИК'),
  84 + 'BRAND' => Yii::t('app', 'БРЕНД'),
  85 + 'ARTICLE' => Yii::t('app', 'АРТИКУЛ'),
  86 + 'FULL_ARTICLE' => Yii::t('app', 'Full Article'),
  87 + 'PRICE' => Yii::t('app', 'ЦЕНА'),
  88 + 'DESCR' => Yii::t('app', 'ОПИСАНИЕ'),
  89 + 'BOX' => Yii::t('app', 'НАЛИЧИЕ'),
  90 + 'ADD_BOX' => Yii::t('app', 'В ПУТИ'),
  91 + 'GROUP' => Yii::t('app', 'ГРУППА RG'),
  92 + 'timestamp' => Yii::t('app', 'Timestamp'),
  93 + ];
  94 + }
  95 +
  96 + /**
  97 + *удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL
  98 + * @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH
  99 + * @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data
  100 + * @throws \yii\db\Exception
  101 + */
  102 + public function manualInsert($data, $importer_id)
  103 + {
  104 + if ($this->delete_price) {
  105 + // запустим пакетное удаление всех прайсов поставщика
  106 + $conditions = "IMPORT_ID = {$importer_id}";
  107 + $this->manualDelete( $conditions );
  108 + }
  109 + $this->manualInsertWithUpdate($data);
  110 +
  111 + }
  112 +
  113 + /**
  114 + * вставка данных с апдейтом прямым запросом SQL
  115 + * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH
  116 + * @throws \yii\db\Exception
  117 + */
  118 + private function manualInsertWithUpdate($data)
  119 + {
  120 + $table_name = self::tableName();
  121 + $keys_arr = array_keys($data[0]);
  122 + // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить
  123 + $fields_arr_to_update = array_diff($keys_arr, explode('~~', $this::KEY_COLUMN ));
  124 +
  125 + $query_update = ' on duplicate key update ';
  126 + foreach ($fields_arr_to_update as $field) {
  127 + $query_update .= "[[{$field}]] = values([[{$field}]]),";
  128 + }
  129 + // удалим последнюю запятую
  130 + $query_update = substr($query_update, 0, strlen($query_update) - 1);
  131 +
  132 + // запросы будем выполнять пакетами
  133 + // размер пакета установлен в константе
  134 + // разобъем массив на пакеты и будем их проходить
  135 + $data = array_chunk($data, $this::BATCH);
  136 + foreach ($data as $current_batch_array) {
  137 +
  138 + //воспользуемся пакетной вставкой от фреймворка
  139 + $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql;
  140 +
  141 + // добавим фрагмент с апдейтом при дубляже
  142 + $query = "{$query_insert} {$query_update}";
  143 + // \common\components\CustomVarDamp::dumpAndDie($query);
  144 + Yii::$app->db->createCommand($query)->execute();
  145 +
  146 + }
  147 + }
  148 +
  149 + public function manualDelete( $conditions, $params = [] )
  150 + {
  151 + do {
  152 + $query = Yii::$app->db->createCommand()->delete( self::tableName(), $conditions, $params )->sql . ' Limit ' . $this::BATCH;
  153 +// try {
  154 + $res = Yii::$app->db->createCommand($query)->execute();
  155 +// } catch (\Exception $e) {
  156 +// throw new \ErrorException('Ошибка удаления товаров '.$e->getMessage());
  157 +// }
  158 + } while ($res);
  159 +
  160 + return true;
  161 + }
  162 +
  163 +}