Blame view

common/modules/product/models/Product.php 16.3 KB
3f2bc3d0   Administrator   first commit
1
2
3
4
5
  <?php

  

  namespace common\modules\product\models;

  

  use common\behaviors\Slug;

873e3d80   Administrator   14.09.16
6
  use common\models\Event;

e608c5f7   Yarik   Comment added
7
  use common\models\ProductToRating;

b5a906ef   Administrator   20.07.16
8
  use common\models\Share;

17ca60dd   Yarik   Added comments to...
9
  use common\modules\comment\models\CommentModel;

96f5a822   Administrator   29.06.16
10
  use common\modules\product\behaviors\FilterBehavior;

c7852657   Karnovsky A   -
11
  use common\modules\rubrication\models\TaxGroup;

3f2bc3d0   Administrator   first commit
12
13
14
  use common\modules\rubrication\models\TaxOption;

  use Yii;

  use common\modules\relation\relationBehavior;

01905ec6   Yarik   Filter fixing
15
  use yii\db\ActiveQuery;

868680ca   Karnovsky A   -
16
  use yii\db\ActiveRecord;

0dfd8fe2   Yarik   Tax options fix
17
  use yii\helpers\ArrayHelper;

3f2bc3d0   Administrator   first commit
18
19
20
21
  

  /**

   * This is the model class for table "{{%product}}".

   *

3f2bc3d0   Administrator   first commit
22
   * @property string $name

3f2bc3d0   Administrator   first commit
23
   * @property integer $brand_id

ccc7a9d3   Karnovsky A   Karnovsky 12052016
24
   * @property integer $product_id

3f2bc3d0   Administrator   first commit
25
26
   * @property Category $category

   * @property array $categories

ccc7a9d3   Karnovsky A   Karnovsky 12052016
27
   * @property array of ProductVariant $variants

3f2bc3d0   Administrator   first commit
28
   * @property ProductVariant $variant

3f2bc3d0   Administrator   first commit
29
30
   * @property ProductImage $image

   * @property array $images

ccc7a9d3   Karnovsky A   Karnovsky 12052016
31
32
   * @property boolean $is_top

   * @property boolean $is_new

dc2cd017   Karnovsky A   -
33
   * @property boolean $akciya

e608c5f7   Yarik   Comment added
34
   * @property ProductToRating $averageRating

e9f291a5   Karnovsky A   Similar products ...
35
36
37
   * @property array $properties

   * @property ProductVariant $enabledVariant

   * @property array $enabledVariants

3f2bc3d0   Administrator   first commit
38
39
40
41
42
43
44
45
   */

  class Product extends \yii\db\ActiveRecord

  {

      /** @var array $_variants */

      public $_variants = [];

  

      /** @var array $_images */

      public $imagesUpload = [];

a0be9a4d   Karnovsky A   30062016
46
  

3f2bc3d0   Administrator   first commit
47
48
49
50
51
52
53
54
55
56
57
58
59
60
      /**

       * @inheritdoc

       */

      public function behaviors()

      {

          return [

              [

                  'class' => relationBehavior::className(),

                  'relations' => [

                      'product_categories' => 'entity1', // Product category

                      'product_option' => 'entity1' // Product category

                  ]

              ],

              [

96f5a822   Administrator   29.06.16
61
62
63
                  'class' =>FilterBehavior::className(),

              ],

              [

3f2bc3d0   Administrator   first commit
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
                  'class' => Slug::className(),

                  'in_attribute' => 'name',

                  'out_attribute' => 'alias',

                  'translit' => true

              ]

          ];

      }

  

      /**

       * @inheritdoc

       */

      public static function tableName()

      {

          return '{{%product}}';

      }

  

      /**

       * @inheritdoc

       */

      public function rules()

      {

          return [

067092f7   Karnovsky A   -
86
  //            [['categories'], 'required'],

3f2bc3d0   Administrator   first commit
87
88
89
              [['brand_id'], 'integer'],

              [['name'], 'string', 'max' => 150],

              [['alias'], 'string', 'max' => 250],

ccc7a9d3   Karnovsky A   Karnovsky 12052016
90
              [['categories', 'variants', 'options', 'imagesUpload'], 'safe'],

dc2cd017   Karnovsky A   -
91
  //            [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif', 'maxFiles' => 50],

3f2bc3d0   Administrator   first commit
92
              [['description', 'video'], 'safe'],

dc2cd017   Karnovsky A   -
93
              [['is_top', 'is_new', 'akciya'], 'boolean'],

3f2bc3d0   Administrator   first commit
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  //            [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']],

          ];

      }

  

      /**

       * @inheritdoc

       */

      public function attributeLabels()

      {

          return [

              'product_id' => Yii::t('product', 'ID'),

              'name' => Yii::t('product', 'Name'),

              'brand_id' => Yii::t('product', 'Brand'),

              'categories' => Yii::t('product', 'Categories'), // relation behavior field

              'category' => Yii::t('product', 'Category'), // relation behavior field

              'image' => Yii::t('product', 'Image'),

              'images' => Yii::t('product', 'Images'),

ccc7a9d3   Karnovsky A   Karnovsky 12052016
111
112
113
114
115
              'description' => Yii::t('product', 'Description'),

              'video' => Yii::t('product', 'Video embeded'),

              'variants' => Yii::t('product', 'Variants'),

              'is_top' => Yii::t('product', 'Is top'),

              'is_new' => Yii::t('product', 'Is new'),

dc2cd017   Karnovsky A   -
116
              'akciya' => Yii::t('product', 'Is promo'),

3f2bc3d0   Administrator   first commit
117
118
119
          ];

      }

  

873e3d80   Administrator   14.09.16
120
121
122
123
124
125
126
127
128
129
130
  

      public function withEventBanner(){

  

      }

  

  

  

      public function getEvents(){

          return $this->hasMany(Event::className(), ['event_id' => 'event_id'])->viaTable('events_to_products', ['product_id' => 'product_id']);

      }

  

02e6c2ba   Karnovsky A   -
131
132
133
134
      public function getUrl() {

          return '/product/'. $this->alias;

      }

  

3f2bc3d0   Administrator   first commit
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getBrand()

      {

          return $this->hasOne(Brand::className(), ['brand_id' => 'brand_id']);

      }

  

      /**

       * @return \yii\db\ActiveQuery

       */

      public function getImage()

      {

          return $this->hasOne(ProductImage::className(), ['product_id' => 'product_id']);

      }

  

      /**

dc2cd017   Karnovsky A   -
152
153
154
155
156
       * fetch stored image url

       * @return string

       */

      public function getImageUrl()

      {

4902c747   Karnovsky A   -
157
158
          $image = empty($this->variant) ? null : $this->variant->image;

          return !empty($image) ? $image->imageUrl : '/images/no_photo.png';

dc2cd017   Karnovsky A   -
159
160
161
      }

  

      /**

3f2bc3d0   Administrator   first commit
162
163
164
165
       * @return \yii\db\ActiveQuery

       */

      public function getImages()

      {

1e55b4b8   Karnovsky A   -
166
          return $this->hasMany(ProductImage::className(), ['product_id' => 'product_id'])->where(['product_variant_id' => null]);

3f2bc3d0   Administrator   first commit
167
168
      }

  

3f2bc3d0   Administrator   first commit
169
170
171
172
173
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getVariant()

      {

0a93b48a   Karnovsky A   -
174
          return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id']);

3f2bc3d0   Administrator   first commit
175
176
      }

  

d48d8bc0   Karnovsky A   -
177
178
179
180
181
182
183
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getEnabledVariant()

      {

          return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]);

      }

