Blame view

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

  

  namespace common\modules\product\models;

  

  use common\behaviors\Slug;

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

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

3f2bc3d0   Administrator   first commit
8
9
10
11
  use common\modules\rubrication\models\TaxOption;

  use Yii;

  use common\modules\relation\relationBehavior;

  use yii\db\ActiveQuery;

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

ccc7a9d3   Karnovsky A   Karnovsky 12052016
13
14
  use yii\helpers\Html;

  use yii\web\UploadedFile;

3f2bc3d0   Administrator   first commit
15
16
17
18
  

  /**

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

   *

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

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

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

3f2bc3d0   Administrator   first commit
22
23
   * @property Category $category

   * @property array $categories

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

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

3f2bc3d0   Administrator   first commit
26
27
   * @property ProductImage $image

   * @property array $images

ccc7a9d3   Karnovsky A   Karnovsky 12052016
28
29
   * @property boolean $is_top

   * @property boolean $is_new

dc2cd017   Karnovsky A   -
30
   * @property boolean $akciya

e9f291a5   Karnovsky A   Similar products ...
31
32
33
   * @property array $properties

   * @property ProductVariant $enabledVariant

   * @property array $enabledVariants

3f2bc3d0   Administrator   first commit
34
35
36
37
38
39
40
41
   */

  class Product extends \yii\db\ActiveRecord

  {

      /** @var array $_variants */

      public $_variants = [];

  

      /** @var array $_images */

      public $imagesUpload = [];

a0be9a4d   Karnovsky A   30062016
42
  

3f2bc3d0   Administrator   first commit
43
44
45
46
47
48
49
50
51
52
53
54
55
56
      /**

       * @inheritdoc

       */

      public function behaviors()

      {

          return [

              [

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

                  'relations' => [

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

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

                  ]

              ],

              [

96f5a822   Administrator   29.06.16
57
58
59
                  'class' =>FilterBehavior::className(),

              ],

              [

3f2bc3d0   Administrator   first commit
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
                  '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   -
82
  //            [['categories'], 'required'],

3f2bc3d0   Administrator   first commit
83
84
85
              [['brand_id'], 'integer'],

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

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

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

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

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

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

3f2bc3d0   Administrator   first commit
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  //            [['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
107
108
109
110
111
              '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   -
112
              'akciya' => Yii::t('product', 'Is promo'),

3f2bc3d0   Administrator   first commit
113
114
115
          ];

      }

  

02e6c2ba   Karnovsky A   -
116
117
118
119
      public function getUrl() {

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

      }

  

3f2bc3d0   Administrator   first commit
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
      /**

       * @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   -
137
138
139
140
141
       * fetch stored image url

       * @return string

       */

      public function getImageUrl()

      {

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

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

dc2cd017   Karnovsky A   -
144
145
146
      }

  

      /**

3f2bc3d0   Administrator   first commit
147
148
149
150
       * @return \yii\db\ActiveQuery

       */

      public function getImages()

      {

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

3f2bc3d0   Administrator   first commit
152
153
      }

  

3f2bc3d0   Administrator   first commit
154
155
156
157
158
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getVariant()

      {

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

3f2bc3d0   Administrator   first commit
160
161
      }

  

d48d8bc0   Karnovsky A   -
162
163
164
165
166
167
168
      /**

       * @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 ...
169
  

3f2bc3d0   Administrator   first commit
170
171
172
      public function getVariantPrice() {

          return $this->variant->price;

      }

1e55b4b8   Karnovsky A   -
173
  

d48d8bc0   Karnovsky A   -
174
      public function getEnabledVariantPrice() {

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

d48d8bc0   Karnovsky A   -
176
177
      }

  

3f2bc3d0   Administrator   first commit
178
179
180
181
182
      /**

       * @return \yii\db\ActiveQuery

       */

      public function getVariants()

      {

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

3f2bc3d0   Administrator   first commit
184
185
      }

  

1e55b4b8   Karnovsky A   -
186
187
      public function getEnabledVariants()

      {

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

1e55b4b8   Karnovsky A   -
189
190
      }

  

c7852657   Karnovsky A   -
191
192
193
194
195
196
197
      /*

       * Get variants grouped by type

       */

      public function getEnabledVariantsGrouped()

      {

          $variants = [];

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

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

c7852657   Karnovsky A   -
199
200
201
202
          }

          if (empty($variants)) {

              return [];

          }

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

c7852657   Karnovsky A   -
204
          $variants_type = [];

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

c7852657   Karnovsky A   -
206
207
208
209
210
211
              $variant_type->_variants = $variants[$variant_type->product_variant_type_id];

              $variants_type[] = $variant_type;

          }

          return $variants_type;

      }

  

