Commit 1f1f49552705969d385981a1a5ec0e1490f49fd1

Authored by Yarik
1 parent b789cb1a

Synonym

backend/views/category/_form.php
@@ -20,8 +20,10 @@ use kartik\select2\Select2; @@ -20,8 +20,10 @@ use kartik\select2\Select2;
20 ]); ?> 20 ]); ?>
21 21
22 <?= $form->field($model, 'name')->textInput() ?> 22 <?= $form->field($model, 'name')->textInput() ?>
23 - 23 +
24 <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> 24 <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?>
  25 +
  26 + <?= $form->field($model, 'synonym')->textInput(['maxlength' => true]) ?>
25 27
26 <?= $form->field($model, 'parent_id')->dropDownList($categories, [ 28 <?= $form->field($model, 'parent_id')->dropDownList($categories, [
27 'prompt' => Yii::t('rubrication', 'Root category'), 29 'prompt' => Yii::t('rubrication', 'Root category'),
common/modules/product/models/Category.php
@@ -29,6 +29,7 @@ use yii\db\Query; @@ -29,6 +29,7 @@ use yii\db\Query;
29 * @property integer $product_unit_id 29 * @property integer $product_unit_id
30 * @property string $alias 30 * @property string $alias
31 * @property boolean $populary 31 * @property boolean $populary
  32 + * @property string $synonym
32 * 33 *
33 * @property CategoryName $categoryName 34 * @property CategoryName $categoryName
34 * @property Product[] $products 35 * @property Product[] $products
@@ -89,7 +90,7 @@ class Category extends \yii\db\ActiveRecord @@ -89,7 +90,7 @@ class Category extends \yii\db\ActiveRecord
89 [['name'], 'string'], 90 [['name'], 'string'],
90 [['parent_id', 'depth', 'category_name_id', 'product_unit_id'], 'integer'], 91 [['parent_id', 'depth', 'category_name_id', 'product_unit_id'], 'integer'],
91 [['path', 'meta_desc', 'h1', 'seo_text'], 'string'], 92 [['path', 'meta_desc', 'h1', 'seo_text'], 'string'],
92 - [['meta_title', 'image'], 'string', 'max' => 255], 93 + [['meta_title', 'image', 'synonym'], 'string', 'max' => 255],
93 [['meta_robots'], 'string', 'max' => 50], 94 [['meta_robots'], 'string', 'max' => 50],
94 [['alias', 'name'], 'string', 'max' => 250], 95 [['alias', 'name'], 'string', 'max' => 250],
95 [['populary'], 'boolean'], 96 [['populary'], 'boolean'],
@@ -122,6 +123,7 @@ class Category extends \yii\db\ActiveRecord @@ -122,6 +123,7 @@ class Category extends \yii\db\ActiveRecord
122 'populary' => Yii::t('product', 'Populary'), 123 'populary' => Yii::t('product', 'Populary'),
123 'name' => Yii::t('product', 'Name'), 124 'name' => Yii::t('product', 'Name'),
124 'remote_id' => Yii::t('product', 'Remote ID'), 125 'remote_id' => Yii::t('product', 'Remote ID'),
  126 + 'synonym' => Yii::t('product', 'Синоним'),
125 ]; 127 ];
126 } 128 }
127 129
common/modules/product/models/Product.php
1 <?php 1 <?php
2 -  
3 -namespace common\modules\product\models;  
4 -  
5 -use common\behaviors\Slug;  
6 -use common\models\Event;  
7 -use common\models\ProductToRating;  
8 -use common\models\Share;  
9 -use common\modules\comment\models\CommentModel;  
10 -use common\modules\product\behaviors\FilterBehavior;  
11 -use common\modules\rubrication\models\TaxGroup;  
12 -use common\modules\rubrication\models\TaxOption;  
13 -use Yii;  
14 -use common\modules\relation\relationBehavior;  
15 -use yii\db\ActiveQuery;  
16 -use yii\db\ActiveRecord;  
17 -use yii\helpers\ArrayHelper;  
18 -  
19 -/**  
20 - * This is the model class for table "{{%product}}".  
21 - *  
22 - * @property string $name  
23 - * @property integer $brand_id  
24 - * @property integer $product_id  
25 - * @property Category $category  
26 - * @property array $categories  
27 - * @property array of ProductVariant $variants  
28 - * @property ProductVariant $variant  
29 - * @property ProductImage $image  
30 - * @property array $images  
31 - * @property boolean $is_top  
32 - * @property boolean $is_new  
33 - * @property boolean $akciya  
34 - * @property ProductToRating $averageRating  
35 - * @property array $properties  
36 - * @property ProductVariant $enabledVariant  
37 - * @property array $enabledVariants  
38 - */  
39 -class Product extends \yii\db\ActiveRecord  
40 -{  
41 - /** @var array $_variants */  
42 - public $_variants = [];  
43 -  
44 - /** @var array $_images */  
45 - public $imagesUpload = [];  
46 -  
47 - /**  
48 - * @inheritdoc  
49 - */  
50 - public function behaviors()  
51 - {  
52 - return [  
53 - [  
54 - 'class' => relationBehavior::className(),  
55 - 'relations' => [  
56 - 'product_categories' => 'entity1', // Product category  
57 - 'product_option' => 'entity1' // Product category  
58 - ]  
59 - ],  
60 - [  
61 - 'class' =>FilterBehavior::className(),  
62 - ],  
63 - [  
64 - 'class' => Slug::className(),  
65 - 'in_attribute' => 'name',  
66 - 'out_attribute' => 'alias',  
67 - 'translit' => true  
68 - ]  
69 - ];  
70 - }  
71 -  
72 - /**  
73 - * @inheritdoc  
74 - */  
75 - public static function tableName()  
76 - {  
77 - return '{{%product}}';  
78 - }  
79 -  
80 - /**  
81 - * @inheritdoc  
82 - */  
83 - public function rules()  
84 - {  
85 - return [  
86 -// [['categories'], 'required'],  
87 - [['brand_id'], 'integer'],  
88 - [['name'], 'string', 'max' => 150],  
89 - [['alias'], 'string', 'max' => 250],  
90 - [['categories', 'variants', 'options', 'imagesUpload'], 'safe'],  
91 -// [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif', 'maxFiles' => 50],  
92 - [['description', 'video'], 'safe'],  
93 - [['is_top', 'is_new', 'akciya'], 'boolean'],  
94 -// [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']],  
95 - ];  
96 - }  
97 -  
98 - /**  
99 - * @inheritdoc  
100 - */  
101 - public function attributeLabels()  
102 - {  
103 - return [  
104 - 'product_id' => Yii::t('product', 'ID'),  
105 - 'name' => Yii::t('product', 'Name'),  
106 - 'brand_id' => Yii::t('product', 'Brand'),  
107 - 'categories' => Yii::t('product', 'Categories'), // relation behavior field  
108 - 'category' => Yii::t('product', 'Category'), // relation behavior field  
109 - 'image' => Yii::t('product', 'Image'),  
110 - 'images' => Yii::t('product', 'Images'),  
111 - 'description' => Yii::t('product', 'Description'),  
112 - 'video' => Yii::t('product', 'Video embeded'),  
113 - 'variants' => Yii::t('product', 'Variants'),  
114 - 'is_top' => Yii::t('product', 'Is top'),  
115 - 'is_new' => Yii::t('product', 'Is new'),  
116 - 'akciya' => Yii::t('product', 'Is promo'),  
117 - ];  
118 - }  
119 -  
120 -  
121 - public function withEventBanner(){  
122 -  
123 - }  
124 -  
125 -  
126 -  
127 - public function getEvents(){  
128 - return $this->hasMany(Event::className(), ['event_id' => 'event_id'])->viaTable('events_to_products', ['product_id' => 'product_id']);  
129 - }  
130 -  
131 - public function getUrl() {  
132 - return '/product/'. $this->alias;  
133 - }  
134 -  
135 - /**  
136 - * @return \yii\db\ActiveQuery  
137 - */  
138 - public function getBrand()  
139 - {  
140 - return $this->hasOne(Brand::className(), ['brand_id' => 'brand_id']);  
141 - }  
142 -  
143 - /**  
144 - * @return \yii\db\ActiveQuery  
145 - */  
146 - public function getImage()  
147 - {  
148 - return $this->hasOne(ProductImage::className(), ['product_id' => 'product_id']);  
149 - }  
150 -  
151 - /**  
152 - * fetch stored image url  
153 - * @return string  
154 - */  
155 - public function getImageUrl()  
156 - {  
157 - $image = empty($this->variant) ? null : $this->variant->image;  
158 - return !empty($image) ? $image->imageUrl : '/images/no_photo.png';  
159 - }  
160 -  
161 - /**  
162 - * @return \yii\db\ActiveQuery  
163 - */  
164 - public function getImages()  
165 - {  
166 - return $this->hasMany(ProductImage::className(), ['product_id' => 'product_id'])->where(['product_variant_id' => null]);  
167 - }  
168 -  
169 - /**  
170 - * @return \yii\db\ActiveQuery  
171 - */  
172 - public function getVariant()  
173 - {  
174 - return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id']);  
175 - }  
176 -  
177 - /**  
178 - * @return \yii\db\ActiveQuery  
179 - */  
180 - public function getEnabledVariant()  
181 - {  
182 - return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]);  
183 - }  
184 -  
185 - public function getVariantPrice() {  
186 - return $this->variant->price;  
187 - }  
188 -  
189 - public function getEnabledVariantPrice() {  
190 - return $this->enabledVariants[0]->price;  
191 - }  
192 - 2 +
  3 + namespace common\modules\product\models;
  4 +
  5 + use common\behaviors\Slug;
  6 + use common\models\Event;
  7 + use common\models\ProductToRating;
  8 + use common\models\Share;
  9 + use common\modules\comment\models\CommentModel;
  10 + use common\modules\product\behaviors\FilterBehavior;
  11 + use common\modules\rubrication\models\TaxGroup;
  12 + use common\modules\rubrication\models\TaxOption;
  13 + use Yii;
  14 + use common\modules\relation\relationBehavior;
  15 + use yii\db\ActiveQuery;
  16 + use yii\db\ActiveRecord;
  17 + use yii\helpers\ArrayHelper;
  18 +