e9f291a5   Karnovsky A   Similar products ...
184
  

3f2bc3d0   Administrator   first commit
185
186
187
      public function getVariantPrice() {

          return $this->variant->price;

      }

1e55b4b8   Karnovsky A   -
188
  

d48d8bc0   Karnovsky A   -
189
      public function getEnabledVariantPrice() {

c7852657   Karnovsky A   -
190
          return $this->enabledVariants[0]->price;

d48d8bc0   Karnovsky A   -
191
192
      }

  

3f2bc3d0   Administrator   first commit
193
194
195
196
197
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getVariants()

      {

0a93b48a   Karnovsky A   -
198
          return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id']);

3f2bc3d0   Administrator   first commit
199
200
      }

  

1e55b4b8   Karnovsky A   -
201
202
      public function getEnabledVariants()

      {

1b898c16   Administrator   20.07.16
203
          return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0])->joinWith('image');

1e55b4b8   Karnovsky A   -
204
205
      }

  

c7852657   Karnovsky A   -
206
207
208
209
210
211
212
      /*

       * Get variants grouped by type

       */

      public function getEnabledVariantsGrouped()

      {

          $variants = [];

          foreach ($this->enabledVariants as $variant) {

a57c9f4d   Karnovsky A   -
213
              $variants[$variant->product_variant_type_id ? $variant->product_variant_type_id : 1][] = $variant;

c7852657   Karnovsky A   -
214
215
216
217
          }

          if (empty($variants)) {

              return [];

          }

a57c9f4d   Karnovsky A   -
218
          $ids = array_keys($variants);

c7852657   Karnovsky A   -
219
          $variants_type = [];

a57c9f4d   Karnovsky A   -
220
          foreach(ProductVariantType::find()->select(['product_variant_type_id', 'name2'])->where(['product_variant_type_id' => $ids])->all() as $variant_type) {

c7852657   Karnovsky A   -
221
222
223
224
225
226
              $variant_type->_variants = $variants[$variant_type->product_variant_type_id];

              $variants_type[] = $variant_type;

          }

          return $variants_type;

      }

  