3f2bc3d0   Administrator   first commit
212
213
214
215
216
217
218
219
220
221
      public function setVariants($variants) {

          $this->_variants = $variants;

      }

  

      public function getFullName()

      {

          return empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name;

      }

  

      public function getCategories() {

ccc7a9d3   Karnovsky A   Karnovsky 12052016
222
223
          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
224
      }

96f5a822   Administrator   29.06.16
225
226
227
228
      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
229
230
231
232
233
234
235
236
237
  

      public function getCategoriesNames() {

          $result = [];

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

              $result[] = $category->name;

          }

          return $result;

      }

  

96f5a822   Administrator   29.06.16
238
239
240
241
      public function getVariantsWithFilters(){

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

      }

  

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

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

3f2bc3d0   Administrator   first commit
244
245
246
      }

  

      public function getOptions() {

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

1aafb42d   Karnovsky A   -
248
249
250
251
252
253
254
255
256
257
258
259
260
261
      }

  

      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];

                  $groups[] = $group;

              }

          }

          return $groups;

3f2bc3d0   Administrator   first commit
262
263
      }

  

5ee9ab1f   Karnovsky A   -
264
265
266
267
      public function getStocks() {

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

      }

  

3f2bc3d0   Administrator   first commit
268
269
270
271
272
273
274
275
276
      /**

       * @inheritdoc

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

       */

      public static function find()

      {

          return new ProductQuery(get_called_class());

      }

  

1e55b4b8   Karnovsky A   -
277
278
279
280
281
282
      public function getQuantity() {

          return ProductStock::find()

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

              ->sum('quantity');

      }

  

3f2bc3d0   Administrator   first commit
283
284
285
286
      public function afterSave($insert, $changedAttributes)

      {

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

  

ccc7a9d3   Karnovsky A   Karnovsky 12052016
287
288
289
290
291
292
293
294
295
296
297
298
  //        $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
299
300
  //        }

  

4902c747   Karnovsky A   -
301
302
303
304
          if (!empty($this->_variants)) {

              $todel = [];

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

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

3f2bc3d0   Administrator   first commit
305
              }

4902c747   Karnovsky A   -
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
              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
323
              }

c9d723d7   Karnovsky A   -
324
          }

3f2bc3d0   Administrator   first commit
325
      }

ccc7a9d3   Karnovsky A   Karnovsky 12052016
326
  

868680ca   Karnovsky A   -
327
328
329
330
331
332
      public function beforeDelete() {

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

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

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

      }

  

ccc7a9d3   Karnovsky A   Karnovsky 12052016
333
334
335
336
337
338
339
      public function imagesUpload()

      {

          if ($this->validate()) {

              $images = [];

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

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

                  $i = 0;

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

ccc7a9d3   Karnovsky A   Karnovsky 12052016
341
342
343
344
                      $i++;

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

                  }

  

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

ccc7a9d3   Karnovsky A   Karnovsky 12052016
346
347
348
349
350
351
352
353
354
355
356
357
                  $images[] = $imageName;

              }

              return $images;

          } else {

              return false;

          }

      }

  

      public function getImagesHTML() {

          $op = [];

          if ($this->images) {

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

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

ccc7a9d3   Karnovsky A   Karnovsky 12052016
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
              }

          }

          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;

      }

3f2bc3d0   Administrator   first commit
381
  }