123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- <?php
- namespace 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;
- }
- }
- }
|