relationBehavior::className(), 'relations' => [ 'product_categories' => 'entity1', // Product category 'product_option' => 'entity1' // Product category ] ], [ 'class' => Slug::className(), 'in_attribute' => 'name', 'out_attribute' => 'alias', 'translit' => true ] ]; } /** * @inheritdoc */ public static function tableName() { return '{{%product}}'; } /** * @inheritdoc */ public function rules() { return [ [['brand_id'], 'integer'], [['name'], 'string', 'max' => 150], [['alias'], 'string', 'max' => 250], [['categories', 'variants', 'options', 'imagesUpload'], 'safe'], [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif', 'maxFiles' => 50], [['description', 'video'], 'safe'], [['is_top', 'is_new'], 'boolean'], // [['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'), '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'), ]; } /** * @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']); } /** * @return \yii\db\ActiveQuery */ public function getImages() { return $this->hasMany(ProductImage::className(), ['product_id' => 'product_id']); } public function setImages($images) { $this->_images = $images; } /** * @return \yii\db\ActiveQuery */ public function getVariant() { 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 empty($this->brand) ? $this->name : $this->brand->name .' '. $this->name; } public function getCategories() { return $this->hasMany(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']); // return $this->getRelations('product_categories'); } public function getCategoriesNames() { $result = []; foreach($this->categories as $category) { $result[] = $category->name; } return $result; } public function getCategory() { return $this->hasOne(Category::className(), ['category_id' => 'category_id'])->viaTable('product_category', ['product_id' => 'product_id']); } public function getOptions() { return $this->getRelations('product_option'); } /** * @inheritdoc * @return ProductQuery the active query used by this AR class. */ public static function find() { return new ProductQuery(get_called_class()); } public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); // $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/images/products/original/' . $image->baseName .'_'. uniqid() . '.' . $image->extension))); // } // // // } $todel = []; foreach ($this->variants ? : [] as $_variant) { $todel[$_variant->product_variant_id] = $_variant->product_variant_id; } 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->save(); } if (!empty($todel)) { ProductVariant::deleteAll(['product_variant_id' => $todel]); } } public function imagesUpload() { if ($this->validate()) { $images = []; foreach ($this->imagesUpload as $image) { $imageName = $image->baseName .'.'. $image->extension; $i = 0; while(file_exists(Yii::getAlias('@frontend/web/images/products/' . $imageName))) { $i++; $imageName = $image->baseName .'_'. $i .'.'. $image->extension; } $image->saveAs(Yii::getAlias('@frontend/web/images/products/' .$imageName)); $images[] = $imageName; } return $images; } else { return false; } } public function getImagesHTML() { $op = []; if ($this->images) { foreach ($this->images as $image) { $op[] = Html::img($image->imageUrl); } } 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; } }