Project.php 6.19 KB
<?php
    
    namespace common\models;
    
    use common\modules\language\behaviors\LanguageBehavior;
    use common\modules\product\models\ProductVariant;
    use yii\db\ActiveQuery;
    use yii\db\ActiveRecord;
    use yii\web\Request;
    
    /**
     * This is the model class for table "project".
     * @property integer            $project_id
     * @property integer            $date_add
     * @property ProjectImage[]     $images
     * @property ProjectImage       $image
     * @property array              $imagesConfig
     * @property ProductVariant[]   $variants
     * @property ProductToProject[] $productToProject
     * * From language behavior *
     * @property ProjectLang        $lang
     * @property ProjectLang[]      $langs
     * @property ProjectLang        $object_lang
     * @property string             $ownerKey
     * @property string             $langKey
     * @method string           getOwnerKey()
     * @method void             setOwnerKey( string $value )
     * @method string           getLangKey()
     * @method void             setLangKey( string $value )
     * @method ActiveQuery      getLangs()
     * @method ActiveQuery      getLang( integer $language_id )
     * @method ProjectLang[]    generateLangs()
     * @method void             loadLangs( Request $request, ActiveRecord[] $model_langs )
     * @method bool             linkLangs( ActiveRecord[] $model_langs )
     * @method bool             saveLangs( ActiveRecord[] $model_langs )
     * * End language behavior *
     */
    class Project extends \yii\db\ActiveRecord
    {
        
        public $imagesUpload = [];
        
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return 'project';
        }
        
        /**
         * @inheritdoc
         */
        public function behaviors()
        {
            return [
                'language' => [
                    'class' => LanguageBehavior::className(),
                ],
            ];
        }
        
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [
                    [ 'date_add' ],
                    'default',
                    'value' => function() {
                        return time();
                    },
                ],
                [
                    [
                        'date_add',
                        'imagesUpload',
                    ],
                    'safe',
                ],
                [
                    [
                        'title',
                        'link',
                    ],
                    'string',
                    'max' => 255,
                ],
                [
                    [ 'date_add' ],
                    'filter',
                    'filter' => function($value) {
                        return strtotime($value) ? : time();
                    },
                ],
            ];
        }
        
        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'project_id'  => 'Project ID',
                'title'       => 'Title',
                'link'        => 'Link',
                'description' => 'Description',
                'date_add'    => 'Date Add',
                'images'      => 'Images',
            ];
        }
        
        public function getImages()
        {
            return $this->hasMany(ProjectImage::className(), [ 'project_id' => 'project_id' ]);
        }
        
        public function getImage()
        {
            return $this->hasOne(ProjectImage::className(), [ 'project_id' => 'project_id' ]);
        }
        
        public function getImagesHTML()
        {
            $op = [];
            if($this->images) {
                foreach($this->images as $image) {
                    $op[] = \common\components\artboximage\ArtboxImageHelper::getImage($image->imageUrl, 'admin_thumb');
                }
            }
            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([
                            '/project/delimg',
                            'id' => $image->project_image_id,
                        ]),
                        'key'     => $image->project_image_id,
                        'extra'   => [
                            'id' => $image->project_image_id,
                        ],
                    ];
                }
            }
            return $op;
        }
        
        public function imagesUpload()
        {
            if($this->validate()) {
                $images = [];
                foreach($this->imagesUpload as $image) {
                    $imageName = $image->baseName . '.' . $image->extension;
                    $i = 0;
                    while(file_exists(\Yii::getAlias('@storage/projects/' . $imageName))) {
                        $i++;
                        $imageName = $image->baseName . '_' . $i . '.' . $image->extension;
                    }
                    $imgDir = \Yii::getAlias('@storage/projects/');
                    if(!is_dir($imgDir)) {
                        mkdir($imgDir, 0755, true);
                    }
                    
                    $image->saveAs($imgDir . $imageName);
                    $images[] = $imageName;
                }
                return $images;
            } else {
                return false;
            }
        }
        
        public function getProductToProject()
        {
            return $this->hasMany(ProductToProject::className(), [
                'project_id' => 'project_id',
            ]);
        }
        
        public function getVariants()
        {
            return $this->hasMany(ProductVariant::className(), [ 'product_variant_id' => 'product_variant_id' ])
                        ->viaTable('product_to_project', [ 'project_id' => 'project_id' ]);
        }
    }