193 /** 19 /**
194 - * @return \yii\db\ActiveQuery 20 + * This is the model class for table "{{%product}}".
  21 + *
  22 + * @property string $name
  23 + * @property integer $brand_id
  24 + * @property integer $product_id
  25 + * @property Category $category
  26 + * @property array $categories
  27 + * @property array of ProductVariant $variants
  28 + * @property ProductVariant $variant
  29 + * @property ProductImage $image
  30 + * @property array $images
  31 + * @property boolean $is_top
  32 + * @property boolean $is_new
  33 + * @property boolean $akciya
  34 + * @property string $fullname
  35 + * @property ProductToRating $averageRating
  36 + * @property array $properties
  37 + * @property ProductVariant $enabledVariant
  38 + * @property array $enabledVariants
195 */ 39 */
196 - public function getVariants()  
197 - {  
198 - return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id']);  
199 - }  
200 -  
201 - public function getEnabledVariants() 40 + class Product extends \yii\db\ActiveRecord
202 { 41 {
203 - return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0])->joinWith('image');  
204 - }  
205 -  
206 - /*  
207 - * Get variants grouped by type  
208 - */  
209 - public function getEnabledVariantsGrouped()  
210 - {  
211 - $variants = [];  
212 - foreach ($this->enabledVariants as $variant) {  
213 - $variants[$variant->product_variant_type_id ? $variant->product_variant_type_id : 1][] = $variant; 42 + /** @var array $_variants */
  43 + public $_variants = [];
  44 +
  45 + /** @var array $_images */
  46 + public $imagesUpload = [];
  47 +
  48 + /**
  49 + * @inheritdoc
  50 + */
  51 + public function behaviors()
  52 + {
  53 + return [
  54 + [
  55 + 'class' => relationBehavior::className(),
  56 + 'relations' => [
  57 + 'product_categories' => 'entity1',
  58 + // Product category
  59 + 'product_option' => 'entity1'
  60 + // Product category
  61 + ],
  62 + ],
  63 + [
  64 + 'class' => FilterBehavior::className(),
  65 + ],
  66 + [
  67 + 'class' => Slug::className(),
  68 + 'in_attribute' => 'name',
  69 + 'out_attribute' => 'alias',
  70 + 'translit' => true,
  71 + ],
  72 + ];
214 } 73 }
215 - if (empty($variants)) {  
216 - return []; 74 +
  75 + /**
  76 + * @inheritdoc
  77 + */
  78 + public static function tableName()
  79 + {
  80 + return '{{%product}}';
217 } 81 }
218 - $ids = array_keys($variants);  
219 - $variants_type = [];  
220 - foreach(ProductVariantType::find()->select(['product_variant_type_id', 'name2'])->where(['product_variant_type_id' => $ids])->all() as $variant_type) {  
221 - $variant_type->_variants = $variants[$variant_type->product_variant_type_id];  
222 - $variants_type[] = $variant_type; 82 +
  83 + /**
  84 + * @inheritdoc
  85 + */
  86 + public function rules()
  87 + {
  88 + return [
  89 + // [['categories'], 'required'],
  90 + [
  91 + [ 'brand_id' ],
  92 + 'integer',
  93 + ],
  94 + [
  95 + [ 'name' ],
  96 + 'string',
  97 + 'max' => 150,
  98 + ],
  99 + [
  100 + [ 'alias' ],
  101 + 'string',
  102 + 'max' => 250,
  103 + ],
  104 + [
  105 + [
  106 + 'categories',
  107 + 'variants',
  108 + 'options',
  109 + 'imagesUpload',
  110 + ],
  111 + 'safe',
  112 + ],
  113 + // [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif', 'maxFiles' => 50],
  114 + [
  115 + [
  116 + 'description',
  117 + 'video',
  118 + ],
  119 + 'safe',
  120 + ],
  121 + [
  122 + [
  123 + 'is_top',
  124 + 'is_new',
  125 + 'akciya',
  126 + ],
  127 + 'boolean',
  128 + ],
  129 + // [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']],
  130 + ];
223 } 131 }
224 - return $variants_type;  
225 - }  
226 -  
227 - public function setVariants($variants) {  
228 - $this->_variants = $variants;  
229 - }  
230 -  
231 - public function getFullName()  
232 - {  
233 - $words = [  
234 - 'Рюкзаки' => 'Рюкзак',  
235 - 'Несессеры' => 'Несессер',  
236 - 'Сумки' => 'Сумка',  
237 - 'Чехлы' => 'Чехол',  
238 - 'Кошельки' => 'Кошелек',  
239 - 'Гермочехлы' => 'Гермочехол',  
240 - ];  
241 - return empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;  
242 - }  
243 -  
244 - public function getFullNameWithCategory()  
245 - {  
246 - $words = [  
247 - 'Рюкзаки' => 'Рюкзак',  
248 - 'Несессеры' => 'Несессер',  
249 - 'Сумки' => 'Сумка',  
250 - 'Чехлы' => 'Чехол',  
251 - 'Кошельки' => 'Кошелек',  
252 - 'Гермочехлы' => 'Гермочехол',  
253 - ];  
254 - $name = empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;  
255 - return empty($this->category->categoryName->value) ? $name : (isset($words[$this->category->categoryName->value])? $words[$this->category->categoryName->value]: '') .' '. $name;  
256 - }  
257 -  
258 -  
259 - public function getCategories() {  
260 - return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);  
261 -// return $this->getRelations('product_categories');  
262 - }  
263 - public function getCategoriesWithName() {  
264 - return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id'])->joinWith('categoryNames');  
265 -// return $this->getRelations('product_categories');  
266 - }  
267 -  
268 - public function getCategoriesNames() {  
269 - $result = [];  
270 - foreach($this->categories as $category) {  
271 - $result[] = $category->name; 132 +
  133 + /**
  134 + * @inheritdoc
  135 + */
  136 + public function attributeLabels()
  137 + {
  138 + return [
  139 + 'product_id' => Yii::t('product', 'ID'),
  140 + 'name' => Yii::t('product', 'Name'),
  141 + 'brand_id' => Yii::t('product', 'Brand'),
  142 + 'categories' => Yii::t('product', 'Categories'),
  143 + // relation behavior field
  144 + 'category' => Yii::t('product', 'Category'),
  145 + // relation behavior field
  146 + 'image' => Yii::t('product', 'Image'),
  147 + 'images' => Yii::t('product', 'Images'),
  148 + 'description' => Yii::t('product', 'Description'),
  149 + 'video' => Yii::t('product', 'Video embeded'),
  150 + 'variants' => Yii::t('product', 'Variants'),
  151 + 'is_top' => Yii::t('product', 'Is top'),
  152 + 'is_new' => Yii::t('product', 'Is new'),
  153 + 'akciya' => Yii::t('product', 'Is promo'),
  154 + ];
272 } 155 }
273 - return $result;  
274 - }  
275 -  
276 - public function getVariantsWithFilters(){  
277 - return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->with('filters');  
278 - }  
279 -  
280 - /**  
281 - * @return ActiveQuery  
282 - */  
283 - public function getCategory() {  
284 - return $this->hasOne(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);  
285 - }  
286 -  
287 - public function getOptions() {  
288 - return $this->hasMany(TaxOption::className(), ['tax_option_id' => 'option_id'])->viaTable('product_option', ['product_id' => 'product_id']);  
289 - }  
290 -  
291 - public function getProperties() {  
292 - $groups = $options = [];  
293 - foreach ($this->options as $option) {  
294 - $options[$option->tax_group_id][] = $option;  
295 - }  
296 - foreach (TaxGroup::find()->where(['tax_group_id' => array_keys($options)])->all() as $group) {  
297 - if (!empty($options[$group->tax_group_id])) {  
298 - $group->_options = $options[$group->tax_group_id];  
299 - $groups[] = $group;  
300 - } 156 +
  157 + public function withEventBanner()
  158 + {
  159 +
301 } 160 }
302 - return $groups;  
303 - }  
304 -  
305 - public function getActiveProperties($category_id) {  
306 - $groups = $options = [];  
307 - foreach ($this->options as $option) {  
308 - $options[$option->tax_group_id][] = $option;  
309 - }  
310 - foreach (TaxGroup::find()->joinWith('categories')->where(['tax_group.tax_group_id' => array_keys($options), 'tax_group.display' => TRUE, 'category.category_id' => $category_id])->all() as $group) {  
311 - if (!empty($options[$group->tax_group_id])) {  
312 - $group->_options = $options[$group->tax_group_id];  
313 - $groups[] = $group;  
314 - } 161 +
  162 + public function getEvents()
  163 + {
  164 + return $this->hasMany(Event::className(), [ 'event_id' => 'event_id' ])
  165 + ->viaTable('events_to_products', [ 'product_id' => 'product_id' ]);
315 } 166 }
316 - return $groups;  
317 - }  
318 -  
319 - public function getStocks() {  
320 - return $this->hasMany(Stock::className(), ['stock_id' => 'stock_id'])->viaTable(ProductStock::tableName(), ['product_id' => 'product_id']);  
321 - }  
322 -  
323 - /**  
324 - * @inheritdoc  
325 - * @return ProductQuery the active query used by this AR class.  
326 - */  
327 - public static function find()  
328 - {  
329 - return new ProductQuery(get_called_class());  
330 - }  
331 -  
332 - public function getQuantity() {  
333 - return ProductStock::find()  
334 - ->where(['product_id' => $this->product_id])  
335 - ->sum('quantity');  
336 - }  
337 -  
338 - public function afterSave($insert, $changedAttributes)  
339 - {  
340 - parent::afterSave($insert, $changedAttributes);  
341 -  
342 -// $images = UploadedFile::getInstance($this, 'imagesUpload');  
343 -// var_dump($images);exit;  
344 -  
345 -// if (!empty($this->imagesUpload)) {  
346 -// if (!is_array($this->imagesUpload)) {  
347 -// $this->imagesUpload = [$this->imagesUpload];  
348 -// }  
349 -// foreach($this->imagesUpload as $image) {  
350 -// $image->saveAs((Yii::getAlias('@frontend/web/storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));  
351 -// }  
352 -//  
353 -//  
354 -// }  
355 -  
356 - if (!empty($this->_variants)) {  
357 - $todel = [];  
358 - foreach ($this->variants ?: [] as $_variant) {  
359 - $todel[$_variant->product_variant_id] = $_variant->product_variant_id; 167 +
  168 + public function getUrl()
  169 + {
  170 + return '/product/' . $this->alias;
  171 + }
  172 +
  173 + /**
  174 + * @return \yii\db\ActiveQuery
  175 + */
  176 + public function getBrand()
  177 + {
  178 + return $this->hasOne(Brand::className(), [ 'brand_id' => 'brand_id' ]);
  179 + }
  180 +
  181 + /**
  182 + * @return \yii\db\ActiveQuery
  183 + */
  184 + public function getImage()
  185 + {
  186 + return $this->hasOne(ProductImage::className(), [ 'product_id' => 'product_id' ]);
  187 + }
  188 +
  189 + /**
  190 + * fetch stored image url
  191 + *
  192 + * @return string
  193 + */
  194 + public function getImageUrl()
  195 + {
  196 + $image = empty( $this->variant ) ? null : $this->variant->image;
  197 + return !empty( $image ) ? $image->imageUrl : '/images/no_photo.png';
  198 + }
  199 +
  200 + /**
  201 + * @return \yii\db\ActiveQuery
  202 + */
  203 + public function getImages()
  204 + {
  205 + return $this->hasMany(ProductImage::className(), [ 'product_id' => 'product_id' ])
  206 + ->where([ 'product_variant_id' => null ]);
  207 + }
  208 +
  209 + /**
  210 + * @return \yii\db\ActiveQuery
  211 + */
  212 + public function getVariant()
  213 + {
  214 + return $this->hasOne(ProductVariant::className(), [ 'product_id' => 'product_id' ]);
  215 + }
  216 +
  217 + /**
  218 + * @return \yii\db\ActiveQuery
  219 + */
  220 + public function getEnabledVariant()
  221 + {
  222 + return $this->hasOne(ProductVariant::className(), [ 'product_id' => 'product_id' ])
  223 + ->andOnCondition(
  224 + [
  225 + '!=',
  226 + ProductVariant::tableName() . '.stock',
  227 + 0,
  228 + ]
  229 + );
  230 + }
  231 +
  232 + public function getVariantPrice()
  233 + {
  234 + return $this->variant->price;
  235 + }
  236 +
  237 + public function getEnabledVariantPrice()
  238 + {
  239 + return $this->enabledVariants[ 0 ]->price;
  240 + }
  241 +
  242 + /**
  243 + * @return \yii\db\ActiveQuery
  244 + */
  245 + public function getVariants()
  246 + {
  247 + return $this->hasMany(ProductVariant::className(), [ 'product_id' => 'product_id' ]);
  248 + }
  249 +
  250 + public function getEnabledVariants()
  251 + {
  252 + return $this->hasMany(ProductVariant::className(), [ 'product_id' => 'product_id' ])
  253 + ->andOnCondition(
  254 + [
  255 + '!=',
  256 + ProductVariant::tableName() . '.stock',
  257 + 0,
  258 + ]
  259 + )
  260 + ->joinWith('image');
  261 + }
  262 +
  263 + /*
  264 + * Get variants grouped by type
  265 + */
  266 + public function getEnabledVariantsGrouped()
  267 + {
  268 + $variants = [];
  269 + foreach ($this->enabledVariants as $variant) {
  270 + $variants[ $variant->product_variant_type_id ? $variant->product_variant_type_id : 1 ][] = $variant;
  271 + }
  272 + if (empty( $variants )) {
  273 + return [];
  274 + }
  275 + $ids = array_keys($variants);
  276 + $variants_type = [];
  277 + foreach (ProductVariantType::find()
  278 + ->select(
  279 + [
  280 + 'product_variant_type_id',
  281 + 'name2',
  282 + ]
  283 + )
  284 + ->where([ 'product_variant_type_id' => $ids ])
  285 + ->all() as $variant_type) {
  286 + $variant_type->_variants = $variants[ $variant_type->product_variant_type_id ];
  287 + $variants_type[] = $variant_type;
360 } 288 }
361 - foreach ($this->_variants as $_variant) {  
362 - if (!is_array($_variant)) {  
363 - return; 289 + return $variants_type;
  290 + }
  291 +
  292 + public function setVariants($variants)
  293 + {
  294 + $this->_variants = $variants;
  295 + }
  296 +
  297 + public function Name()
  298 + {
  299 + $words = [
  300 + 'Рюкзаки' => 'Рюкзак',
  301 + 'Несессеры' => 'Несессер',
  302 + 'Сумки' => 'Сумка',
  303 + 'Чехлы' => 'Чехол',
  304 + 'Кошельки' => 'Кошелек',
  305 + 'Гермочехлы' => 'Гермочехол',
  306 + ];
  307 + return empty( $this->brand ) ? $this->name : $this->brand->name . ' ' . $this->name;
  308 + }
  309 +
  310 + public function getFullNameWithCategory()
  311 + {
  312 + $words = [
  313 + 'Рюкзаки' => 'Рюкзак',
  314 + 'Несессеры' => 'Несессер',
  315 + 'Сумки' => 'Сумка',
  316 + 'Чехлы' => 'Чехол',
  317 + 'Кошельки' => 'Кошелек',
  318 + 'Гермочехлы' => 'Гермочехол',
  319 + ];
  320 + $name = empty( $this->brand ) ? $this->name : $this->brand->name . ' ' . $this->name;
  321 + return empty( $this->category->categoryName->value ) ? $name : ( isset( $words[ $this->category->categoryName->value ] ) ? $words[ $this->category->categoryName->value ] : '' ) . ' ' . $name;
  322 + }
  323 +
  324 + public function getFullname()
  325 + {
  326 + $name = '';
  327 + $taxOption = TaxOption::find()
  328 + ->innerJoin('tax_group', 'tax_group.tax_group_id = tax_option.tax_group_id')
  329 + ->where(
  330 + [
  331 + 'tax_group.use_in_name' => 1,
  332 + 'tax_option.tax_option_id' => ArrayHelper::getColumn(
  333 + $this->options,
  334 + 'tax_option_id'
  335 + ),
  336 + ]
  337 + )
  338 + ->one();
  339 + if ($taxOption) {
  340 + if (!empty( $taxOption->synonym )) {
  341 + $taxOption = $taxOption->synonym;
  342 + } else {
  343 + $taxOption = $taxOption->value;
364 } 344 }
365 - if (!empty($_variant['product_variant_id'])) {  
366 - unset($todel[$_variant['product_variant_id']]);  
367 - $model = ProductVariant::findOne($_variant['product_variant_id']); 345 + $name .= $taxOption;
  346 + } else {
  347 + if (!empty( $this->category->synonym )) {
  348 + $name .= $this->category->synonym;
368 } else { 349 } else {
369 - $model = new ProductVariant(); 350 + $name .= $this->category->name;
370 } 351 }
371 - $_variant['product_id'] = $this->product_id;  
372 - $model->load(['ProductVariant' => $_variant]);  
373 - $model->product_id = $this->product_id;  
374 - $model->save();  
375 } 352 }
376 - if (!empty($todel)) {  
377 - ProductVariant::deleteAll(['product_variant_id' => $todel]); 353 +
  354 + if (!empty( $this->brand )) {
  355 + $name = $name . ' ' . $this->brand->name;
378 } 356 }
  357 + $name .= ' ' . $this->name;
  358 + return $name;
379 } 359 }
380 - }  
381 -  
382 - public function beforeDelete() {  
383 - ProductImage::deleteAll(['product_id' => $this->product_id]);  
384 - ProductCategory::deleteAll(['product_id' => $this->product_id]);  
385 - ProductVariant::deleteAll(['product_id' => $this->product_id]);  
386 - ProductOption::deleteAll(['product_id' => $this->product_id]);  
387 - //ProductVariantOption::deleteAll(['product_id' => $this->product_id]);  
388 - ProductStock::deleteAll(['product_id' => $this->product_id]);  
389 - Share::deleteAll(['product_id' => $this->product_id]);  
390 - return true;  
391 - }  
392 -  
393 - public function imagesUpload()  
394 - {  
395 - if ($this->validate()) {  
396 - $images = [];  
397 - foreach ($this->imagesUpload as $image) {  
398 - $imageName = $image->baseName .'.'. $image->extension;  
399 - $i = 0;  
400 - while(file_exists(Yii::getAlias('@imagesDir/products/' . $imageName))) {  
401 - $i++;  
402 - $imageName = $image->baseName .'_'. $i .'.'. $image->extension;  
403 - }  
404 -  
405 - $image->saveAs(Yii::getAlias('@imagesDir/products/' .$imageName));  
406 - $images[] = $imageName; 360 +
  361 + public function getCategories()
  362 + {
  363 + return $this->hasMany(Category::className(), [ 'category_id' => 'category_id' ])
  364 + ->viaTable('product_category', [ 'product_id' => 'product_id' ]);
  365 + // return $this->getRelations('product_categories');
  366 + }
  367 + public function getCategoriesWithName()
  368 + {
  369 + return $this->hasMany(Category::className(), [ 'category_id' => 'category_id' ])
  370 + ->viaTable('product_category', [ 'product_id' => 'product_id' ])
  371 + ->joinWith('categoryNames');
  372 + // return $this->getRelations('product_categories');
  373 + }
  374 +
  375 + public function getCategoriesNames()
  376 + {
  377 + $result = [];
  378 + foreach ($this->categories as $category) {
  379 + $result[] = $category->name;
407 } 380 }
408 - return $images;  
409 - } else {  
410 - return false; 381 + return $result;
411 } 382 }
412 - }  
413 -  
414 - public function getImagesHTML() {  
415 - $op = [];  
416 - if ($this->images) {  
417 - foreach ($this->images as $image) {  
418 - $op[] = \common\components\artboximage\ArtboxImageHelper::getImage($image->imageUrl, 'admin_thumb'); 383 +
  384 + public function getVariantsWithFilters()
  385 + {
  386 + return $this->hasMany(ProductVariant::className(), [ 'product_id' => 'product_id' ])
  387 + ->with('filters');
  388 + }
  389 +
  390 + /**
  391 + * @return ActiveQuery
  392 + */
  393 + public function getCategory()
  394 + {
  395 + return $this->hasOne(Category::className(), [ 'category_id' => 'category_id' ])
  396 + ->viaTable('product_category', [ 'product_id' => 'product_id' ]);
  397 + }
  398 +
  399 + public function getOptions()
  400 + {
  401 + return $this->hasMany(TaxOption::className(), [ 'tax_option_id' => 'option_id' ])
  402 + ->viaTable('product_option', [ 'product_id' => 'product_id' ]);
  403 + }
  404 +
  405 + public function getProperties()
  406 + {
  407 + $groups = $options = [];
  408 + foreach ($this->options as $option) {
  409 + $options[ $option->tax_group_id ][] = $option;
  410 + }
  411 + foreach (TaxGroup::find()
  412 + ->where([ 'tax_group_id' => array_keys($options) ])
  413 + ->all() as $group) {
  414 + if (!empty( $options[ $group->tax_group_id ] )) {
  415 + $group->_options = $options[ $group->tax_group_id ];
  416 + $groups[] = $group;
  417 + }
419 } 418 }
  419 + return $groups;
420 } 420 }
421 - return $op;  
422 - }  
423 -  
424 - public function getImagesConfig() {  
425 - $op = [];  
426 - if ($this->images) {  
427 - foreach ($this->images as $image) {  
428 - $op[] = [  
429 - 'caption' => $image->image,  
430 - 'width' => '120px',  
431 - 'url' => \yii\helpers\Url::to(['/product/manage/delimg', 'id' => $image->product_image_id]),  
432 - 'key' => $image->product_image_id,  
433 - 'extra' => [  
434 - 'id' => $image->product_image_id,  
435 - ],  
436 - ]; 421 +
  422 + public function getActiveProperties($category_id)
  423 + {
  424 + $groups = $options = [];
  425 + foreach ($this->options as $option) {
  426 + $options[ $option->tax_group_id ][] = $option;
437 } 427 }
  428 + foreach (TaxGroup::find()
  429 + ->joinWith('categories')
  430 + ->where(
  431 + [
  432 + 'tax_group.tax_group_id' => array_keys($options),
  433 + 'tax_group.display' => true,
  434 + 'category.category_id' => $category_id,
  435 + ]
  436 + )
  437 + ->all() as $group) {
  438 + if (!empty( $options[ $group->tax_group_id ] )) {
  439 + $group->_options = $options[ $group->tax_group_id ];
  440 + $groups[] = $group;
  441 + }
  442 + }
  443 + return $groups;
438 } 444 }
439 - return $op;  
440 - }  
441 -  
442 - public function recalculateRating() { 445 +
  446 + public function getStocks()
  447 + {
  448 + return $this->hasMany(Stock::className(), [ 'stock_id' => 'stock_id' ])
  449 + ->viaTable(ProductStock::tableName(), [ 'product_id' => 'product_id' ]);
  450 + }
  451 +
443 /** 452 /**
444 - * @var ProductToRating $averageRating 453 + * @inheritdoc
  454 + * @return ProductQuery the active query used by this AR class.
445 */ 455 */
446 - $average = $this->getComments()->joinWith('rating')->select(['average' => 'avg(artbox_comment_rating.value)::float'])->scalar();  
447 - if(!$average) {  
448 - $average = 0; 456 + public static function find()
  457 + {
  458 + return new ProductQuery(get_called_class());
449 } 459 }
450 - $averageRating = $this->averageRating;  
451 - if(!empty($averageRating)) {  
452 - $averageRating->value = $average;  
453 - } else {  
454 - $averageRating = new ProductToRating(['product_id' => $this->product_id, 'value' => $average]); 460 +
  461 + public function getQuantity()
  462 + {
  463 + return ProductStock::find()
  464 + ->where([ 'product_id' => $this->product_id ])
  465 + ->sum('quantity');
455 } 466 }
456 - if($averageRating->save()) { 467 +
  468 + public function afterSave($insert, $changedAttributes)
  469 + {
  470 + parent::afterSave($insert, $changedAttributes);
  471 +
  472 + // $images = UploadedFile::getInstance($this, 'imagesUpload');
  473 + // var_dump($images);exit;
  474 +
  475 + // if (!empty($this->imagesUpload)) {
  476 + // if (!is_array($this->imagesUpload)) {
  477 + // $this->imagesUpload = [$this->imagesUpload];
  478 + // }
  479 + // foreach($this->imagesUpload as $image) {
  480 + // $image->saveAs((Yii::getAlias('@frontend/web/storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));
  481 + // }
  482 + //
  483 + //
  484 + // }
  485 +
  486 + if (!empty( $this->_variants )) {
  487 + $todel = [];
  488 + foreach ($this->variants ? : [] as $_variant) {
  489 + $todel[ $_variant->product_variant_id ] = $_variant->product_variant_id;
  490 + }
  491 + foreach ($this->_variants as $_variant) {
  492 + if (!is_array($_variant)) {
  493 + return;
  494 + }
  495 + if (!empty( $_variant[ 'product_variant_id' ] )) {
  496 + unset( $todel[ $_variant[ 'product_variant_id' ] ] );
  497 + $model = ProductVariant::findOne($_variant[ 'product_variant_id' ]);
  498 + } else {
  499 + $model = new ProductVariant();
  500 + }
  501 + $_variant[ 'product_id' ] = $this->product_id;
  502 + $model->load([ 'ProductVariant' => $_variant ]);
  503 + $model->product_id = $this->product_id;
  504 + $model->save();
  505 + }
  506 + if (!empty( $todel )) {
  507 + ProductVariant::deleteAll([ 'product_variant_id' => $todel ]);
  508 + }
  509 + }
  510 + }
  511 +
  512 + public function beforeDelete()
  513 + {
  514 + ProductImage::deleteAll([ 'product_id' => $this->product_id ]);
  515 + ProductCategory::deleteAll([ 'product_id' => $this->product_id ]);
  516 + ProductVariant::deleteAll([ 'product_id' => $this->product_id ]);
  517 + ProductOption::deleteAll([ 'product_id' => $this->product_id ]);
  518 + //ProductVariantOption::deleteAll(['product_id' => $this->product_id]);
  519 + ProductStock::deleteAll([ 'product_id' => $this->product_id ]);
  520 + Share::deleteAll([ 'product_id' => $this->product_id ]);
457 return true; 521 return true;
458 - } else {  
459 - return false; 522 + }
  523 +
  524 + public function imagesUpload()
  525 + {
  526 + if ($this->validate()) {
  527 + $images = [];
  528 + foreach ($this->imagesUpload as $image) {
  529 + $imageName = $image->baseName . '.' . $image->extension;
  530 + $i = 0;
  531 + while (file_exists(Yii::getAlias('@imagesDir/products/' . $imageName))) {
  532 + $i++;
  533 + $imageName = $image->baseName . '_' . $i . '.' . $image->extension;
  534 + }
  535 +
  536 + $image->saveAs(Yii::getAlias('@imagesDir/products/' . $imageName));
  537 + $images[] = $imageName;
  538 + }
  539 + return $images;
  540 + } else {
  541 + return false;
  542 + }
  543 + }
  544 +
  545 + public function getImagesHTML()
  546 + {
  547 + $op = [];
  548 + if ($this->images) {
  549 + foreach ($this->images as $image) {
  550 + $op[] = \common\components\artboximage\ArtboxImageHelper::getImage($image->imageUrl, 'admin_thumb');
  551 + }
  552 + }
  553 + return $op;
  554 + }
  555 +
  556 + public function getImagesConfig()
  557 + {
  558 + $op = [];
  559 + if ($this->images) {
  560 + foreach ($this->images as $image) {
  561 + $op[] = [
  562 + 'caption' => $image->image,
  563 + 'width' => '120px',
  564 + 'url' => \yii\helpers\Url::to(
  565 + [
  566 + '/product/manage/delimg',
  567 + 'id' => $image->product_image_id,
  568 + ]
  569 + ),
  570 + 'key' => $image->product_image_id,
  571 + 'extra' => [
  572 + 'id' => $image->product_image_id,
  573 + ],
  574 + ];
  575 + }
  576 + }
  577 + return $op;
  578 + }
  579 +
  580 + public function recalculateRating()
  581 + {
  582 + /**
  583 + * @var ProductToRating $averageRating
  584 + */
  585 + $average = $this->getComments()
  586 + ->joinWith('rating')
  587 + ->select([ 'average' => 'avg(artbox_comment_rating.value)::float' ])
  588 + ->scalar();
  589 + if (!$average) {
  590 + $average = 0;
  591 + }
  592 + $averageRating = $this->averageRating;
  593 + if (!empty( $averageRating )) {
  594 + $averageRating->value = $average;
  595 + } else {
  596 + $averageRating = new ProductToRating(
  597 + [
  598 + 'product_id' => $this->product_id,
  599 + 'value' => $average,
  600 + ]
  601 + );
  602 + }
  603 + if ($averageRating->save()) {
  604 + return true;
  605 + } else {
  606 + return false;
  607 + }
  608 + }
  609 +
  610 + public function getComments()
  611 + {
  612 + return $this->hasMany(CommentModel::className(), [ 'entity_id' => 'product_id' ])
  613 + ->where(
  614 + [
  615 + 'artbox_comment.entity' => self::className(),
  616 + 'artbox_comment.status' => CommentModel::STATUS_ACTIVE,
  617 + 'artbox_comment.artbox_comment_pid' => null,
  618 + ]
  619 + );
  620 + }
  621 +
  622 + public function getAverageRating()
  623 + {
  624 + return $this->hasOne(ProductToRating::className(), [ 'product_id' => 'product_id' ]);
  625 + }
  626 +
  627 + public function getTaxGroupsByLevel($level)
  628 + {
  629 + $categories = ArrayHelper::getColumn($this->categories, 'category_id');
  630 + return TaxGroup::find()
  631 + ->distinct()
  632 + ->innerJoin('relation', 'entity1_id = tax_group_id')
  633 + ->andWhere([ 'relation.entity2_id' => $categories ])
  634 + ->andWhere([ 'level' => $level ]);
460 } 635 }
461 } 636 }
462 -  
463 - public function getComments() {  
464 - return $this->hasMany(CommentModel::className(), ['entity_id' => 'product_id'])->where(['artbox_comment.entity' => self::className(), 'artbox_comment.status' => CommentModel::STATUS_ACTIVE, 'artbox_comment.artbox_comment_pid' => NULL]);  
465 - }  
466 -  
467 - public function getAverageRating() {  
468 - return $this->hasOne(ProductToRating::className(), ['product_id' => 'product_id']);  
469 - }  
470 -  
471 - public function getTaxGroupsByLevel($level)  
472 - {  
473 - $categories = ArrayHelper::getColumn($this->categories, 'category_id');  
474 - return TaxGroup::find()->distinct()->innerJoin('relation', 'entity1_id = tax_group_id')->andWhere(['relation.entity2_id' => $categories])->andWhere(['level' => $level]);  
475 - }  
476 -}  
common/modules/rubrication/models/TaxGroup.php
@@ -20,6 +20,7 @@ use Yii; @@ -20,6 +20,7 @@ use Yii;
20 * @property integer $level 20 * @property integer $level
21 * @property integer $sort 21 * @property integer $sort
22 * @property boolean $display 22 * @property boolean $display
  23 + * @property boolean $use_in_name
