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 10 use yii\filters\AccessControl;
11 11 use backend\components\base\BaseController;
12 12 use yii\filters\VerbFilter;
13   -use backend\models\Details;
  13 +use common\models\Details;
14 14 use backend\models\ImportersFiles;
15 15 use backend\models\Importers;
16 16 use yii\base\ErrorException;
... ...
backend/controllers/DetailsController.php
... ... @@ -105,7 +105,8 @@ class DetailsController extends Controller
105 105 $model = $this->findModel($IMPORT_ID, $BRAND, $ARTICLE);
106 106  
107 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 110 } else {
110 111 return $this->render('update', [
111 112 'model' => $model,
... ...
backend/controllers/ParserController.php
1 1 <?php
2 2 namespace backend\controllers;
3 3  
4   -use backend\models\Details;
  4 +use common\models\Details;
5 5 use common\components\exceptions\CrossParsingException;
6 6 use common\components\exceptions\OrdinaryActiveRecordException;
7 7 use common\components\exceptions\PriceParsingException;
... ...
backend/views/details/_form.php
... ... @@ -2,6 +2,8 @@
2 2  
3 3 use yii\helpers\Html;
4 4 use yii\widgets\ActiveForm;
  5 +use yii\helpers\ArrayHelper;
  6 +use backend\models\Importers;
5 7  
6 8 /* @var $this yii\web\View */
7 9 /* @var $model common\models\Details */
... ... @@ -12,7 +14,7 @@ use yii\widgets\ActiveForm;
12 14  
13 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 19 <?= $form->field($model, 'BRAND')->textInput(['maxlength' => true]) ?>
18 20  
... ... @@ -30,11 +32,11 @@ use yii\widgets\ActiveForm;
30 32  
31 33 <?= $form->field($model, 'GROUP')->textInput(['maxlength' => true]) ?>
32 34  
33   - <?= $form->field($model, 'timestamp')->textInput() ?>
34 35  
35 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 38 </div>
  39 + <?= Html::a('Вернуться', ['index'], ['class' => 'btn btn-primary']) ?>
38 40  
39 41 <?php ActiveForm::end(); ?>
40 42  
... ...
backend/views/details/index.php
... ... @@ -7,7 +7,7 @@ use yii\grid\GridView;
7 7 /* @var $searchModel common\models\DetailsSearch */
8 8 /* @var $dataProvider yii\data\ActiveDataProvider */
9 9  
10   -$this->title = 'Список запчастей';
  10 +$this->title = 'Товары поставщиков';
11 11 $this->params['breadcrumbs'][] = $this->title;
12 12 ?>
13 13 <div class="details-index">
... ... @@ -16,7 +16,7 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
16 16 <?php // echo $this->render('_search', ['model' => $searchModel]); ?>
17 17  
18 18 <p>
19   - <?= Html::a('Создать', ['create'], ['class' => 'btn btn-success']) ?>
  19 + <?= Html::a('Добавить', ['create'], ['class' => 'btn btn-success']) ?>
20 20 </p>
21 21  
22 22 <?= GridView::widget([
... ... @@ -27,7 +27,10 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
27 27 ['class' => 'yii\grid\SerialColumn'],
28 28 'ARTICLE',
29 29 'BRAND',
30   - 'IMPORT_ID',
  30 +
  31 + ['attribute' => 'IMPORT_ID',
  32 + 'value' => function($model){return $model->importer;}],
  33 +
31 34 'DESCR',
32 35 'BOX',
33 36 'ADD_BOX',
... ... @@ -35,7 +38,8 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
35 38 'GROUP',
36 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 5 /* @var $this yii\web\View */
6 6 /* @var $model common\models\Details */
7 7  
8   -$this->title = 'Update Details: ' . ' ' . $model->IMPORT_ID;
  8 +$this->title = 'Редактирование записи: ' . ' ' . $model->IMPORT_ID;
9 9 $this->params['breadcrumbs'][] = ['label' => 'Details', 'url' => ['index']];
10 10 $this->params['breadcrumbs'][] = ['label' => $model->IMPORT_ID, 'url' => ['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]];
11 11 $this->params['breadcrumbs'][] = 'Update';
... ...
backend/views/parser/index.php
... ... @@ -24,7 +24,7 @@ if ( $model-&gt;mode ) {
24 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 29 <?php if ( !$mode ) {
30 30 echo $form->field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']);
... ...
common/components/PriceWriter.php
... ... @@ -12,7 +12,7 @@ namespace common\components;
12 12 use yii\base\ErrorException;
13 13 use backend\models\ImportersFiles;
14 14 use backend\models\Importers;
15   -use backend\models\Details;
  15 +use common\models\Details;
16 16 use common\components\ModelArrayValidator;
17 17  
18 18 /**
... ...
common/components/parsers/CustomConverter.php
... ... @@ -3,7 +3,7 @@ namespace common\components\parsers;
3 3  
4 4 use common\components\CustomVarDamp;
5 5 use common\components\parsers\Converter;
6   -use backend\models\Details;
  6 +use common\models\Details;
7 7 use backend\models\DetailsCrosses;
8 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 +}
... ...