Blame view

common/modules/product/models/Product.php 5.71 KB
a8370482   Alexander Karnovsky   init project
1
2
3
4
  <?php
  
  namespace common\modules\product\models;
  
5aa7418e   Karnovsky A   Base-product#3 fu...
5
  use common\behaviors\Slug;
a8370482   Alexander Karnovsky   init project
6
7
8
9
10
11
12
13
14
  use common\modules\rubrication\models\TaxOption;
  use Yii;
  use common\modules\relation\relationBehavior;
  use yii\db\ActiveQuery;
  
  /**
   * This is the model class for table "{{%product}}".
   *
   * @property string $name
b519af22   Karnovsky A   Base-product func...
15
   * @property integer $brand_id
a8370482   Alexander Karnovsky   init project
16
   * @property integer $product_id
b519af22   Karnovsky A   Base-product func...
17
18
19
20
21
   * @property Category $category
   * @property array $categories
   * @property ProductVariant $variant
   * @property ProductImage $image
   * @property array $images
a8370482   Alexander Karnovsky   init project
22
23
24
   */
  class Product extends \yii\db\ActiveRecord
  {
14eadb86   Karnovsky A   Eager loading for...
25
      /** @var array $_variants */
b519af22   Karnovsky A   Base-product func...
26
      public $_variants = [];
5aa7418e   Karnovsky A   Base-product#3 fu...
27
28
29
  
      /** @var array $_images */
      public $imagesUpload = [];
a8370482   Alexander Karnovsky   init project
30
31
32
33
34
35
36
37
38
      /**
       * @inheritdoc
       */
      public function behaviors()
      {
          return [
              [
                  'class' => relationBehavior::className(),
                  'relations' => [
5aa7418e   Karnovsky A   Base-product#3 fu...
39
40
                      'product_categories' => 'entity1', // Product category
                      'product_option' => 'entity1' // Product category
a8370482   Alexander Karnovsky   init project
41
42
                  ]
              ],
5aa7418e   Karnovsky A   Base-product#3 fu...
43
44
45
46
47
48
              [
                  'class' => Slug::className(),
                  'in_attribute' => 'name',
                  'out_attribute' => 'alias',
                  'translit' => true
              ]
a8370482   Alexander Karnovsky   init project
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
          ];
      }
  
      /**
       * @inheritdoc
       */
      public static function tableName()
      {
          return '{{%product}}';
      }
  
      /**
       * @inheritdoc
       */
      public function rules()
      {
          return [
b519af22   Karnovsky A   Base-product func...
66
              [['brand_id'], 'integer'],
a8370482   Alexander Karnovsky   init project
67
              [['name'], 'string', 'max' => 150],
5aa7418e   Karnovsky A   Base-product#3 fu...
68
69
              [['alias'], 'string', 'max' => 250],
              [['categories', 'variants', 'options'], 'safe'],
0cc2a675   Karnovsky A   Base-product#4 fu...
70
  //            [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'],
5aa7418e   Karnovsky A   Base-product#3 fu...
71
              [['description', 'video'], 'safe'],
a8370482   Alexander Karnovsky   init project
72
73
74
75
76
77
78
79
80
81
  //            [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']],
          ];
      }
  
      /**
       * @inheritdoc
       */
      public function attributeLabels()
      {
          return [
b519af22   Karnovsky A   Base-product func...
82
              'product_id' => Yii::t('product', 'ID'),
a8370482   Alexander Karnovsky   init project
83
              'name' => Yii::t('product', 'Name'),
b519af22   Karnovsky A   Base-product func...
84
              'brand_id' => Yii::t('product', 'Brand'),
a8370482   Alexander Karnovsky   init project
85
              'categories' => Yii::t('product', 'Categories'), // relation behavior field
b519af22   Karnovsky A   Base-product func...
86
              'category' => Yii::t('product', 'Category'), // relation behavior field
5aa7418e   Karnovsky A   Base-product#3 fu...
87
88
              'image' => Yii::t('product', 'Image'),
              'images' => Yii::t('product', 'Images'),
a8370482   Alexander Karnovsky   init project
89
90
91
92
93
94
95
96
          ];
      }
  
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getBrand()
      {
b519af22   Karnovsky A   Base-product func...
97
          return $this->hasOne(Brand::className(), ['brand_id' => 'brand_id']);
a8370482   Alexander Karnovsky   init project
98
99
      }
  
b519af22   Karnovsky A   Base-product func...
100
101
102
103
104
105
106
107
108
109
110
111
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getImage()
      {
          return $this->hasOne(ProductImage::className(), ['product_id' => 'product_id']);
      }
  
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getImages()
a8370482   Alexander Karnovsky   init project
112
      {
b519af22   Karnovsky A   Base-product func...
113
          return $this->hasMany(ProductImage::className(), ['product_id' => 'product_id']);
a8370482   Alexander Karnovsky   init project
114
115
      }
  
5aa7418e   Karnovsky A   Base-product#3 fu...
116
117
118
119
      public function setImages($images) {
          $this->_images = $images;
      }
  
b519af22   Karnovsky A   Base-product func...
120
121
122
123
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getVariant()
a8370482   Alexander Karnovsky   init project
124
      {
b519af22   Karnovsky A   Base-product func...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
          return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id']);
      }
  
      public function getVariantPrice() {
          return $this->variant->price;
      }
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getVariants()
      {
          return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id']);
      }
  
      public function setVariants($variants) {
          $this->_variants = $variants;
      }
  
      public function getFullName()
      {
          return $this->brand->name .' '. $this->name;
      }
  
      public function getCategories() {
          return $this->getRelations('product_categories');
      }
  
      public function getCategoriesNames() {
          $result = [];
          foreach($this->categories as $category) {
              $result[] = $category->name;
          }
          return $result;
a8370482   Alexander Karnovsky   init project
158
159
160
161
162
163
164
      }
  
      public function getCategory() {
          /** @var ActiveQuery $categories */
          $categories = $this->getRelations('product_categories');
          $count = $categories->count();
          if ($count == 0)
b519af22   Karnovsky A   Base-product func...
165
166
              return;
          return $categories->one();
a8370482   Alexander Karnovsky   init project
167
168
      }
  
5aa7418e   Karnovsky A   Base-product#3 fu...
169
170
171
172
      public function getOptions() {
          return $this->getRelations('product_option');
      }
  
a8370482   Alexander Karnovsky   init project
173
174
175
176
177
178
179
180
      /**
       * @inheritdoc
       * @return ProductQuery the active query used by this AR class.
       */
      public static function find()
      {
          return new ProductQuery(get_called_class());
      }
b519af22   Karnovsky A   Base-product func...
181
182
183
184
185
  
      public function afterSave($insert, $changedAttributes)
      {
          parent::afterSave($insert, $changedAttributes);
  
0cc2a675   Karnovsky A   Base-product#4 fu...
186
187
188
  //        foreach($this->imagesUpload as $image) {
  //            $image->saveAs('/images/items/' . $image->baseName .'_'. uniqid() . '.' . $image->extension);
  //        }
5aa7418e   Karnovsky A   Base-product#3 fu...
189
  
b519af22   Karnovsky A   Base-product func...
190
191
192
193
194
          $todel = [];
          foreach ($this->variants ? : [] as $_variant) {
              $todel[$_variant->product_variant_id] = $_variant->product_variant_id;
          }
          foreach ($this->_variants as $_variant) {
5aa7418e   Karnovsky A   Base-product#3 fu...
195
196
197
              if (!is_array($_variant)) {
                  return;
              }
b519af22   Karnovsky A   Base-product func...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
              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->save();
          }
          if (!empty($todel)) {
              ProductVariant::deleteAll(['product_variant_id' => $todel]);
          }
      }
a8370482   Alexander Karnovsky   init project
212
  }