23 * @property TaxGroupToGroup[] $taxGroupToGroups 24 * @property TaxGroupToGroup[] $taxGroupToGroups
24 * @property TaxGroupToGroup[] $taxGroupToGroups0 25 * @property TaxGroupToGroup[] $taxGroupToGroups0
25 * @property TaxOption[] $taxOptions 26 * @property TaxOption[] $taxOptions
@@ -65,7 +66,7 @@ class TaxGroup extends \yii\db\ActiveRecord @@ -65,7 +66,7 @@ class TaxGroup extends \yii\db\ActiveRecord
65 return [ 66 return [
66 [['name', 'module'], 'required'], 67 [['name', 'module'], 'required'],
67 [['description', 'settings'], 'string'], 68 [['description', 'settings'], 'string'],
68 - [['hierarchical', 'is_filter', 'display'], 'boolean'], 69 + [['hierarchical', 'is_filter', 'display', 'use_in_name'], 'boolean'],
69 [['level', 'sort'], 'integer'], 70 [['level', 'sort'], 'integer'],
70 [['alias', 'module'], 'string', 'max' => 50], 71 [['alias', 'module'], 'string', 'max' => 50],
71 [['name'], 'string', 'max' => 255], 72 [['name'], 'string', 'max' => 255],
@@ -89,6 +90,7 @@ class TaxGroup extends \yii\db\ActiveRecord @@ -89,6 +90,7 @@ class TaxGroup extends \yii\db\ActiveRecord
89 'is_filter' => 'Use in filter', 90 'is_filter' => 'Use in filter',
90 'sort' => 'Sort', 91 'sort' => 'Sort',
91 'display' => 'Display', 92 'display' => 'Display',
  93 + 'use_in_name' => 'Использовать в названии',
92 ]; 94 ];
93 } 95 }
94 96
common/modules/rubrication/models/TaxOption.php
@@ -19,6 +19,7 @@ use yii\db\ActiveRecord; @@ -19,6 +19,7 @@ use yii\db\ActiveRecord;
19 * @property string $alias 19 * @property string $alias
20 * @property integer $sort 20 * @property integer $sort
21 * @property integer $default_value 21 * @property integer $default_value
  22 + * @property string $synonym
