[ 'class' => PositionBehavior::class, 'positionAttribute' => 'sort', 'groupAttributes' => [ 'product_id', ], ], 'timestamp' => [ 'class' => TimestampBehavior::class, ], ]; } /** * @inheritdoc */ public function rules() { return [ [ [ 'optionIds', ], 'safe', ], [ [ 'product_id', 'sku', 'stock', ], 'required', ], [ [ 'product_id', 'stock', 'sort', 'created_at', 'updated_at', ], 'integer', ], [ [ 'price', 'price_old', ], 'number', ], [ [ 'status' ], 'boolean', ], [ [ 'sku' ], 'string', 'max' => 255, ], [ [ 'product_id' ], 'exist', 'skipOnError' => true, 'targetClass' => Product::class, 'targetAttribute' => [ 'product_id' => 'id' ], ], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'product_id' => 'Product ID', 'sku' => \Yii::t('catalog', 'Sku'), 'price' => \Yii::t('catalog', 'Price'), 'price_old' => \Yii::t('catalog', 'Price Old'), 'stock' => \Yii::t('catalog', 'Stock'), 'status' => \Yii::t('catalog', 'Status'), 'sort' => \Yii::t('catalog', 'Sort'), 'created_at' => 'Created At', 'updated_at' => 'Updated At', 'image_id' => 'Image ID', ]; } public function getOptions() { return $this->hasMany(Option::class, [ 'id' => 'option_id' ]) ->viaTable('option_to_variant', [ 'variant_id' => 'id' ]); } public function getProduct() { return $this->hasOne(Product::class, [ 'id' => 'product_id' ]); } }