Product.php 5.71 KB
<?php

namespace common\modules\product\models;

use common\behaviors\Slug;
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
 * @property integer $brand_id
 * @property integer $product_id
 * @property Category $category
 * @property array $categories
 * @property ProductVariant $variant
 * @property ProductImage $image
 * @property array $images
 */
class Product extends \yii\db\ActiveRecord
{
    /** @var array $variants */
    public $_variants = [];

    /** @var array $_images */
    public $imagesUpload = [];
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => 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'], 'safe'],
//            [['imagesUpload'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'],
            [['description', 'video'], 'safe'],
//            [['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'),
        ];
    }

    /**
     * @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 $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;
    }

    public function getCategory() {
        /** @var ActiveQuery $categories */
        $categories = $this->getRelations('product_categories');
        $count = $categories->count();
        if ($count == 0)
            return;
        return $categories->one();
    }

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

//        foreach($this->imagesUpload as $image) {
//            $image->saveAs('/images/items/' . $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]);
        }
    }
}