22 * 23 *
23 * @property TaxEntityRelation[] $taxEntityRelations 24 * @property TaxEntityRelation[] $taxEntityRelations
24 * @property TaxGroup $taxGroup 25 * @property TaxGroup $taxGroup
@@ -73,6 +74,7 @@ class TaxOption extends \yii\db\ActiveRecord @@ -73,6 +74,7 @@ class TaxOption extends \yii\db\ActiveRecord
73 return [ 74 return [
74 [['tax_group_id','name'], 'required'], 75 [['tax_group_id','name'], 'required'],
75 [['tax_group_id', 'parent_id', 'sort', 'default_value'], 'integer'], 76 [['tax_group_id', 'parent_id', 'sort', 'default_value'], 'integer'],
  77 + [['synonym'], 'string', 'max' => 255],
76 [['alias'], 'string', 'max' => 50], 78 [['alias'], 'string', 'max' => 50],
77 [['tax_group_id'], 'exist', 'skipOnError' => true, 'targetClass' => TaxGroup::className(), 'targetAttribute' => ['tax_group_id' => 'tax_group_id']], 79 [['tax_group_id'], 'exist', 'skipOnError' => true, 'targetClass' => TaxGroup::className(), 'targetAttribute' => ['tax_group_id' => 'tax_group_id']],
78 // [['parent_id'], 'exist', 'skipOnError' => true, 'targetClass' => TaxOption::className(), 'targetAttribute' => ['parent_id' => 'tax_option_id']], 80 // [['parent_id'], 'exist', 'skipOnError' => true, 'targetClass' => TaxOption::className(), 'targetAttribute' => ['parent_id' => 'tax_option_id']],
@@ -91,6 +93,7 @@ class TaxOption extends \yii\db\ActiveRecord @@ -91,6 +93,7 @@ class TaxOption extends \yii\db\ActiveRecord
91 'alias' => Yii::t('app', 'Alias'), 93 'alias' => Yii::t('app', 'Alias'),
92 'sort' => Yii::t('app', 'Sort'), 94 'sort' => Yii::t('app', 'Sort'),
93 'default_value' => Yii::t('app', 'Default Value'), 95 'default_value' => Yii::t('app', 'Default Value'),
  96 + 'synonym' => Yii::t('product', 'Синоним'),
94 ]; 97 ];
95 } 98 }
96 99
common/modules/rubrication/views/tax-group/_form.php
@@ -38,6 +38,8 @@ use common\components\artboxtree\ArtboxTreeHelper; @@ -38,6 +38,8 @@ use common\components\artboxtree\ArtboxTreeHelper;
38 38
39 <?= $form->field($model, 'display')->checkbox() ?> 39 <?= $form->field($model, 'display')->checkbox() ?>
40 40
  41 + <?= $form->field($model, 'use_in_name')->checkbox() ?>
  42 +