3f2bc3d0   Administrator   first commit
227
228
229
230
231
232
      public function setVariants($variants) {

          $this->_variants = $variants;

      }

  

      public function getFullName()

      {

ebf6e240   Administrator   14.09.16
233
234
235
236
237
238
239
240
          $words = [

            'Рюкзаки' => 'Рюкзак',

            'Несессеры' => 'Несессер',

            'Сумки' => 'Сумка',

            'Чехлы' => 'Чехол',

            'Кошельки' => 'Кошелек',

            'Гермочехлы' => 'Гермочехол',

          ];

cfc5b583   Administrator   14.09.16
241
242
243
244
245
246
247
248
249
250
251
252
253
          return  empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;

      }

  

      public function getFullNameWithCategory()

      {

          $words = [

              'Рюкзаки' => 'Рюкзак',

              'Несессеры' => 'Несессер',

              'Сумки' => 'Сумка',

              'Чехлы' => 'Чехол',

              'Кошельки' => 'Кошелек',

              'Гермочехлы' => 'Гермочехол',

          ];

ebf6e240   Administrator   14.09.16
254
255
          $name = empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;

          return empty($this->category->categoryName->value) ? $name : (isset($words[$this->category->categoryName->value])? $words[$this->category->categoryName->value]: '') .' '. $name;

3f2bc3d0   Administrator   first commit
256
257
      }

  

cfc5b583   Administrator   14.09.16
258
  

3f2bc3d0   Administrator   first commit
259
      public function getCategories() {

ccc7a9d3   Karnovsky A   Karnovsky 12052016
260
261
          return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);

  //        return $this->getRelations('product_categories');

3f2bc3d0   Administrator   first commit
262
      }

96f5a822   Administrator   29.06.16
263
264
265
266
      public function getCategoriesWithName() {

          return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id'])->joinWith('categoryNames');

  //        return $this->getRelations('product_categories');

      }

3f2bc3d0   Administrator   first commit
267
268
269
270
271
272
273
274
275
  

      public function getCategoriesNames() {

          $result = [];

          foreach($this->categories as $category) {

              $result[] = $category->name;

          }

          return $result;

      }

  

96f5a822   Administrator   29.06.16
276
277
278
      public function getVariantsWithFilters(){

          return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->with('filters');

      }

01905ec6   Yarik   Filter fixing
279
280
281
282
      

      /**

       * @return ActiveQuery

       */

