From f32f4cbc677ff7d884f6e0148d75f7746acd0748 Mon Sep 17 00:00:00 2001 From: Mihail Date: Wed, 9 Dec 2015 18:30:57 +0200 Subject: [PATCH] fixed details page after testing --- backend/controllers/CheckPriceController.php | 2 +- backend/controllers/DetailsController.php | 3 ++- backend/controllers/ParserController.php | 2 +- backend/views/details/_form.php | 8 +++++--- backend/views/details/index.php | 12 ++++++++---- backend/views/details/update.php | 2 +- backend/views/parser/index.php | 2 +- common/components/PriceWriter.php | 2 +- common/components/parsers/CustomConverter.php | 2 +- common/models/Details.php | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 common/models/Details.php diff --git a/backend/controllers/CheckPriceController.php b/backend/controllers/CheckPriceController.php index 03222a6..d654787 100755 --- a/backend/controllers/CheckPriceController.php +++ b/backend/controllers/CheckPriceController.php @@ -10,7 +10,7 @@ use yii\data\ActiveDataProvider; use yii\filters\AccessControl; use backend\components\base\BaseController; use yii\filters\VerbFilter; -use backend\models\Details; +use common\models\Details; use backend\models\ImportersFiles; use backend\models\Importers; use yii\base\ErrorException; diff --git a/backend/controllers/DetailsController.php b/backend/controllers/DetailsController.php index 16f1056..164d876 100755 --- a/backend/controllers/DetailsController.php +++ b/backend/controllers/DetailsController.php @@ -105,7 +105,8 @@ class DetailsController extends Controller $model = $this->findModel($IMPORT_ID, $BRAND, $ARTICLE); if ($model->load(Yii::$app->request->post()) && $model->save()) { - return $this->redirect(['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]); + //return $this->redirect(['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]); + return $this->redirect(['index']); } else { return $this->render('update', [ 'model' => $model, diff --git a/backend/controllers/ParserController.php b/backend/controllers/ParserController.php index 4ea6de8..6d312db 100755 --- a/backend/controllers/ParserController.php +++ b/backend/controllers/ParserController.php @@ -1,7 +1,7 @@ - field($model, 'IMPORT_ID')->textInput() ?> + field($model, 'IMPORT_ID')->dropDownList( ArrayHelper::map( Importers::find()->orderBy('name')->all(), 'id','name' ) ) ?> field($model, 'BRAND')->textInput(['maxlength' => true]) ?> @@ -30,11 +32,11 @@ use yii\widgets\ActiveForm; field($model, 'GROUP')->textInput(['maxlength' => true]) ?> - field($model, 'timestamp')->textInput() ?>
- isNewRecord ? 'Добавить' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> + isNewRecord ? 'Добавить' : 'Редактировать', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
+ 'btn btn-primary']) ?> diff --git a/backend/views/details/index.php b/backend/views/details/index.php index a06abe3..6649cb4 100755 --- a/backend/views/details/index.php +++ b/backend/views/details/index.php @@ -7,7 +7,7 @@ use yii\grid\GridView; /* @var $searchModel common\models\DetailsSearch */ /* @var $dataProvider yii\data\ActiveDataProvider */ -$this->title = 'Список запчастей'; +$this->title = 'Товары поставщиков'; $this->params['breadcrumbs'][] = $this->title; ?>
@@ -16,7 +16,7 @@ $this->params['breadcrumbs'][] = $this->title; render('_search', ['model' => $searchModel]); ?>

- 'btn btn-success']) ?> + 'btn btn-success']) ?>

params['breadcrumbs'][] = $this->title; ['class' => 'yii\grid\SerialColumn'], 'ARTICLE', 'BRAND', - 'IMPORT_ID', + + ['attribute' => 'IMPORT_ID', + 'value' => function($model){return $model->importer;}], + 'DESCR', 'BOX', 'ADD_BOX', @@ -35,7 +38,8 @@ $this->params['breadcrumbs'][] = $this->title; 'GROUP', // 'timestamp', - ['class' => 'yii\grid\ActionColumn'], + ['class' => 'yii\grid\ActionColumn', + 'template' => '{update},{delete}'], ], ]); ?> diff --git a/backend/views/details/update.php b/backend/views/details/update.php index ffcb10a..3af4981 100755 --- a/backend/views/details/update.php +++ b/backend/views/details/update.php @@ -5,7 +5,7 @@ use yii\helpers\Html; /* @var $this yii\web\View */ /* @var $model common\models\Details */ -$this->title = 'Update Details: ' . ' ' . $model->IMPORT_ID; +$this->title = 'Редактирование записи: ' . ' ' . $model->IMPORT_ID; $this->params['breadcrumbs'][] = ['label' => 'Details', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => $model->IMPORT_ID, 'url' => ['view', 'IMPORT_ID' => $model->IMPORT_ID, 'BRAND' => $model->BRAND, 'ARTICLE' => $model->ARTICLE]]; $this->params['breadcrumbs'][] = 'Update'; diff --git a/backend/views/parser/index.php b/backend/views/parser/index.php index 337b8b8..c74f8d6 100755 --- a/backend/views/parser/index.php +++ b/backend/views/parser/index.php @@ -24,7 +24,7 @@ if ( $model->mode ) {

Загрузка прайсов поставщиков

