| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 | <?phpnamespace common\models;use common\behaviors\CategoryBehavior;use common\behaviors\CommentBehavior;use common\behaviors\MetaBehavior;use common\behaviors\PushBehavior;use common\behaviors\SoftDeleteBehavior;use common\behaviors\TagBehavior;use common\behaviors\VoteBehavior;use common\models\article\Base;use common\models\article\Exhibition;use common\models\query\ArticleQuery;use common\modules\attachment\behaviors\UploadBehavior;use common\modules\user\behaviors\UserBehavior;use Yii;use yii\base\InvalidParamException;use yii\behaviors\BlameableBehavior;use yii\behaviors\TimestampBehavior;/** * This is the model class for table "{{%article}}". * * @property int $id * @property int $sort * @property int $user_id * @property string $title * @property string $content * @property int $created_at * @property int $updated_at * @property int $status * @property int $category_id * @property string $category * @property string $cover * @property string $source * @property string $description * @property int $view * @property int $published_at * @property int $is_top * @property int $is_best * @property int $is_hot * @property string $module * @property string $city * @property string $address * @property string $tel * @property string $company * @property string $position * @property string $intro * @property string $chain * @property string $principal * @property boolean $isUp read-only * @property boolean $isDown read-only * @property boolean $isFavourite read-only * @property Base|Exhibition $data */class Article extends \yii\db\ActiveRecord{    const STATUS_PENDING = 0;    const STATUS_ACTIVE = 1;    /**     * {@inheritdoc}     */    public static function tableName()    {        return '{{%article}}';    }    /**     * {@inheritdoc}     */    public function rules()    {        return [            [['title', 'category_id'], 'required'],            [['title'], 'trim'],            [['status', 'category_id', 'view', 'is_top', 'is_hot', 'is_best', 'sort'], 'integer'],            [                'published_at', 'default', 'value' => function () {                return date('Y-m-d H:i:s', time());            }            ],            [                'published_at', 'filter', 'filter' => function ($value) {                return is_numeric($value) ? $value : strtotime($value);            }, 'skipOnEmpty' => true            ],            ['status', 'default', 'value' => self::STATUS_ACTIVE],            ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_PENDING]],            [['category_id'], 'setCategory'],            ['category_id', 'exist', 'targetClass' => Category::className(), 'targetAttribute' => 'id'],            [['title', 'category', 'city', 'tel'], 'string', 'max' => 50],            [['source', 'address'], 'string', 'max' => 255],            [['description'], 'string'],            [['category_id', 'status', 'view'], 'filter', 'filter' => 'intval'],            [['module'], 'string'],            [['cover', 'chain','address','company','position','intro','principal'], 'safe']        ];    }    public function setCategory($attribute, $params)    {        $this->category = Category::find()->where(['id' => $this->$attribute])->select('title')->scalar();    }    public static function getStatusList()    {        return [            self::STATUS_PENDING => '待审',            self::STATUS_ACTIVE => '通过',        ];    }    /**     * {@inheritdoc}     */    public function attributeLabels()    {        return [            'id' => Yii::t('common', 'ID'),            'title' => '名称',            'category_id' => '分类',            'category' => '分类',            'status' => '状态',            'view' => '浏览量',            'is_top' => '置顶',            'is_hot' => '热门',            'is_best' => '精华',            'description' => '摘要',            'user_id' => '作者',            'source' => '来源连接',            'deleted_at' => '删除时间',            'favourite' => '收藏数量',            'published_at' => '发布时间',            'created_at' => Yii::t('common', 'Created At'),            'updated_at' => Yii::t('common', 'Updated At'),            'module' => '文档类型',            'city' => '城市',            'address' => '地址',            'tel' => '联系方式',            'sort' => '排序',            'company' => '单位',            'position' => '职务',            'intro' => '简介',            'chain' => '产业链',            'principal' => '负责人',//            'cover' => '封面',//            'trueView' => '浏览量',//            'tagNames' => '标签',//            'content' => '内容'        ];    }    public function attributeHints()    {        return [            'tagNames' => '(空格分隔多个标签)'        ];    }    /**     * {@inheritdoc}     */    public function behaviors()    {        $behaviors = [            TimestampBehavior::className(),            PushBehavior::className(),            [                'class' => SoftDeleteBehavior::className(),                'softDeleteAttributeValues' => [                    'deleted_at' => function ($model) {                        return time();                    }                ],                'restoreAttributeValues' => [                    'deleted_at' => null                ],                'invokeDeleteEvents' => false // 不触发删除相关事件            ],            CategoryBehavior::className(),            [                'class' => MetaBehavior::className(),                'entity' => __CLASS__            ],            [                'class' => VoteBehavior::className(),                'entity' => __CLASS__            ],            TagBehavior::className(),            [                'class' => CommentBehavior::className(),                'entity' => __CLASS__            ],            [                'class' => UploadBehavior::className(),                'attribute' => 'cover',                'entity' => __CLASS__            ],            UserBehavior::className()        ];        if (!Yii::$app->request->isConsoleRequest) {            $behaviors[] = [                'class' => BlameableBehavior::className(),                'createdByAttribute' => 'user_id',                'updatedByAttribute' => false            ];        }        return $behaviors;    }    /**     * @inheritdoc     * @return ArticleQuery the newly created [[ActiveQuery]] instance.     */    public static function find()    {        return Yii::createObject(ArticleQuery::className(), [get_called_class()]);    }    /**     * @return array     */    public function transactions()    {        return [            self::SCENARIO_DEFAULT => self::OP_ALL,        ];    }    public function afterDelete()    {        parent::afterDelete();        // 删除文章内容//        $content = $this->data;//        if ($content != null) {//            $content->delete();//        }    }    public function getMetaData()    {        $model = $this->getMetaModel();        $title = $model->title ?: $this->title;        $keywords = $model->keywords ?: $this->getTagNames(',');        $description = $model->description ?: $this->description;        return [$title, $keywords, $description];    }    public function getData()    {        $moduleClass = $this->findModuleClass($this->module);        return new $moduleClass;//        return $this->hasOne($moduleClass, ['id' => 'id']);    }    /**     * 真实浏览量     */    public function getTrueView()    {        return $this->view + \Yii::$app->cache->get('article:view:' . $this->id);    }    /**     * 增加浏览量     */    public function addView()    {        $cache = \Yii::$app->cache;        $key = 'article:view:' . $this->id;        $view = $cache->get($key);        if ($view !== false) {            if ($view >= 20) {                $this->updateCounters(['view' => $view + 1]);                $cache->delete($key);            } else {                $cache->set($key, ++$view);            }        } else {            $cache->set($key, 1);        }    }    /**     * 当前用户是否收藏     * @return bool     */    public function getIsFavourite()    {        if (!Yii::$app->user->isGuest) {            $userId = Yii::$app->user->id;            $favourite = Favourite::find()->where(['article_id' => $this->id, 'user_id' => $userId])->one();            if ($favourite) {                return true;            }        }        return false;    }    public function getIsReprint()    {        return !empty($this->source);    }    public function findModuleClass()    {        $class = new \ReflectionClass(get_called_class());        $moduleClass = $class->getNamespaceName() . '\\article\\' . ucfirst($this->module);        // 找父类        if (!class_exists($moduleClass)) {            $parentClass = $class->getParentClass();            $moduleClass = $parentClass->getNamespaceName() . '\\article\\' . ucfirst($this->module);        }        if (!class_exists($moduleClass)) {            throw new InvalidParamException('文章类型不存在');        }        return $moduleClass;    }    public function beforeSave($insert)    {        if (parent::beforeSave($insert)) {            if (!empty($this->chain) && is_array($this->chain)) {                $this->chain = implode(',', $this->chain);            }            return true;        } else {            return false;        }    }}
 |