3f2bc3d0   Administrator   first commit
283
      public function getCategory() {

ccc7a9d3   Karnovsky A   Karnovsky 12052016
284
          return $this->hasOne(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']);

3f2bc3d0   Administrator   first commit
285
286
287
      }

  

      public function getOptions() {

c7852657   Karnovsky A   -
288
          return $this->hasMany(TaxOption::className(), ['tax_option_id' => 'option_id'])->viaTable('product_option', ['product_id' => 'product_id']);

1aafb42d   Karnovsky A   -
289
290
291
292
293
294
295
296
297
298
      }

  

      public function getProperties() {

          $groups = $options = [];

          foreach ($this->options as $option) {

              $options[$option->tax_group_id][] = $option;

          }

          foreach (TaxGroup::find()->where(['tax_group_id' => array_keys($options)])->all() as $group) {

              if (!empty($options[$group->tax_group_id])) {

                  $group->_options = $options[$group->tax_group_id];

aa5c63f4   Yarik   Filter fixing
299
300
301
302
303
304
                  $groups[] = $group;

              }

          }

          return $groups;

      }

      

01905ec6   Yarik   Filter fixing
305
      public function getActiveProperties($category_id) {

aa5c63f4   Yarik   Filter fixing
306
307
308
309
          $groups = $options = [];

          foreach ($this->options as $option) {

              $options[$option->tax_group_id][] = $option;

          }

01905ec6   Yarik   Filter fixing
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) {

aa5c63f4   Yarik   Filter fixing
311
312
              if (!empty($options[$group->tax_group_id])) {

                  $group->_options = $options[$group->tax_group_id];

1aafb42d   Karnovsky A   -
313
314
315
316
                  $groups[] = $group;

              }

          }

          return $groups;

3f2bc3d0   Administrator   first commit
317
318
      }

  

5ee9ab1f   Karnovsky A   -
319
320
321
322
      public function getStocks() {

          return $this->hasMany(Stock::className(), ['stock_id' => 'stock_id'])->viaTable(ProductStock::tableName(), ['product_id' => 'product_id']);

      }

  

3f2bc3d0   Administrator   first commit
323
324
325
326
327
328
329
330
331
      /**

       * @inheritdoc

       * @return ProductQuery the active query used by this AR class.

       */

      public static function find()

      {

          return new ProductQuery(get_called_class());

      }

  

1e55b4b8   Karnovsky A   -
332
333
334
335
336
337
      public function getQuantity() {

          return ProductStock::find()

              ->where(['product_id' => $this->product_id])

              ->sum('quantity');

      }

  

3f2bc3d0   Administrator   first commit
338
339
340
341
      public function afterSave($insert, $changedAttributes)

      {

          parent::afterSave($insert, $changedAttributes);

  

ccc7a9d3   Karnovsky A   Karnovsky 12052016
342
343
344
345
346
347
348
349
350
351
352
353
  //        $images = UploadedFile::getInstance($this, 'imagesUpload');

  //        var_dump($images);exit;

  

  //        if (!empty($this->imagesUpload)) {

  //            if (!is_array($this->imagesUpload)) {

  //                $this->imagesUpload = [$this->imagesUpload];

  //            }

  //            foreach($this->imagesUpload as $image) {

  //                $image->saveAs((Yii::getAlias('@frontend/web/storage/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension)));

  //            }

  //

  //

3f2bc3d0   Administrator   first commit
354
355
  //        }

  

4902c747   Karnovsky A   -
356
357
358
359
          if (!empty($this->_variants)) {

              $todel = [];

              foreach ($this->variants ?: [] as $_variant) {

                  $todel[$_variant->product_variant_id] = $_variant->product_variant_id;

3f2bc3d0   Administrator   first commit
360
              }

4902c747   Karnovsky A   -
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
              foreach ($this->_variants as $_variant) {

                  if (!is_array($_variant)) {

                      return;

                  }

                  if (!empty($_variant['product_variant_id'])) {

                      unset($todel[$_variant['product_variant_id']]);

                      $model = ProductVariant::findOne($_variant['product_variant_id']);

                  } else {

                      $model = new ProductVariant();

                  }

                  $_variant['product_id'] = $this->product_id;

                  $model->load(['ProductVariant' => $_variant]);

                  $model->product_id = $this->product_id;

                  $model->save();

              }

              if (!empty($todel)) {

                  ProductVariant::deleteAll(['product_variant_id' => $todel]);

3f2bc3d0   Administrator   first commit
378
              }

c9d723d7   Karnovsky A   -
379
          }

3f2bc3d0   Administrator   first commit
380
      }

ccc7a9d3   Karnovsky A   Karnovsky 12052016
381
  