- field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->all(), 'id','name' )); ?> + field($model, 'importer_id')->dropDownList(ArrayHelper::map( Importers::find()->orderBy('name')->all(), 'id','name' )); ?> field($model, 'delete_price')->checkbox(['label' => 'Загрузить с удалением старого прайса']); diff --git a/common/components/PriceWriter.php b/common/components/PriceWriter.php index c0babec..ccdeaba 100755 --- a/common/components/PriceWriter.php +++ b/common/components/PriceWriter.php @@ -12,7 +12,7 @@ namespace common\components; use yii\base\ErrorException; use backend\models\ImportersFiles; use backend\models\Importers; -use backend\models\Details; +use common\models\Details; use common\components\ModelArrayValidator; /** diff --git a/common/components/parsers/CustomConverter.php b/common/components/parsers/CustomConverter.php index 51febe5..e61e8e4 100755 --- a/common/components/parsers/CustomConverter.php +++ b/common/components/parsers/CustomConverter.php @@ -3,7 +3,7 @@ namespace common\components\parsers; use common\components\CustomVarDamp; use common\components\parsers\Converter; -use backend\models\Details; +use common\models\Details; use backend\models\DetailsCrosses; use backend\models\ImportersPrefix; diff --git a/common/models/Details.php b/common/models/Details.php new file mode 100644 index 0000000..9fcece7 --- /dev/null +++ b/common/models/Details.php @@ -0,0 +1,163 @@ + $this->IMPORT_ID])->name; + } + + /** + * @inheritdoc + */ + public function rules() + { + return [ + [['BRAND', 'ARTICLE', 'PRICE', 'DESCR', 'BOX'], 'required' , 'on' => ['default','form_upload_validation']], + // [['PRICE'], 'number', 'on' => 'default'], + [['PRICE'], \common\components\CommaNumberValidator::className(), 'on' => 'default'], + [['BOX'], 'integer' , 'on' => 'default'], + [['timestamp'], 'safe' , 'on' => 'default'], + [['BRAND', 'ARTICLE'], 'string', 'max' => 100 , 'on' => 'default'], + [['FULL_ARTICLE'], 'string', 'max' => 150 , 'on' => 'default'], + [['DESCR', 'GROUP'], 'string', 'max' => 200 , 'on' => 'default'] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'ID' => Yii::t('app', 'ID'), + 'IMPORT_ID' => Yii::t('app', 'ПОСТАВЩИК'), + 'Importer' => Yii::t('app', 'ПОСТАВЩИК'), + 'BRAND' => Yii::t('app', 'БРЕНД'), + 'ARTICLE' => Yii::t('app', 'АРТИКУЛ'), + 'FULL_ARTICLE' => Yii::t('app', 'Full Article'), + 'PRICE' => Yii::t('app', 'ЦЕНА'), + 'DESCR' => Yii::t('app', 'ОПИСАНИЕ'), + 'BOX' => Yii::t('app', 'НАЛИЧИЕ'), + 'ADD_BOX' => Yii::t('app', 'В ПУТИ'), + 'GROUP' => Yii::t('app', 'ГРУППА RG'), + 'timestamp' => Yii::t('app', 'Timestamp'), + ]; + } + + /** + *удаление (если $delete_price установлен)б а затем вставка данных с апдейтом прямымыми запросоми SQL + * @param $data - массив вставляемых данных, вставка будет прозводится пакетами размером указанным в константе BATCH + * @param $importer_id - (int) - идентификатор поставщика у которого будет сперва удалены прайсы а потом вставлены из массива $data + * @throws \yii\db\Exception + */ + public function manualInsert($data, $importer_id) + { + if ($this->delete_price) { + // запустим пакетное удаление всех прайсов поставщика + $conditions = "IMPORT_ID = {$importer_id}"; + $this->manualDelete( $conditions ); + } + $this->manualInsertWithUpdate($data); + + } + + /** + * вставка данных с апдейтом прямым запросом SQL + * @param $data - массив вставляемых данный, вставка будет прозводится пакетами размером указанным в константе BATCH + * @throws \yii\db\Exception + */ + private function manualInsertWithUpdate($data) + { + $table_name = self::tableName(); + $keys_arr = array_keys($data[0]); + // найдем те поля которые не являются ключами. Их нужно будет при дубляже апдейтить + $fields_arr_to_update = array_diff($keys_arr, explode('~~', $this::KEY_COLUMN )); + + $query_update = ' on duplicate key update '; + foreach ($fields_arr_to_update as $field) { + $query_update .= "[[{$field}]] = values([[{$field}]]),"; + } + // удалим последнюю запятую + $query_update = substr($query_update, 0, strlen($query_update) - 1); + + // запросы будем выполнять пакетами + // размер пакета установлен в константе + // разобъем массив на пакеты и будем их проходить + $data = array_chunk($data, $this::BATCH); + foreach ($data as $current_batch_array) { + + //воспользуемся пакетной вставкой от фреймворка + $query_insert = Yii::$app->db->createCommand()->batchInsert($table_name, $keys_arr, $current_batch_array)->sql; + + // добавим фрагмент с апдейтом при дубляже + $query = "{$query_insert} {$query_update}"; + // \common\components\CustomVarDamp::dumpAndDie($query); + Yii::$app->db->createCommand($query)->execute(); + + } + } + + public function manualDelete( $conditions, $params = [] ) + { + do { + $query = Yii::$app->db->createCommand()->delete( self::tableName(), $conditions, $params )->sql . ' Limit ' . $this::BATCH; +// try { + $res = Yii::$app->db->createCommand($query)->execute(); +// } catch (\Exception $e) { +// throw new \ErrorException('Ошибка удаления товаров '.$e->getMessage()); +// } + } while ($res); + + return true; + } + +} -- libgit2 0.21.4