Commit 550f051a4f30fa03da64f26f1844360d10936152
1 parent
c790ef09
Karnovsky-05052016-0900
Showing
31 changed files
with
674 additions
and
85 deletions
Show diff stats
backend/controllers/BrandController.php
@@ -9,6 +9,8 @@ use yii\web\Controller; | @@ -9,6 +9,8 @@ use yii\web\Controller; | ||
9 | use yii\web\NotFoundHttpException; | 9 | use yii\web\NotFoundHttpException; |
10 | use yii\filters\VerbFilter; | 10 | use yii\filters\VerbFilter; |
11 | use yii\filters\AccessControl; | 11 | use yii\filters\AccessControl; |
12 | +use yii\web\UploadedFile; | ||
13 | + | ||
12 | /** | 14 | /** |
13 | * BrandController implements the CRUD actions for Brand model. | 15 | * BrandController implements the CRUD actions for Brand model. |
14 | */ | 16 | */ |
@@ -78,8 +80,14 @@ class BrandController extends Controller | @@ -78,8 +80,14 @@ class BrandController extends Controller | ||
78 | public function actionCreate() | 80 | public function actionCreate() |
79 | { | 81 | { |
80 | $model = new Brand(); | 82 | $model = new Brand(); |
81 | - if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||
82 | - exit; | 83 | + if ($model->load(Yii::$app->request->post())) { |
84 | + if ( ($image = UploadedFile::getInstance($model, 'imageUpload')) ) { | ||
85 | + $model->image = $image->name; | ||
86 | + } | ||
87 | + if ($model->save() && $image) { | ||
88 | + $image->saveAs(Yii::getAlias('@frontend/web/images/brand/' . $image->name)); | ||
89 | + } | ||
90 | + | ||
83 | return is_null(Yii::$app->request->post('create_and_new')) ? $this->redirect(['view', 'id' => $model->brand_id]) : $this->redirect(array_merge(['create'], Yii::$app->request->queryParams)); | 91 | return is_null(Yii::$app->request->post('create_and_new')) ? $this->redirect(['view', 'id' => $model->brand_id]) : $this->redirect(array_merge(['create'], Yii::$app->request->queryParams)); |
84 | } else { | 92 | } else { |
85 | return $this->render('create', [ | 93 | return $this->render('create', [ |
@@ -98,7 +106,14 @@ class BrandController extends Controller | @@ -98,7 +106,14 @@ class BrandController extends Controller | ||
98 | { | 106 | { |
99 | $model = $this->findModel($id); | 107 | $model = $this->findModel($id); |
100 | 108 | ||
101 | - if ($model->load(Yii::$app->request->post()) && $model->save()) { | 109 | + if ($model->load(Yii::$app->request->post())) { |
110 | + if ( ($image = UploadedFile::getInstance($model, 'imageUpload')) ) { | ||
111 | + $model->image = $image->name; | ||
112 | + } | ||
113 | + if ($model->save() && $image) { | ||
114 | + $image->saveAs(Yii::getAlias('@frontend/web/images/brand/' . $image->name)); | ||
115 | + } | ||
116 | + | ||
102 | return $this->redirect(['view', 'id' => $model->brand_id]); | 117 | return $this->redirect(['view', 'id' => $model->brand_id]); |
103 | } else { | 118 | } else { |
104 | return $this->render('update', [ | 119 | return $this->render('update', [ |
backend/controllers/CategoryController.php
@@ -11,6 +11,8 @@ use yii\web\Controller; | @@ -11,6 +11,8 @@ use yii\web\Controller; | ||
11 | use yii\web\NotFoundHttpException; | 11 | use yii\web\NotFoundHttpException; |
12 | use yii\filters\VerbFilter; | 12 | use yii\filters\VerbFilter; |
13 | use yii\filters\AccessControl; | 13 | use yii\filters\AccessControl; |
14 | +use yii\web\UploadedFile; | ||
15 | + | ||
14 | /** | 16 | /** |
15 | * CategoryController implements the CRUD actions for Category model. | 17 | * CategoryController implements the CRUD actions for Category model. |
16 | */ | 18 | */ |
@@ -81,7 +83,14 @@ class CategoryController extends Controller | @@ -81,7 +83,14 @@ class CategoryController extends Controller | ||
81 | { | 83 | { |
82 | $model = new Category(); | 84 | $model = new Category(); |
83 | 85 | ||
84 | - if ($model->load(Yii::$app->request->post()) && $model->save()) { | 86 | + if ($model->load(Yii::$app->request->post())) { |
87 | + if ( ($image = UploadedFile::getInstance($model, 'imageUpload')) ) { | ||
88 | + $model->image = $image->name; | ||
89 | + } | ||
90 | + if ($model->save() && $image) { | ||
91 | + $image->saveAs(Yii::getAlias('@frontend/web/images/category/' . $image->name)); | ||
92 | + } | ||
93 | + | ||
85 | return is_null(Yii::$app->request->post('create_and_new')) ? $this->redirect(['view', 'id' => $model->category_id]) : $this->redirect(array_merge(['create'], Yii::$app->request->queryParams)); | 94 | return is_null(Yii::$app->request->post('create_and_new')) ? $this->redirect(['view', 'id' => $model->category_id]) : $this->redirect(array_merge(['create'], Yii::$app->request->queryParams)); |
86 | } else { | 95 | } else { |
87 | if (!empty(Yii::$app->request->queryParams['parent'])) { | 96 | if (!empty(Yii::$app->request->queryParams['parent'])) { |
@@ -104,7 +113,14 @@ class CategoryController extends Controller | @@ -104,7 +113,14 @@ class CategoryController extends Controller | ||
104 | { | 113 | { |
105 | $model = $this->findModel($id); | 114 | $model = $this->findModel($id); |
106 | 115 | ||
107 | - if ($model->load(Yii::$app->request->post()) && $model->save()) { | 116 | + if ($model->load(Yii::$app->request->post())) { |
117 | + if ( ($image = UploadedFile::getInstance($model, 'imageUpload')) ) { | ||
118 | + $model->image = $image->name; | ||
119 | + } | ||
120 | + if ($model->save() && $image) { | ||
121 | + $image->saveAs(Yii::getAlias('@frontend/web/images/category/' . $image->name)); | ||
122 | + } | ||
123 | + | ||
108 | return $this->redirect(['view', 'id' => $model->category_id]); | 124 | return $this->redirect(['view', 'id' => $model->category_id]); |
109 | } else { | 125 | } else { |
110 | return $this->render('update', [ | 126 | return $this->render('update', [ |
backend/views/brand/_form.php
@@ -10,26 +10,27 @@ use yii\widgets\ActiveForm; | @@ -10,26 +10,27 @@ use yii\widgets\ActiveForm; | ||
10 | 10 | ||
11 | <div class="brand-form"> | 11 | <div class="brand-form"> |
12 | 12 | ||
13 | - <?php $form = ActiveForm::begin(); ?> | 13 | + <?php $form = ActiveForm::begin([ |
14 | + 'options' => ['enctype'=>'multipart/form-data'] | ||
15 | + ]); ?> | ||
14 | 16 | ||
15 | <?= $form->field($model, 'name')->textInput() ?> | 17 | <?= $form->field($model, 'name')->textInput() ?> |
16 | 18 | ||
17 | <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> | 19 | <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> |
18 | 20 | ||
19 | - <?= \common\modules\file\widgets\ImageUploader::widget([ | ||
20 | - 'model'=> $model, | ||
21 | - 'field'=>'image', | ||
22 | - 'size' => [ | ||
23 | - [ | ||
24 | - 'width'=>102, | ||
25 | - 'height'=>57, | ||
26 | - ] | 21 | + <?= $form->field($model, 'imageUpload')->widget(\kartik\file\FileInput::classname(), [ |
22 | + 'options' => [ | ||
23 | + 'accept' => 'image/*', | ||
27 | ], | 24 | ], |
28 | - 'multi'=>false, | ||
29 | - 'gallery' => $model->image, | ||
30 | - 'name' => 'Загрузить изображение' | ||
31 | - ]); | ||
32 | - ?> | 25 | + 'pluginOptions' => [ |
26 | + 'allowedFileExtensions' => ['jpg','gif','png'], | ||
27 | + 'initialPreview' => function() use ($model) { | ||
28 | + if (!empty($model->imageUrl)) | ||
29 | + return Html::img($model->imageUrl); | ||
30 | + }, | ||
31 | + 'overwriteInitial' => false, | ||
32 | + ], | ||
33 | + ]); ?> | ||
33 | 34 | ||
34 | <?= $form->field($model, 'meta_title')->textInput(['maxlength' => true]) ?> | 35 | <?= $form->field($model, 'meta_title')->textInput(['maxlength' => true]) ?> |
35 | 36 |
backend/views/brand/index.php
@@ -20,13 +20,16 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -20,13 +20,16 @@ $this->params['breadcrumbs'][] = $this->title; | ||
20 | </p> | 20 | </p> |
21 | <?= GridView::widget([ | 21 | <?= GridView::widget([ |
22 | 'dataProvider' => $dataProvider, | 22 | 'dataProvider' => $dataProvider, |
23 | -// 'filterModel' => $searchModel, | 23 | + 'filterModel' => $searchModel, |
24 | 'columns' => [ | 24 | 'columns' => [ |
25 | ['class' => 'yii\grid\SerialColumn'], | 25 | ['class' => 'yii\grid\SerialColumn'], |
26 | - | ||
27 | - 'name', | 26 | + [ |
27 | + 'label' => Yii::t('product', 'Brand'), | ||
28 | + 'value' => 'brandName.value', | ||
29 | + 'attribute' => 'brand_name' | ||
30 | + ], | ||
28 | 'alias', | 31 | 'alias', |
29 | - | 32 | + 'imageUrl:image', |
30 | ['class' => 'yii\grid\ActionColumn'], | 33 | ['class' => 'yii\grid\ActionColumn'], |
31 | ], | 34 | ], |
32 | ]); ?> | 35 | ]); ?> |
backend/views/brand/update.php
@@ -7,9 +7,9 @@ use yii\helpers\Html; | @@ -7,9 +7,9 @@ use yii\helpers\Html; | ||
7 | 7 | ||
8 | $this->title = Yii::t('product', 'Update {modelClass}: ', [ | 8 | $this->title = Yii::t('product', 'Update {modelClass}: ', [ |
9 | 'modelClass' => 'Brand', | 9 | 'modelClass' => 'Brand', |
10 | -]) . ' ' . $model->brand_id; | 10 | +]) . ' ' . $model->name; |
11 | $this->params['breadcrumbs'][] = ['label' => Yii::t('product', 'Brands'), 'url' => ['index']]; | 11 | $this->params['breadcrumbs'][] = ['label' => Yii::t('product', 'Brands'), 'url' => ['index']]; |
12 | -$this->params['breadcrumbs'][] = ['label' => $model->brand_id, 'url' => ['view', 'id' => $model->brand_id]]; | 12 | +$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->brand_id]]; |
13 | $this->params['breadcrumbs'][] = Yii::t('product', 'Update'); | 13 | $this->params['breadcrumbs'][] = Yii::t('product', 'Update'); |
14 | ?> | 14 | ?> |
15 | <div class="brand-update"> | 15 | <div class="brand-update"> |
backend/views/brand/view.php
@@ -31,7 +31,7 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -31,7 +31,7 @@ $this->params['breadcrumbs'][] = $this->title; | ||
31 | 'brand_id', | 31 | 'brand_id', |
32 | 'brand_name_id', | 32 | 'brand_name_id', |
33 | 'alias', | 33 | 'alias', |
34 | - 'image', | 34 | + 'imageUrl:image', |
35 | 'meta_title', | 35 | 'meta_title', |
36 | 'meta_desc:ntext', | 36 | 'meta_desc:ntext', |
37 | 'meta_robots', | 37 | 'meta_robots', |
backend/views/category/_form.php
@@ -12,18 +12,46 @@ use kartik\select2\Select2; | @@ -12,18 +12,46 @@ use kartik\select2\Select2; | ||
12 | 12 | ||
13 | <div class="category-form"> | 13 | <div class="category-form"> |
14 | 14 | ||
15 | - <?php $form = ActiveForm::begin(); ?> | 15 | + <?php $form = ActiveForm::begin([ |
16 | + 'options' => ['enctype'=>'multipart/form-data'] | ||
17 | + ]); ?> | ||
16 | 18 | ||
17 | <?= $form->field($model, 'name')->textInput() ?> | 19 | <?= $form->field($model, 'name')->textInput() ?> |
18 | 20 | ||
19 | <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> | 21 | <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> |
20 | 22 | ||
21 | - <?= $form->field($model, 'parent_id')->dropDownList($categories, [ | 23 | + <?php /*= $form->field($model, 'parent_id')->dropDownList($categories, [ |
22 | 'prompt' => Yii::t('rubrication', 'Root category'), | 24 | 'prompt' => Yii::t('rubrication', 'Root category'), |
23 | 'options' => [ | 25 | 'options' => [ |
24 | $model->category_id => ['disabled' => true] | 26 | $model->category_id => ['disabled' => true] |
25 | ] | 27 | ] |
26 | - ])->label(Yii::t('product', 'Parent category')) ?> | 28 | + ])->label(Yii::t('rubrication', 'Parent category')) */?> |
29 | + | ||
30 | + <?= $form->field($model, 'parent_id')->widget(Select2::className(), [ | ||
31 | + 'data' => $categories, | ||
32 | + 'language' => 'ru', | ||
33 | + 'options' => [ | ||
34 | + 'placeholder' => Yii::t('product', 'Parent category'), | ||
35 | + 'multiple' => false, | ||
36 | + ], | ||
37 | + 'pluginOptions' => [ | ||
38 | + 'allowClear' => true | ||
39 | + ], | ||
40 | + ] | ||
41 | + ) ?> | ||
42 | + | ||
43 | + <?= $form->field($model, 'product_unit_id')->widget(Select2::className(), [ | ||
44 | + 'data' => \yii\helpers\ArrayHelper::map(\common\modules\product\models\ProductUnit::find()->all(), 'product_unit_id', 'name'), | ||
45 | + 'language' => 'ru', | ||
46 | + 'options' => [ | ||
47 | + 'placeholder' => Yii::t('product', 'Select unit'), | ||
48 | + 'multiple' => false, | ||
49 | + ], | ||
50 | + 'pluginOptions' => [ | ||
51 | + 'allowClear' => true | ||
52 | + ], | ||
53 | + ] | ||
54 | + ) ?> | ||
27 | 55 | ||
28 | <?php /* | 56 | <?php /* |
29 | <?= $form->field($model, 'group_to_category')->dropDownList( | 57 | <?= $form->field($model, 'group_to_category')->dropDownList( |
@@ -45,20 +73,14 @@ use kartik\select2\Select2; | @@ -45,20 +73,14 @@ use kartik\select2\Select2; | ||
45 | ] | 73 | ] |
46 | ) ?> | 74 | ) ?> |
47 | 75 | ||
48 | - <?= ImageUploader::widget([ | ||
49 | - 'model'=> $model, | ||
50 | - 'field'=>'image', | ||
51 | - 'size' => [ | ||
52 | - [ | ||
53 | - 'width'=>340, | ||
54 | - 'height'=>260, | ||
55 | - ] | 76 | + <?= $form->field($model, 'imageUpload')->widget(\kartik\file\FileInput::classname(), [ |
77 | + 'options' => [ | ||
78 | + 'accept' => 'image/*', | ||
79 | + ], | ||
80 | + 'pluginOptions' => [ | ||
81 | + 'allowedFileExtensions' => ['jpg','gif','png'], | ||
56 | ], | 82 | ], |
57 | - 'multi'=>false, | ||
58 | - 'gallery' => $model->image, | ||
59 | - 'name' => 'Загрузить изображение' | ||
60 | - ]); | ||
61 | - ?> | 83 | + ]); ?> |
62 | 84 | ||
63 | <?= $form->field($model, 'meta_title')->textInput(['maxlength' => true]) ?> | 85 | <?= $form->field($model, 'meta_title')->textInput(['maxlength' => true]) ?> |
64 | 86 |
backend/views/category/index.php
@@ -35,6 +35,7 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -35,6 +35,7 @@ $this->params['breadcrumbs'][] = $this->title; | ||
35 | // return str_repeat('-', $data->depth) .' '. $data->name; | 35 | // return str_repeat('-', $data->depth) .' '. $data->name; |
36 | } | 36 | } |
37 | ], | 37 | ], |
38 | +// 'imageUrl:image', | ||
38 | [ | 39 | [ |
39 | 'class' => 'yii\grid\ActionColumn', | 40 | 'class' => 'yii\grid\ActionColumn', |
40 | 'template' => '{view} {update} {delete} {populary}', | 41 | 'template' => '{view} {update} {delete} {populary}', |
backend/views/category/view.php
@@ -33,10 +33,8 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -33,10 +33,8 @@ $this->params['breadcrumbs'][] = $this->title; | ||
33 | 'model' => $model, | 33 | 'model' => $model, |
34 | 'attributes' => [ | 34 | 'attributes' => [ |
35 | 'category_id', | 35 | 'category_id', |
36 | - 'parent_id', | ||
37 | - 'path', | ||
38 | - 'depth', | ||
39 | - 'image', | 36 | + 'parent.name', |
37 | + 'imageUrl:image', | ||
40 | 'meta_title', | 38 | 'meta_title', |
41 | 'meta_desc:ntext', | 39 | 'meta_desc:ntext', |
42 | 'meta_robots', | 40 | 'meta_robots', |
backend/views/layouts/main-sidebar.php
@@ -33,6 +33,7 @@ use yii\widgets\Menu; | @@ -33,6 +33,7 @@ use yii\widgets\Menu; | ||
33 | ['label' => 'Категории', 'url' => ['/category']], | 33 | ['label' => 'Категории', 'url' => ['/category']], |
34 | ['label' => 'Бренды', 'url' => ['/brand']], | 34 | ['label' => 'Бренды', 'url' => ['/brand']], |
35 | ['label' => 'Характеристики', 'url' => ['/rubrication/tax-group']], | 35 | ['label' => 'Характеристики', 'url' => ['/rubrication/tax-group']], |
36 | + ['label' => 'Единицы измерения', 'url' => ['/product/product-unit']], | ||
36 | ['label' => 'Статистика импорта', 'url' => ['/product/manage/import-stat']], | 37 | ['label' => 'Статистика импорта', 'url' => ['/product/manage/import-stat']], |
37 | ] | 38 | ] |
38 | ], | 39 | ], |
common/modules/product/CatalogUrlManager.php
@@ -111,6 +111,7 @@ class CatalogUrlManager implements UrlRuleInterface { | @@ -111,6 +111,7 @@ class CatalogUrlManager implements UrlRuleInterface { | ||
111 | $params['word'] = [$params['word']]; | 111 | $params['word'] = [$params['word']]; |
112 | } | 112 | } |
113 | $url .= 'word:'. implode(';', $params['word']); | 113 | $url .= 'word:'. implode(';', $params['word']); |
114 | + unset($params['word']); | ||
114 | } | 115 | } |
115 | 116 | ||
116 | $filter = []; | 117 | $filter = []; |
@@ -147,6 +148,10 @@ class CatalogUrlManager implements UrlRuleInterface { | @@ -147,6 +148,10 @@ class CatalogUrlManager implements UrlRuleInterface { | ||
147 | $url .= 'filter:'. implode(';', $filter); | 148 | $url .= 'filter:'. implode(';', $filter); |
148 | } | 149 | } |
149 | 150 | ||
151 | + if (!empty($params) && ($query = http_build_query($params)) !== '') { | ||
152 | + $url .= '?' . $query; | ||
153 | + } | ||
154 | + | ||
150 | return $url; | 155 | return $url; |
151 | break; | 156 | break; |
152 | 157 | ||
@@ -155,6 +160,11 @@ class CatalogUrlManager implements UrlRuleInterface { | @@ -155,6 +160,11 @@ class CatalogUrlManager implements UrlRuleInterface { | ||
155 | $product_alias = is_object($params['product']) ? $params['product']->alias : strtolower($params['product']); | 160 | $product_alias = is_object($params['product']) ? $params['product']->alias : strtolower($params['product']); |
156 | } | 161 | } |
157 | $url = 'product/'. $product_alias; | 162 | $url = 'product/'. $product_alias; |
163 | + | ||
164 | + if (!empty($params) && ($query = http_build_query($params)) !== '') { | ||
165 | + $url .= '?' . $query; | ||
166 | + } | ||
167 | + | ||
158 | return $url; | 168 | return $url; |
159 | break; | 169 | break; |
160 | } | 170 | } |
common/modules/product/controllers/ProductUnitController.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace common\modules\product\controllers; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use common\modules\product\models\ProductUnit; | ||
7 | +use common\modules\product\models\ProductUnitSearch; | ||
8 | +use yii\web\Controller; | ||
9 | +use yii\web\NotFoundHttpException; | ||
10 | +use yii\filters\VerbFilter; | ||
11 | + | ||
12 | +/** | ||
13 | + * ProductUnitController implements the CRUD actions for ProductUnit model. | ||
14 | + */ | ||
15 | +class ProductUnitController extends Controller | ||
16 | +{ | ||
17 | + /** | ||
18 | + * @inheritdoc | ||
19 | + */ | ||
20 | + public function behaviors() | ||
21 | + { | ||
22 | + return [ | ||
23 | + 'verbs' => [ | ||
24 | + 'class' => VerbFilter::className(), | ||
25 | + 'actions' => [ | ||
26 | + 'delete' => ['POST'], | ||
27 | + ], | ||
28 | + ], | ||
29 | + ]; | ||
30 | + } | ||
31 | + | ||
32 | + /** | ||
33 | + * Lists all ProductUnit models. | ||
34 | + * @return mixed | ||
35 | + */ | ||
36 | + public function actionIndex() | ||
37 | + { | ||
38 | + $searchModel = new ProductUnitSearch(); | ||
39 | + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||
40 | + | ||
41 | + return $this->render('index', [ | ||
42 | + 'searchModel' => $searchModel, | ||
43 | + 'dataProvider' => $dataProvider, | ||
44 | + ]); | ||
45 | + } | ||
46 | + | ||
47 | + /** | ||
48 | + * Displays a single ProductUnit model. | ||
49 | + * @param integer $id | ||
50 | + * @return mixed | ||
51 | + */ | ||
52 | + public function actionView($id) | ||
53 | + { | ||
54 | + return $this->render('view', [ | ||
55 | + 'model' => $this->findModel($id), | ||
56 | + ]); | ||
57 | + } | ||
58 | + | ||
59 | + /** | ||
60 | + * Creates a new ProductUnit model. | ||
61 | + * If creation is successful, the browser will be redirected to the 'view' page. | ||
62 | + * @return mixed | ||
63 | + */ | ||
64 | + public function actionCreate() | ||
65 | + { | ||
66 | + $model = new ProductUnit(); | ||
67 | + | ||
68 | + if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||
69 | + return $this->redirect(['view', 'id' => $model->product_unit_id]); | ||
70 | + } else { | ||
71 | + return $this->render('create', [ | ||
72 | + 'model' => $model, | ||
73 | + ]); | ||
74 | + } | ||
75 | + } | ||
76 | + | ||
77 | + /** | ||
78 | + * Updates an existing ProductUnit model. | ||
79 | + * If update is successful, the browser will be redirected to the 'view' page. | ||
80 | + * @param integer $id | ||
81 | + * @return mixed | ||
82 | + */ | ||
83 | + public function actionUpdate($id) | ||
84 | + { | ||
85 | + $model = $this->findModel($id); | ||
86 | + | ||
87 | + if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||
88 | + return $this->redirect(['view', 'id' => $model->product_unit_id]); | ||
89 | + } else { | ||
90 | + return $this->render('update', [ | ||
91 | + 'model' => $model, | ||
92 | + ]); | ||
93 | + } | ||
94 | + } | ||
95 | + | ||
96 | + /** | ||
97 | + * Deletes an existing ProductUnit model. | ||
98 | + * If deletion is successful, the browser will be redirected to the 'index' page. | ||
99 | + * @param integer $id | ||
100 | + * @return mixed | ||
101 | + */ | ||
102 | + public function actionDelete($id) | ||
103 | + { | ||
104 | + $this->findModel($id)->delete(); | ||
105 | + | ||
106 | + return $this->redirect(['index']); | ||
107 | + } | ||
108 | + | ||
109 | + /** | ||
110 | + * Finds the ProductUnit model based on its primary key value. | ||
111 | + * If the model is not found, a 404 HTTP exception will be thrown. | ||
112 | + * @param integer $id | ||
113 | + * @return ProductUnit the loaded model | ||
114 | + * @throws NotFoundHttpException if the model cannot be found | ||
115 | + */ | ||
116 | + protected function findModel($id) | ||
117 | + { | ||
118 | + if (($model = ProductUnit::findOne($id)) !== null) { | ||
119 | + return $model; | ||
120 | + } else { | ||
121 | + throw new NotFoundHttpException('The requested page does not exist.'); | ||
122 | + } | ||
123 | + } | ||
124 | +} |
common/modules/product/models/Brand.php
@@ -24,6 +24,8 @@ use Yii; | @@ -24,6 +24,8 @@ use Yii; | ||
24 | */ | 24 | */ |
25 | class Brand extends \yii\db\ActiveRecord | 25 | class Brand extends \yii\db\ActiveRecord |
26 | { | 26 | { |
27 | + public $imageUpload; | ||
28 | + | ||
27 | public function behaviors() | 29 | public function behaviors() |
28 | { | 30 | { |
29 | return [ | 31 | return [ |
@@ -64,6 +66,8 @@ class Brand extends \yii\db\ActiveRecord | @@ -64,6 +66,8 @@ class Brand extends \yii\db\ActiveRecord | ||
64 | [['alias', 'name'], 'string', 'max' => 250], | 66 | [['alias', 'name'], 'string', 'max' => 250], |
65 | [['image', 'meta_title'], 'string', 'max' => 255], | 67 | [['image', 'meta_title'], 'string', 'max' => 255], |
66 | [['meta_robots'], 'string', 'max' => 50], | 68 | [['meta_robots'], 'string', 'max' => 50], |
69 | + [['imageUpload'], 'safe'], | ||
70 | + [['imageUpload'], 'file', 'extensions' => 'jpg, gif, png'], | ||
67 | // [['brand_name_id'], 'exist', 'skipOnError' => true, 'targetClass' => BrandName::className(), 'targetAttribute' => ['brand_name_id' => 'brand_name_id']], | 71 | // [['brand_name_id'], 'exist', 'skipOnError' => true, 'targetClass' => BrandName::className(), 'targetAttribute' => ['brand_name_id' => 'brand_name_id']], |
68 | ]; | 72 | ]; |
69 | } | 73 | } |
@@ -79,6 +83,7 @@ class Brand extends \yii\db\ActiveRecord | @@ -79,6 +83,7 @@ class Brand extends \yii\db\ActiveRecord | ||
79 | 'brand_name_id' => Yii::t('product', 'Brand Name ID'), | 83 | 'brand_name_id' => Yii::t('product', 'Brand Name ID'), |
80 | 'alias' => Yii::t('product', 'Alias'), | 84 | 'alias' => Yii::t('product', 'Alias'), |
81 | 'image' => Yii::t('product', 'Image'), | 85 | 'image' => Yii::t('product', 'Image'), |
86 | + 'imageUrl' => Yii::t('product', 'Image'), | ||
82 | 'meta_title' => Yii::t('product', 'Meta Title'), | 87 | 'meta_title' => Yii::t('product', 'Meta Title'), |
83 | 'meta_desc' => Yii::t('product', 'Meta Desc'), | 88 | 'meta_desc' => Yii::t('product', 'Meta Desc'), |
84 | 'meta_robots' => Yii::t('product', 'Meta Robots'), | 89 | 'meta_robots' => Yii::t('product', 'Meta Robots'), |
@@ -113,4 +118,8 @@ class Brand extends \yii\db\ActiveRecord | @@ -113,4 +118,8 @@ class Brand extends \yii\db\ActiveRecord | ||
113 | public function getName() { | 118 | public function getName() { |
114 | return empty($this->brand_name_id) ? null : $this->brandName->value; | 119 | return empty($this->brand_name_id) ? null : $this->brandName->value; |
115 | } | 120 | } |
121 | + | ||
122 | + public function getImageUrl() { | ||
123 | + return empty($this->image) ? null : '/images/brand/'. $this->image; | ||
124 | + } | ||
116 | } | 125 | } |
common/modules/product/models/BrandSearch.php
@@ -12,6 +12,7 @@ use common\modules\product\models\Brand; | @@ -12,6 +12,7 @@ use common\modules\product\models\Brand; | ||
12 | */ | 12 | */ |
13 | class BrandSearch extends Brand | 13 | class BrandSearch extends Brand |
14 | { | 14 | { |
15 | + public $brand_name; | ||
15 | /** | 16 | /** |
16 | * @inheritdoc | 17 | * @inheritdoc |
17 | */ | 18 | */ |
@@ -19,7 +20,7 @@ class BrandSearch extends Brand | @@ -19,7 +20,7 @@ class BrandSearch extends Brand | ||
19 | { | 20 | { |
20 | return [ | 21 | return [ |
21 | [['brand_id', 'brand_name_id'], 'integer'], | 22 | [['brand_id', 'brand_name_id'], 'integer'], |
22 | - [['alias', 'image', 'meta_title', 'meta_desc', 'meta_robots', 'seo_text'], 'safe'], | 23 | + [['alias', 'image', 'meta_title', 'meta_desc', 'meta_robots', 'seo_text', 'brand_name'], 'safe'], |
23 | ]; | 24 | ]; |
24 | } | 25 | } |
25 | 26 | ||
@@ -57,18 +58,28 @@ class BrandSearch extends Brand | @@ -57,18 +58,28 @@ class BrandSearch extends Brand | ||
57 | return $dataProvider; | 58 | return $dataProvider; |
58 | }*/ | 59 | }*/ |
59 | 60 | ||
61 | + $dataProvider->setSort([ | ||
62 | + 'attributes' => [ | ||
63 | + 'brand_name', | ||
64 | + 'alias' | ||
65 | + ] | ||
66 | + ]); | ||
67 | + | ||
60 | // grid filtering conditions | 68 | // grid filtering conditions |
61 | $query->andFilterWhere([ | 69 | $query->andFilterWhere([ |
62 | 'brand_id' => $this->brand_id, | 70 | 'brand_id' => $this->brand_id, |
63 | 'brand_name_id' => $this->brand_name_id, | 71 | 'brand_name_id' => $this->brand_name_id, |
64 | ]); | 72 | ]); |
65 | 73 | ||
66 | - $query->andFilterWhere(['like', 'alias', $this->alias]) | ||
67 | - ->andFilterWhere(['like', 'image', $this->image]) | ||
68 | - ->andFilterWhere(['like', 'meta_title', $this->meta_title]) | ||
69 | - ->andFilterWhere(['like', 'meta_desc', $this->meta_desc]) | ||
70 | - ->andFilterWhere(['like', 'meta_robots', $this->meta_robots]) | ||
71 | - ->andFilterWhere(['like', 'seo_text', $this->seo_text]); | 74 | + $query->joinWith('brandName'); |
75 | + | ||
76 | + $query->andFilterWhere(['ilike', 'alias', $this->alias]) | ||
77 | + ->andFilterWhere(['ilike', 'image', $this->image]) | ||
78 | + ->andFilterWhere(['ilike', 'meta_title', $this->meta_title]) | ||
79 | + ->andFilterWhere(['ilike', 'meta_desc', $this->meta_desc]) | ||
80 | + ->andFilterWhere(['ilike', 'meta_robots', $this->meta_robots]) | ||
81 | + ->andFilterWhere(['ilike', 'seo_text', $this->seo_text]) | ||
82 | + ->andFilterWhere(['ilike', 'brand_name.value', $this->brand_name]); | ||
72 | 83 | ||
73 | return $dataProvider; | 84 | return $dataProvider; |
74 | } | 85 | } |
common/modules/product/models/Category.php
@@ -34,6 +34,8 @@ use Yii; | @@ -34,6 +34,8 @@ use Yii; | ||
34 | */ | 34 | */ |
35 | class Category extends \yii\db\ActiveRecord | 35 | class Category extends \yii\db\ActiveRecord |
36 | { | 36 | { |
37 | + public $imageUpload; | ||
38 | + | ||
37 | public function behaviors() | 39 | public function behaviors() |
38 | { | 40 | { |
39 | return [ | 41 | return [ |
@@ -89,7 +91,8 @@ class Category extends \yii\db\ActiveRecord | @@ -89,7 +91,8 @@ class Category extends \yii\db\ActiveRecord | ||
89 | [['populary'], 'boolean'], | 91 | [['populary'], 'boolean'], |
90 | [['group_to_category', 'remote_category'], 'safe'], | 92 | [['group_to_category', 'remote_category'], 'safe'], |
91 | [['category_name_id'], 'exist', 'skipOnError' => true, 'targetClass' => CategoryName::className(), 'targetAttribute' => ['category_name_id' => 'category_name_id']], | 93 | [['category_name_id'], 'exist', 'skipOnError' => true, 'targetClass' => CategoryName::className(), 'targetAttribute' => ['category_name_id' => 'category_name_id']], |
92 | - // [['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'], | 94 | + [['imageUpload'], 'safe'], |
95 | + [['imageUpload'], 'file', 'extensions' => 'jpg, gif, png'], | ||
93 | // [['product_unit_id'], 'exist', 'skipOnError' => true, 'targetClass' => ProductUnit::className(), 'targetAttribute' => ['product_unit_id' => 'product_unit_id']], | 96 | // [['product_unit_id'], 'exist', 'skipOnError' => true, 'targetClass' => ProductUnit::className(), 'targetAttribute' => ['product_unit_id' => 'product_unit_id']], |
94 | ]; | 97 | ]; |
95 | } | 98 | } |
@@ -105,6 +108,7 @@ class Category extends \yii\db\ActiveRecord | @@ -105,6 +108,7 @@ class Category extends \yii\db\ActiveRecord | ||
105 | 'path' => Yii::t('product', 'Path'), | 108 | 'path' => Yii::t('product', 'Path'), |
106 | 'depth' => Yii::t('product', 'Depth'), | 109 | 'depth' => Yii::t('product', 'Depth'), |
107 | 'image' => Yii::t('product', 'Image'), | 110 | 'image' => Yii::t('product', 'Image'), |
111 | + 'imageUrl' => Yii::t('product', 'Image'), | ||
108 | 'meta_title' => Yii::t('product', 'Meta Title'), | 112 | 'meta_title' => Yii::t('product', 'Meta Title'), |
109 | 'meta_desc' => Yii::t('product', 'Meta Desc'), | 113 | 'meta_desc' => Yii::t('product', 'Meta Desc'), |
110 | 'meta_robots' => Yii::t('product', 'Meta Robots'), | 114 | 'meta_robots' => Yii::t('product', 'Meta Robots'), |
@@ -117,7 +121,8 @@ class Category extends \yii\db\ActiveRecord | @@ -117,7 +121,8 @@ class Category extends \yii\db\ActiveRecord | ||
117 | ]; | 121 | ]; |
118 | } | 122 | } |
119 | 123 | ||
120 | - public static function find() { | 124 | + public static function find() |
125 | + { | ||
121 | return new CategoryQuery(get_called_class()); | 126 | return new CategoryQuery(get_called_class()); |
122 | } | 127 | } |
123 | 128 | ||
@@ -145,28 +150,38 @@ class Category extends \yii\db\ActiveRecord | @@ -145,28 +150,38 @@ class Category extends \yii\db\ActiveRecord | ||
145 | return $this->hasMany(ProductCategory::className(), ['category_id' => 'category_id']); | 150 | return $this->hasMany(ProductCategory::className(), ['category_id' => 'category_id']); |
146 | } | 151 | } |
147 | 152 | ||
148 | - public function getTaxGroups() { | 153 | + public function getTaxGroups() |
154 | + { | ||
149 | return $this->getRelations('tax_group_to_category'); | 155 | return $this->getRelations('tax_group_to_category'); |
150 | } | 156 | } |
151 | 157 | ||
152 | - public function getRemote_category() { | 158 | + public function getRemote_category() |
159 | + { | ||
153 | return ArtboxTreeHelper::getArrayField($this->remote_id); | 160 | return ArtboxTreeHelper::getArrayField($this->remote_id); |
154 | } | 161 | } |
155 | 162 | ||
156 | - public function setRemote_category($value) { | 163 | + public function setRemote_category($value) |
164 | + { | ||
157 | if (!empty($value) && is_array($value)) { | 165 | if (!empty($value) && is_array($value)) { |
158 | $this->remote_id = ArtboxTreeHelper::setArrayField($value, false); | 166 | $this->remote_id = ArtboxTreeHelper::setArrayField($value, false); |
159 | } | 167 | } |
160 | } | 168 | } |
161 | 169 | ||
162 | - public function getCategoryName() { | 170 | + public function getCategoryName() |
171 | + { | ||
163 | return $this->hasOne(CategoryName::className(), ['category_name_id' => 'category_name_id']); | 172 | return $this->hasOne(CategoryName::className(), ['category_name_id' => 'category_name_id']); |
164 | } | 173 | } |
165 | 174 | ||
166 | - public function getName() { | 175 | + public function getName() |
176 | + { | ||
167 | return empty($this->categoryName) ? null : $this->categoryName->value; | 177 | return empty($this->categoryName) ? null : $this->categoryName->value; |
168 | } | 178 | } |
169 | 179 | ||
180 | + public function getImageUrl() | ||
181 | + { | ||
182 | + return empty($this->image) ? null : '/images/category/' . $this->image; | ||
183 | + } | ||
184 | + | ||
170 | public function beforeSave($insert) | 185 | public function beforeSave($insert) |
171 | { | 186 | { |
172 | if (parent::beforeSave($insert)) { | 187 | if (parent::beforeSave($insert)) { |
common/modules/product/models/Product.php
@@ -19,6 +19,8 @@ use yii\db\ActiveQuery; | @@ -19,6 +19,8 @@ use yii\db\ActiveQuery; | ||
19 | * @property ProductVariant $variant | 19 | * @property ProductVariant $variant |
20 | * @property ProductImage $image | 20 | * @property ProductImage $image |
21 | * @property array $images | 21 | * @property array $images |
22 | + * @property boolean $is_top | ||
23 | + * @property boolean $is_new | ||
22 | */ | 24 | */ |
23 | class Product extends \yii\db\ActiveRecord | 25 | class Product extends \yii\db\ActiveRecord |
24 | { | 26 | { |
@@ -69,6 +71,7 @@ class Product extends \yii\db\ActiveRecord | @@ -69,6 +71,7 @@ class Product extends \yii\db\ActiveRecord | ||
69 | [['categories', 'variants', 'options'], 'safe'], | 71 | [['categories', 'variants', 'options'], 'safe'], |
70 | // [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'], | 72 | // [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'], |
71 | [['description', 'video'], 'safe'], | 73 | [['description', 'video'], 'safe'], |
74 | + [['is_top', 'is_new'], 'boolean'], | ||
72 | // [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']], | 75 | // [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']], |
73 | ]; | 76 | ]; |
74 | } | 77 | } |
@@ -86,6 +89,11 @@ class Product extends \yii\db\ActiveRecord | @@ -86,6 +89,11 @@ class Product extends \yii\db\ActiveRecord | ||
86 | 'category' => Yii::t('product', 'Category'), // relation behavior field | 89 | 'category' => Yii::t('product', 'Category'), // relation behavior field |
87 | 'image' => Yii::t('product', 'Image'), | 90 | 'image' => Yii::t('product', 'Image'), |
88 | 'images' => Yii::t('product', 'Images'), | 91 | 'images' => Yii::t('product', 'Images'), |
92 | + 'description' => Yii::t('product', 'Description'), | ||
93 | + 'video' => Yii::t('product', 'Video embeded'), | ||
94 | + 'variants' => Yii::t('product', 'Variants'), | ||
95 | + 'is_top' => Yii::t('product', 'Is top'), | ||
96 | + 'is_new' => Yii::t('product', 'Is new'), | ||
89 | ]; | 97 | ]; |
90 | } | 98 | } |
91 | 99 | ||
@@ -146,7 +154,8 @@ class Product extends \yii\db\ActiveRecord | @@ -146,7 +154,8 @@ class Product extends \yii\db\ActiveRecord | ||
146 | } | 154 | } |
147 | 155 | ||
148 | public function getCategories() { | 156 | public function getCategories() { |
149 | - return $this->getRelations('product_categories'); | 157 | + return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']); |
158 | +// return $this->getRelations('product_categories'); | ||
150 | } | 159 | } |
151 | 160 | ||
152 | public function getCategoriesNames() { | 161 | public function getCategoriesNames() { |
@@ -158,12 +167,7 @@ class Product extends \yii\db\ActiveRecord | @@ -158,12 +167,7 @@ class Product extends \yii\db\ActiveRecord | ||
158 | } | 167 | } |
159 | 168 | ||
160 | public function getCategory() { | 169 | public function getCategory() { |
161 | - /** @var ActiveQuery $categories */ | ||
162 | - $categories = $this->getRelations('product_categories'); | ||
163 | - $count = $categories->count(); | ||
164 | - if ($count == 0) | ||
165 | - return; | ||
166 | - return $categories->one(); | 170 | + return $this->hasOne(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']); |
167 | } | 171 | } |
168 | 172 | ||
169 | public function getOptions() { | 173 | public function getOptions() { |
common/modules/product/models/ProductSearch.php
@@ -13,14 +13,18 @@ use yii\web\NotFoundHttpException; | @@ -13,14 +13,18 @@ use yii\web\NotFoundHttpException; | ||
13 | */ | 13 | */ |
14 | class ProductSearch extends Product | 14 | class ProductSearch extends Product |
15 | { | 15 | { |
16 | + public $brand_name; | ||
17 | + public $category_name; | ||
18 | + | ||
16 | /** | 19 | /** |
17 | * @inheritdoc | 20 | * @inheritdoc |
18 | */ | 21 | */ |
19 | public function rules() | 22 | public function rules() |
20 | { | 23 | { |
21 | return [ | 24 | return [ |
22 | - [['name'], 'safe'], | 25 | + [['name', 'brand_name', 'category_name'], 'safe'], |
23 | [['tax_brand_id', 'product_id'], 'integer'], | 26 | [['tax_brand_id', 'product_id'], 'integer'], |
27 | + [['is_top', 'is_new'], 'boolean'], | ||
24 | ]; | 28 | ]; |
25 | } | 29 | } |
26 | 30 | ||
@@ -58,13 +62,27 @@ class ProductSearch extends Product | @@ -58,13 +62,27 @@ class ProductSearch extends Product | ||
58 | return $dataProvider; | 62 | return $dataProvider; |
59 | } | 63 | } |
60 | 64 | ||
65 | + $dataProvider->setSort([ | ||
66 | + 'attributes' => [ | ||
67 | + 'name', | ||
68 | + 'brand_name', | ||
69 | + 'category_name' | ||
70 | + ] | ||
71 | + ]); | ||
72 | + | ||
73 | + $query->joinWith(['brand', 'brand.brandNames', 'categories', 'categories.categoryNames']); | ||
74 | + | ||
61 | // grid filtering conditions | 75 | // grid filtering conditions |
62 | $query->andFilterWhere([ | 76 | $query->andFilterWhere([ |
63 | 'tax_brand_id' => $this->tax_brand_id, | 77 | 'tax_brand_id' => $this->tax_brand_id, |
64 | 'product_id' => $this->product_id, | 78 | 'product_id' => $this->product_id, |
79 | + 'is_top' => (bool)$this->is_top, | ||
80 | + 'is_new' => (bool)$this->is_new, | ||
65 | ]); | 81 | ]); |
66 | 82 | ||
67 | - $query->andFilterWhere(['like', 'name', $this->name]); | 83 | + $query->andFilterWhere(['ilike', 'name', $this->name]); |
84 | + $query->andFilterWhere(['ilike', 'brand_name.value', $this->brand_name]); | ||
85 | + $query->andFilterWhere(['ilike', 'category_name.value', $this->category_name]); | ||
68 | 86 | ||
69 | return $dataProvider; | 87 | return $dataProvider; |
70 | } | 88 | } |
common/modules/product/models/ProductUnitSearch.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace common\modules\product\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | +use yii\base\Model; | ||
7 | +use yii\data\ActiveDataProvider; | ||
8 | +use common\modules\product\models\ProductUnit; | ||
9 | + | ||
10 | +/** | ||
11 | + * ProductUnitSearch represents the model behind the search form about `common\modules\product\models\ProductUnit`. | ||
12 | + */ | ||
13 | +class ProductUnitSearch extends ProductUnit | ||
14 | +{ | ||
15 | + /** | ||
16 | + * @inheritdoc | ||
17 | + */ | ||
18 | + public function rules() | ||
19 | + { | ||
20 | + return [ | ||
21 | + [['product_unit_id'], 'integer'], | ||
22 | + [['name', 'code'], 'safe'], | ||
23 | + [['is_default'], 'boolean'], | ||
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 = ProductUnit::find(); | ||
46 | + | ||
47 | + // add conditions that should always apply here | ||
48 | + | ||
49 | + $dataProvider = new ActiveDataProvider([ | ||
50 | + 'query' => $query, | ||
51 | + ]); | ||
52 | + | ||
53 | + $this->load($params); | ||
54 | + | ||
55 | + if (!$this->validate()) { | ||
56 | + // uncomment the following line if you do not want to return any records when validation fails | ||
57 | + // $query->where('0=1'); | ||
58 | + return $dataProvider; | ||
59 | + } | ||
60 | + | ||
61 | + // grid filtering conditions | ||
62 | + $query->andFilterWhere([ | ||
63 | + 'product_unit_id' => $this->product_unit_id, | ||
64 | + 'is_default' => $this->is_default, | ||
65 | + ]); | ||
66 | + | ||
67 | + $query->andFilterWhere(['like', 'name', $this->name]) | ||
68 | + ->andFilterWhere(['like', 'code', $this->code]); | ||
69 | + | ||
70 | + return $dataProvider; | ||
71 | + } | ||
72 | +} |
common/modules/product/models/ProductVariant.php
@@ -58,6 +58,7 @@ class ProductVariant extends \yii\db\ActiveRecord | @@ -58,6 +58,7 @@ class ProductVariant extends \yii\db\ActiveRecord | ||
58 | 'price_old' => Yii::t('product', 'Price Old'), | 58 | 'price_old' => Yii::t('product', 'Price Old'), |
59 | 'stock' => Yii::t('product', 'Stock'), | 59 | 'stock' => Yii::t('product', 'Stock'), |
60 | 'product_unit_id' => Yii::t('product', 'Product Unit ID'), | 60 | 'product_unit_id' => Yii::t('product', 'Product Unit ID'), |
61 | + 'stock_caption' => Yii::t('product', 'Stock'), | ||
61 | ]; | 62 | ]; |
62 | } | 63 | } |
63 | 64 | ||
@@ -77,6 +78,14 @@ class ProductVariant extends \yii\db\ActiveRecord | @@ -77,6 +78,14 @@ class ProductVariant extends \yii\db\ActiveRecord | ||
77 | return $this->hasOne(Product::className(), ['product_id' => 'product_id']); | 78 | return $this->hasOne(Product::className(), ['product_id' => 'product_id']); |
78 | } | 79 | } |
79 | 80 | ||
81 | + public function getEnabled() { | ||
82 | + return $this->stock !== 0; | ||
83 | + } | ||
84 | + | ||
85 | + public function getStock_caption() { | ||
86 | + return is_null($this->stock) ? '∞' : intval($this->stock); | ||
87 | + } | ||
88 | + | ||
80 | /** | 89 | /** |
81 | * @inheritdoc | 90 | * @inheritdoc |
82 | * @return ProductVariantQuery the active query used by this AR class. | 91 | * @return ProductVariantQuery the active query used by this AR class. |
common/modules/product/views/manage/_form.php
@@ -22,7 +22,7 @@ use kartik\select2\Select2; | @@ -22,7 +22,7 @@ use kartik\select2\Select2; | ||
22 | <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> | 22 | <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> |
23 | 23 | ||
24 | <?= $form->field($model, 'description')->widget(\mihaildev\ckeditor\CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?> | 24 | <?= $form->field($model, 'description')->widget(\mihaildev\ckeditor\CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?> |
25 | - <?= $form->field($model, 'video')->textarea()->label('Video embeded'); ?> | 25 | + <?= $form->field($model, 'video')->textarea(); ?> |
26 | 26 | ||
27 | <?= $form->field($model, 'brand_id')->dropDownList( | 27 | <?= $form->field($model, 'brand_id')->dropDownList( |
28 | ArrayHelper::map(ProductHelper::getBrands()->all(), 'brand_id', 'name'), | 28 | ArrayHelper::map(ProductHelper::getBrands()->all(), 'brand_id', 'name'), |
@@ -35,7 +35,7 @@ use kartik\select2\Select2; | @@ -35,7 +35,7 @@ use kartik\select2\Select2; | ||
35 | 'data' => ArtboxTreeHelper::treeMap(ProductHelper::getCategories(), 'category_id', 'name'), | 35 | 'data' => ArtboxTreeHelper::treeMap(ProductHelper::getCategories(), 'category_id', 'name'), |
36 | 'language' => 'ru', | 36 | 'language' => 'ru', |
37 | 'options' => [ | 37 | 'options' => [ |
38 | - 'placeholder' => 'Select a state ...', | 38 | + 'placeholder' => Yii::t('product', 'Select categories'), |
39 | 'multiple' => true, | 39 | 'multiple' => true, |
40 | ], | 40 | ], |
41 | 'pluginOptions' => [ | 41 | 'pluginOptions' => [ |
@@ -62,33 +62,33 @@ use kartik\select2\Select2; | @@ -62,33 +62,33 @@ use kartik\select2\Select2; | ||
62 | [ | 62 | [ |
63 | 'name' => 'name', | 63 | 'name' => 'name', |
64 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, | 64 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, |
65 | - 'title' => 'Name', | 65 | + 'title' => Yii::t('product', 'Name'), |
66 | ], | 66 | ], |
67 | [ | 67 | [ |
68 | 'name' => 'sku', | 68 | 'name' => 'sku', |
69 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, | 69 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, |
70 | - 'title' => 'SKU', | 70 | + 'title' => Yii::t('product', 'SKU'), |
71 | ], | 71 | ], |
72 | [ | 72 | [ |
73 | 'name' => 'price', | 73 | 'name' => 'price', |
74 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, | 74 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, |
75 | - 'title' => 'Price', | 75 | + 'title' => Yii::t('product', 'Price'), |
76 | ], | 76 | ], |
77 | [ | 77 | [ |
78 | 'name' => 'price_old', | 78 | 'name' => 'price_old', |
79 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, | 79 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, |
80 | - 'title' => 'Old Price', | 80 | + 'title' => Yii::t('product', 'Old Price'), |
81 | ], | 81 | ], |
82 | [ | 82 | [ |
83 | 'name' => 'product_unit_id', | 83 | 'name' => 'product_unit_id', |
84 | 'type' => MultipleInputColumn::TYPE_DROPDOWN, | 84 | 'type' => MultipleInputColumn::TYPE_DROPDOWN, |
85 | - 'title' => 'Unit', | 85 | + 'title' => Yii::t('product', 'Unit'), |
86 | 'items' => ArrayHelper::map(\common\modules\product\models\ProductUnit::find()->all(), 'product_unit_id', 'name'), | 86 | 'items' => ArrayHelper::map(\common\modules\product\models\ProductUnit::find()->all(), 'product_unit_id', 'name'), |
87 | ], | 87 | ], |
88 | [ | 88 | [ |
89 | 'name' => 'stock', | 89 | 'name' => 'stock', |
90 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, | 90 | 'type' => MultipleInputColumn::TYPE_TEXT_INPUT, |
91 | - 'title' => 'Stock', | 91 | + 'title' => Yii::t('product', 'Stock'), |
92 | 'options' => [ | 92 | 'options' => [ |
93 | 'placeholder' => '∞' | 93 | 'placeholder' => '∞' |
94 | ], | 94 | ], |
common/modules/product/views/manage/index.php
@@ -22,12 +22,57 @@ $this->params['breadcrumbs'][] = $this->title; | @@ -22,12 +22,57 @@ $this->params['breadcrumbs'][] = $this->title; | ||
22 | 'filterModel' => $searchModel, | 22 | 'filterModel' => $searchModel, |
23 | 'columns' => [ | 23 | 'columns' => [ |
24 | ['class' => 'yii\grid\SerialColumn'], | 24 | ['class' => 'yii\grid\SerialColumn'], |
25 | - 'product_id', | 25 | +// 'product_id', |
26 | 'name', | 26 | 'name', |
27 | - 'brand.name', | ||
28 | - 'category.name', | 27 | + [ |
28 | + 'label' => Yii::t('product', 'Brand'), | ||
29 | + 'attribute' => 'brand_name', | ||
30 | + 'value' => 'brand.name', | ||
31 | + ], | ||
32 | + [ | ||
33 | + 'label' => Yii::t('product', 'Category'), | ||
34 | + 'attribute' => 'category_name', | ||
35 | + 'value' => 'category.name', | ||
36 | + ], | ||
37 | + 'variant.price', | ||
38 | + 'variant.stock_caption', | ||
29 | 39 | ||
30 | - ['class' => 'yii\grid\ActionColumn'], | 40 | + |
41 | + [ | ||
42 | + 'class' => 'yii\grid\ActionColumn', | ||
43 | + 'template' => '{view} {is_top} {is_new} {update} {delete}', | ||
44 | + 'buttons' => [ | ||
45 | + 'is_top' => function ($url, $model) { | ||
46 | + return Html::a('<span class="glyphicon glyphicon-star' . ($model->is_top ? '' : '-empty') . '"></span>', $url, [ | ||
47 | + 'title' => Yii::t('product', ($model->is_top ? 'Set not is top' : 'Set is top')), | ||
48 | + ]); | ||
49 | + }, | ||
50 | + 'is_new' => function ($url, $model) { | ||
51 | + return Html::a('<span class="glyphicon glyphicon-heart' . ($model->is_new ? '' : '-empty') . '"></span>', $url, [ | ||
52 | + 'title' => Yii::t('product', ($model->is_new ? 'Set not is new' : 'Set is new')), | ||
53 | + ]); | ||
54 | + }, | ||
55 | + ], | ||
56 | + 'urlCreator' => function ($action, $model, $key, $index) { | ||
57 | + switch ($action) { | ||
58 | + case 'is_top': | ||
59 | + return \yii\helpers\Url::to(['manage/is_top', 'id' => $model->product_id]); | ||
60 | + break; | ||
61 | + case 'is_new': | ||
62 | + return \yii\helpers\Url::to(['manage/is_new', 'id' => $model->product_id]); | ||
63 | + break; | ||
64 | + case 'view': | ||
65 | + return \yii\helpers\Url::to(['/catalog/product', 'id' => $model->product_id, ['target' => '_blank']]); | ||
66 | + break; | ||
67 | + case 'update': | ||
68 | + return \yii\helpers\Url::to(['manage/update', 'id' => $model->product_id]); | ||
69 | + break; | ||
70 | + case 'delete': | ||
71 | + return \yii\helpers\Url::to(['manage/delete', 'id' => $model->product_id]); | ||
72 | + break; | ||
73 | + } | ||
74 | + } | ||
75 | + ], | ||
31 | ], | 76 | ], |
32 | ]); ?> | 77 | ]); ?> |
33 | </div> | 78 | </div> |
common/modules/product/views/product-unit/_form.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\ActiveForm; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\modules\product\models\ProductUnit */ | ||
8 | +/* @var $form yii\widgets\ActiveForm */ | ||
9 | +?> | ||
10 | + | ||
11 | +<div class="product-unit-form"> | ||
12 | + | ||
13 | + <?php $form = ActiveForm::begin(); ?> | ||
14 | + | ||
15 | + <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> | ||
16 | + | ||
17 | + <?= $form->field($model, 'code')->textInput(['maxlength' => true]) ?> | ||
18 | + | ||
19 | + <?= $form->field($model, 'is_default')->checkbox() ?> | ||
20 | + | ||
21 | + <div class="form-group"> | ||
22 | + <?= Html::submitButton($model->isNewRecord ? Yii::t('product', 'Create') : Yii::t('product', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> | ||
23 | + </div> | ||
24 | + | ||
25 | + <?php ActiveForm::end(); ?> | ||
26 | + | ||
27 | +</div> |
common/modules/product/views/product-unit/_search.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\ActiveForm; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\modules\product\models\ProductUnitSearch */ | ||
8 | +/* @var $form yii\widgets\ActiveForm */ | ||
9 | +?> | ||
10 | + | ||
11 | +<div class="product-unit-search"> | ||
12 | + | ||
13 | + <?php $form = ActiveForm::begin([ | ||
14 | + 'action' => ['index'], | ||
15 | + 'method' => 'get', | ||
16 | + ]); ?> | ||
17 | + | ||
18 | + <?= $form->field($model, 'product_unit_id') ?> | ||
19 | + | ||
20 | + <?= $form->field($model, 'name') ?> | ||
21 | + | ||
22 | + <?= $form->field($model, 'code') ?> | ||
23 | + | ||
24 | + <?= $form->field($model, 'is_default')->checkbox() ?> | ||
25 | + | ||
26 | + <div class="form-group"> | ||
27 | + <?= Html::submitButton(Yii::t('product', 'Search'), ['class' => 'btn btn-primary']) ?> | ||
28 | + <?= Html::resetButton(Yii::t('product', 'Reset'), ['class' => 'btn btn-default']) ?> | ||
29 | + </div> | ||
30 | + | ||
31 | + <?php ActiveForm::end(); ?> | ||
32 | + | ||
33 | +</div> |
common/modules/product/views/product-unit/create.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | + | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\modules\product\models\ProductUnit */ | ||
8 | + | ||
9 | +$this->title = Yii::t('product', 'Create Product Unit'); | ||
10 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('product', 'Product Units'), 'url' => ['index']]; | ||
11 | +$this->params['breadcrumbs'][] = $this->title; | ||
12 | +?> | ||
13 | +<div class="product-unit-create"> | ||
14 | + | ||
15 | + <h1><?= Html::encode($this->title) ?></h1> | ||
16 | + | ||
17 | + <?= $this->render('_form', [ | ||
18 | + 'model' => $model, | ||
19 | + ]) ?> | ||
20 | + | ||
21 | +</div> |
common/modules/product/views/product-unit/index.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\grid\GridView; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $searchModel common\modules\product\models\ProductUnitSearch */ | ||
8 | +/* @var $dataProvider yii\data\ActiveDataProvider */ | ||
9 | + | ||
10 | +$this->title = Yii::t('product', 'Product Units'); | ||
11 | +$this->params['breadcrumbs'][] = $this->title; | ||
12 | +?> | ||
13 | +<div class="product-unit-index"> | ||
14 | + | ||
15 | + <h1><?= Html::encode($this->title) ?></h1> | ||
16 | + <?php // echo $this->render('_search', ['model' => $searchModel]); ?> | ||
17 | + | ||
18 | + <p> | ||
19 | + <?= Html::a(Yii::t('product', 'Create Product Unit'), ['create'], ['class' => 'btn btn-success']) ?> | ||
20 | + </p> | ||
21 | + <?= GridView::widget([ | ||
22 | + 'dataProvider' => $dataProvider, | ||
23 | + 'filterModel' => $searchModel, | ||
24 | + 'columns' => [ | ||
25 | + ['class' => 'yii\grid\SerialColumn'], | ||
26 | + | ||
27 | + 'name', | ||
28 | + 'code:html', | ||
29 | + 'is_default:boolean', | ||
30 | + | ||
31 | + ['class' => 'yii\grid\ActionColumn'], | ||
32 | + ], | ||
33 | + ]); ?> | ||
34 | +</div> |
common/modules/product/views/product-unit/update.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | + | ||
5 | +/* @var $this yii\web\View */ | ||
6 | +/* @var $model common\modules\product\models\ProductUnit */ | ||
7 | + | ||
8 | +$this->title = Yii::t('product', 'Update {modelClass}: ', [ | ||
9 | + 'modelClass' => 'Product Unit', | ||
10 | +]) . $model->name; | ||
11 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('product', 'Product Units'), 'url' => ['index']]; | ||
12 | +$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->product_unit_id]]; | ||
13 | +$this->params['breadcrumbs'][] = Yii::t('product', 'Update'); | ||
14 | +?> | ||
15 | +<div class="product-unit-update"> | ||
16 | + | ||
17 | + <h1><?= Html::encode($this->title) ?></h1> | ||
18 | + | ||
19 | + <?= $this->render('_form', [ | ||
20 | + 'model' => $model, | ||
21 | + ]) ?> | ||
22 | + | ||
23 | +</div> |
1 | +<?php | ||
2 | + | ||
3 | +use yii\helpers\Html; | ||
4 | +use yii\widgets\DetailView; | ||
5 | + | ||
6 | +/* @var $this yii\web\View */ | ||
7 | +/* @var $model common\modules\product\models\ProductUnit */ | ||
8 | + | ||
9 | +$this->title = $model->name; | ||
10 | +$this->params['breadcrumbs'][] = ['label' => Yii::t('product', 'Product Units'), 'url' => ['index']]; | ||
11 | +$this->params['breadcrumbs'][] = $this->title; | ||
12 | +?> | ||
13 | +<div class="product-unit-view"> | ||
14 | + | ||
15 | + <h1><?= Html::encode($this->title) ?></h1> | ||
16 | + | ||
17 | + <p> | ||
18 | + <?= Html::a(Yii::t('product', 'Update'), ['update', 'id' => $model->product_unit_id], ['class' => 'btn btn-primary']) ?> | ||
19 | + <?= Html::a(Yii::t('product', 'Delete'), ['delete', 'id' => $model->product_unit_id], [ | ||
20 | + 'class' => 'btn btn-danger', | ||
21 | + 'data' => [ | ||
22 | + 'confirm' => Yii::t('product', 'Are you sure you want to delete this item?'), | ||
23 | + 'method' => 'post', | ||
24 | + ], | ||
25 | + ]) ?> | ||
26 | + </p> | ||
27 | + | ||
28 | + <?= DetailView::widget([ | ||
29 | + 'model' => $model, | ||
30 | + 'attributes' => [ | ||
31 | + 'product_unit_id', | ||
32 | + 'name', | ||
33 | + 'code', | ||
34 | + 'is_default:boolean', | ||
35 | + ], | ||
36 | + ]) ?> | ||
37 | + | ||
38 | +</div> |
common/modules/product/widgets/views/brandsCarousel.php
@@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
3 | <div class="prods_carousel"> | 3 | <div class="prods_carousel"> |
4 | <ul> | 4 | <ul> |
5 | <?php foreach($brands as $brand) :?> | 5 | <?php foreach($brands as $brand) :?> |
6 | - <li><span><a href="<?= \yii\helpers\Url::to('/brands/'. $brand->alias)?>" title="<?= $brand->name?>"><img src="<?= $brand->image?>"></a></span></li> | 6 | + <li><span><a href="<?= \yii\helpers\Url::to('/brands/'. $brand->alias)?>" title="<?= $brand->name?>"><img src="<?= $brand->imageUrl?>"></a></span></li> |
7 | <?php endforeach?> | 7 | <?php endforeach?> |
8 | </ul> | 8 | </ul> |
9 | </div> | 9 | </div> |
common/modules/product/widgets/views/submenu.php
@@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
12 | <?php if (empty($_item->image)) :?> | 12 | <?php if (empty($_item->image)) :?> |
13 | <img valign="top" src="/images/no_photo.png"> | 13 | <img valign="top" src="/images/no_photo.png"> |
14 | <?php else :?> | 14 | <?php else :?> |
15 | - <img valign="top" src="<?= $_item->image?>"> | 15 | + <img valign="top" src="<?= $_item->imageUrl?>"> |
16 | <?php endif?> | 16 | <?php endif?> |
17 | </div> | 17 | </div> |
18 | <div class="title"><?= $_item->categoryName->value?></div> | 18 | <div class="title"><?= $_item->categoryName->value?></div> |
@@ -34,7 +34,7 @@ | @@ -34,7 +34,7 @@ | ||
34 | <?php if (empty($_item['item']->image)) :?> | 34 | <?php if (empty($_item['item']->image)) :?> |
35 | <img valign="top" src="/images/no_photo.png"> | 35 | <img valign="top" src="/images/no_photo.png"> |
36 | <?php else :?> | 36 | <?php else :?> |
37 | - <img valign="top" src="<?= $_item['item']->image?>" alt="<?= $_item['item']->categoryName->value?>"> | 37 | + <img valign="top" src="<?= $_item['item']->imageUrl?>" alt="<?= $_item['item']->categoryName->value?>"> |
38 | <?php endif?> | 38 | <?php endif?> |
39 | </div> | 39 | </div> |
40 | <div class="title"><?= $_item['item']->categoryName->value?></div> | 40 | <div class="title"><?= $_item['item']->categoryName->value?></div> |
common/translation/ru/product.php
1 | <?php | 1 | <?php |
2 | return [ | 2 | return [ |
3 | + 'Create' => 'Создать', | ||
4 | + 'Create and continue' => 'Создать и продолжить', | ||
5 | + 'Update' => 'Изменить', | ||
6 | + 'Delete' => 'Удалить', | ||
7 | + 'Is Default' => 'По-умолчанию', | ||
8 | + 'Name' => 'Наименование', | ||
9 | + 'Code' => 'Код', | ||
10 | + 'Description' => 'Описание', | ||
11 | + 'Video embeded' => 'Встраиваемое видео', | ||
12 | + 'Category' => 'Категория', | ||
3 | 'Categories' => 'Категории', | 13 | 'Categories' => 'Категории', |
14 | + 'Select categories' => 'Выберите категории', | ||
4 | 'Create Category' => 'Создать Категорию', | 15 | 'Create Category' => 'Создать Категорию', |
5 | - 'Name' => 'Наименование', | 16 | + 'Product' => 'Товар', |
17 | + 'Products' => 'Товары', | ||
18 | + 'Variants' => 'Варианты', | ||
19 | + 'Variant' => 'Вариант', | ||
20 | + 'Sku' => 'Артикул', | ||
21 | + 'SKU' => 'Артикул', | ||
22 | + 'Unit' => 'Ед.измерения', | ||
23 | + 'Stock' => 'Остаток', | ||
24 | + 'Is top' => 'ТОП', | ||
25 | + 'Is new' => 'Новинка', | ||
26 | + 'Create Product' => 'Создать Товар', | ||
27 | + 'Price' => 'Цена', | ||
28 | + 'Old price' => 'Старая цена', | ||
6 | 'Set populary' => 'Сделать популярной', | 29 | 'Set populary' => 'Сделать популярной', |
7 | 'Set not populary' => 'Сделать не популярной', | 30 | 'Set not populary' => 'Сделать не популярной', |
8 | 'Remote ID' => 'ID в 1С', | 31 | 'Remote ID' => 'ID в 1С', |
9 | 'Search for "{keywords}"' => 'Поиск по "{keywords}"', | 32 | 'Search for "{keywords}"' => 'Поиск по "{keywords}"', |
10 | 'Search for "{keywords}" in category "{category}"' => 'Поиск по "{keywords}" в категории "{category}"', | 33 | 'Search for "{keywords}" in category "{category}"' => 'Поиск по "{keywords}" в категории "{category}"', |
34 | + 'Name of the brand' => 'Имя бренда', | ||
35 | + 'Brand' => 'Бренд', | ||
36 | + 'Brands' => 'Бренды', | ||
37 | + 'Select brand' => 'Выберите бренд', | ||
38 | + 'Create Brand' => 'Создать бренд', | ||
39 | + 'Category Name' => 'Имя категории', | ||
40 | + 'Alias' => 'Псевдоним', | ||
41 | + 'Product Units' => 'Единицы измерения', | ||
42 | + 'Product Unit' => 'Единица измерения', | ||
43 | + 'Image' => 'Изображение', | ||
11 | ]; | 44 | ]; |
12 | \ No newline at end of file | 45 | \ No newline at end of file |