868680ca   Karnovsky A   -
382
383
384
385
      public function beforeDelete() {

          ProductImage::deleteAll(['product_id' => $this->product_id]);

          ProductCategory::deleteAll(['product_id' => $this->product_id]);

          ProductVariant::deleteAll(['product_id' => $this->product_id]);

b5a906ef   Administrator   20.07.16
386
          ProductOption::deleteAll(['product_id' => $this->product_id]);

4052cb43   Administrator   20.07.16
387
          //ProductVariantOption::deleteAll(['product_id' => $this->product_id]);

b5a906ef   Administrator   20.07.16
388
389
390
          ProductStock::deleteAll(['product_id' => $this->product_id]);

          Share::deleteAll(['product_id' => $this->product_id]);

          return true;

868680ca   Karnovsky A   -
391
392
      }

  

ccc7a9d3   Karnovsky A   Karnovsky 12052016
393
394
395
396
397
398
399
      public function imagesUpload()

      {

          if ($this->validate()) {

              $images = [];

              foreach ($this->imagesUpload as $image) {

                  $imageName = $image->baseName .'.'. $image->extension;

                  $i = 0;

83be3cfb   Karnovsky A   -
400
                  while(file_exists(Yii::getAlias('@imagesDir/products/' . $imageName))) {

ccc7a9d3   Karnovsky A   Karnovsky 12052016
401
402
403
404
                      $i++;

                      $imageName = $image->baseName .'_'. $i .'.'. $image->extension;

                  }

  

83be3cfb   Karnovsky A   -
405
                  $image->saveAs(Yii::getAlias('@imagesDir/products/' .$imageName));

ccc7a9d3   Karnovsky A   Karnovsky 12052016
406
407
408
409
410
411
412
413
414
415
416
417
                  $images[] = $imageName;

              }

              return $images;

          } else {

              return false;

          }

      }

  

      public function getImagesHTML() {

          $op = [];

          if ($this->images) {

              foreach ($this->images as $image) {

83be3cfb   Karnovsky A   -
418
                  $op[] = \common\components\artboximage\ArtboxImageHelper::getImage($image->imageUrl, 'admin_thumb');

ccc7a9d3   Karnovsky A   Karnovsky 12052016
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
              }

          }

          return $op;

      }

  

      public function getImagesConfig() {

          $op = [];

          if ($this->images) {

              foreach ($this->images as $image) {

                  $op[] = [

                      'caption' => $image->image,

                      'width' => '120px',

                      'url' => \yii\helpers\Url::to(['/product/manage/delimg', 'id' => $image->product_image_id]),

                      'key' => $image->product_image_id,

                      'extra' => [

                          'id' => $image->product_image_id,

                      ],

                  ];

              }

          }

          return $op;

      }

e608c5f7   Yarik   Comment added
441
442
443
444
445
      

      public function recalculateRating() {

          /**

           * @var ProductToRating $averageRating

           */

17ca60dd   Yarik   Added comments to...
446
          $average = $this->getComments()->joinWith('rating')->select(['average' => 'avg(artbox_comment_rating.value)::float'])->scalar();

e608c5f7   Yarik   Comment added
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
          if(!$average) {

              $average = 0;

          }

          $averageRating = $this->averageRating;

          if(!empty($averageRating)) {

              $averageRating->value = $average;

          } else {

              $averageRating = new ProductToRating(['product_id' => $this->product_id, 'value' => $average]);

          }

          if($averageRating->save()) {

              return true;

          } else {

              return false;

          }

      }

      

      public function getComments() {

17ca60dd   Yarik   Added comments to...
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]);

e608c5f7   Yarik   Comment added
465
      }

f27a7bd1   Administrator   20.07.16
466
  

e608c5f7   Yarik   Comment added
467
468
469
      public function getAverageRating() {

          return $this->hasOne(ProductToRating::className(), ['product_id' => 'product_id']);

      }

0dfd8fe2   Yarik   Tax options fix
470
471
472
473
      

      public function getTaxGroupsByLevel($level)

      {

          $categories = ArrayHelper::getColumn($this->categories, 'category_id');

01905ec6   Yarik   Filter fixing
474
          return TaxGroup::find()->distinct()->innerJoin('relation', 'entity1_id = tax_group_id')->andWhere(['relation.entity2_id' => $categories])->andWhere(['level' => $level]);

0dfd8fe2   Yarik   Tax options fix
475
      }

3f2bc3d0   Administrator   first commit
476
  }