Commit 01b711c81f2b09d44fb5c060e7c11b15a358abe5

Authored by Yarik
1 parent 91fc4901

Synonyms

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