41 <?= $form->field($model, 'sort')->textInput() ?> 43 <?= $form->field($model, 'sort')->textInput() ?>
42 44
43 <div class="form-group"> 45 <div class="form-group">
common/modules/rubrication/views/tax-option/_form.php
@@ -30,8 +30,10 @@ use common\modules\rubrication\helpers\RubricationHelper; @@ -30,8 +30,10 @@ use common\modules\rubrication\helpers\RubricationHelper;
30 30
31 <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> 31 <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
32 <!-- --><?php //require(dirname(__FILE__) .'/value/_fields_'. $group->module .'.php')?> 32 <!-- --><?php //require(dirname(__FILE__) .'/value/_fields_'. $group->module .'.php')?>
33 - 33 +
34 <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?> 34 <?= $form->field($model, 'alias')->textInput(['maxlength' => true]) ?>
  35 +
  36 + <?= $form->field($model, 'synonym')->textInput(['maxlength' => true]) ?>
35 37
36 <?php if ($group->hierarchical) :?> 38 <?php if ($group->hierarchical) :?>
37 <?php 39 <?php
console/migrations/m170303_130758_add_columns_synonym.php 0 → 100644
  1 +<?php
  2 +
  3 + use yii\db\Migration;
  4 +
  5 + class m170303_130758_add_columns_synonym extends Migration
  6 + {
  7 + public function up()
  8 + {
  9 + $this->addColumn('category', 'synonym', $this->string());
  10 + $this->addColumn(
  11 + 'tax_group',
  12 + 'use_in_name',
  13 + $this->boolean()
  14 + ->defaultValue(false)
  15 + );
  16 + $this->addColumn('tax_option', 'synonym', $this->string());
  17 + }
  18 +
  19 + public function down()
  20 + {
  21 + $this->dropColumn('tax_group', 'use_in_menu');
  22 + $this->dropColumn('tax_option', 'synonym');
  23 + $this->dropColumn('category', 'synonym');
  24 + }
  25 + }
frontend/views/catalog/product_item.php
@@ -64,7 +64,7 @@ @@ -64,7 +64,7 @@
64 'product' => $product, 64 'product' => $product,
65 '#' => 'm' . $product->enabledVariants[ 0 ]->product_variant_id, 65 '#' => 'm' . $product->enabledVariants[ 0 ]->product_variant_id,
66 ]) ?>" 66 ]) ?>"
67 - class="name"><?= $product->fullnamewithcategory ?> 67 + class="name"><?= $product->fullname ?>
68 </a></div> 68 </a></div>
69 69
70 <?php 70 <?php