123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- /**
- * Created by PhpStorm.
- * User: 中闽 < 1464674022@qq.com >
- * Date: 2019/12/5
- * Time: 17:44
- */
- namespace app\common\model;
- use file\PathHelper;
- use think\Exception;
- use think\Model;
- class Article extends Model
- {
- const STATUS_OPEN = 1;
- const STATUS_CLOSE = 0;
- //description
- public function getDescriptionAttr($value, $data)
- {
- if (empty($data['seo_description'])) {
- //尝试从文章内容提取描述,去掉HTML及PHP标记
- return strip_tags(subStrCN($data['content'], 200));
- }
- return $data['seo_description'];
- }
- //get_seo_title
- public function getGetSeoTitleAttr($value, $data)
- {
- if (empty($data['seo_title'])) {
- return $data['title'];
- }
- return $data['seo_title'];
- }
- //content
- public function getContentAttr($value, $data)
- {
- if ($this->article_editor == 'markdown') {
- return $data['content2'];
- }
- return $value;
- }
- /**
- * 获取缩略图
- * @param $host bool/string 可指定域名,默认当前域名
- * @return bool|mixed|string
- */
- public function getThumb($host = true)
- {
- if ($this->thumb) {
- return geturl($this->thumb, '', $host);
- } else {
- //尝试从内容中提取图片
- if (empty($this->content)) {
- return "";
- }
- $imgs = matchImg($this->content);
- return count($imgs) == 0 ? "" : url($imgs[0], '', false, $host);
- }
- }
- /**
- * 按规则生成路径
- * @param $catalogPath [uri使用相对路径,生成文件用物理路径]
- * @param $rule [文章路径规则]
- * @return mixed
- * @throws \Exception
- */
- public function getRulePath($catalogPath, $rule)
- {
- if (empty($rule)) {
- throw new Exception("null articleRule error");
- }
- $rule = replaceDS($rule);//处理分隔符
- $time = $this->getData('create_time');
- $search = ["{cpath}", "{Y}", "{M}", "{D}", "{aid}", "{cid}", "{tid}", "{tpath}"];
- $replace = [
- PathHelper::getDir($catalogPath),
- date('Y', $time),
- date('m', $time),
- date('d', $time),
- $this->filename ?: $this->id,
- $this->catalog_id,
- $this->article_cate_id,
- $this->article_cate_id && $this->cate ? $this->cate->tpath() : "",
- ];
- $rulePath = replaceDS(str_replace($search, $replace, $rule));
- if (ifContain($catalogPath, Templet::getRootDir())) {
- //生成操作时,处理路径不在根目录里的
- if (!ifContain($rulePath, Templet::getRootDir()))
- $rulePath = Templet::getRootDir() . deleteStartDS($rulePath);
- } else {
- //获取URI时,处理路径{aid}.html
- $rulePath = appendStartDS($rulePath);
- }
- return $rulePath;
- }
- /**
- * 获取文章uri
- * @param int $catalogId [文章设置了分类,且分类设置了多个栏目时,可指定栏目Id]
- * @return mixed|string
- * @throws \Exception
- */
- public function getUri($catalogId = 0)
- {
- if ($this->article_cate_id && $this->catalog_id) {
- throw new \Exception("文章不能同时发布到栏目和分类");
- }
- if ($this->article_cate_id) {
- if (empty($this->cate) || empty($this->cate->catalogs)) {
- throw new \Exception("文章{$this->id}找不到对应的栏目");
- }
- $catalogs = $this->cate->catalogs;
- //有多个栏目时,默认第一个栏目,排序最大的
- $catalog = $catalogs[0];
- //如果有指定 $catalogId ,则获取对应的栏目
- if ($catalogId && count($catalogs) > 0) {
- foreach ($catalogs as $catalog_) {
- if ($catalog_->id == $catalogId)
- $catalog = $catalog_;
- }
- }
- } elseif ($this->catalog_id) {
- $catalog = $this->catalog;
- } else {
- return "";
- }
- return replaceUrlDS($this->getRulePath($catalog->path, $catalog->article_rule));
- }
- /**
- * 当文章发布到多个栏目时,通过匹配路径获取文章uri
- * @param string $path_pattern
- * @return mixed|string
- */
- public function getUriByPattern($path_pattern = "/m/")
- {
- if ($this->article_cate_id) {
- $catalogs = $this->cate->catalogs;
- foreach ($catalogs as $catalog) {
- if (ifContain($catalog->path, $path_pattern)) {
- return $this->getUri($catalog->id);
- }
- }
- }
- return $this->getUri();
- }
- /**
- * 标签
- * @return array 数组
- */
- public function getTags()
- {
- if (empty($this->tag)) {
- return [];
- }
- return explode(',', $this->tag);
- }
- /**
- * 上一篇
- */
- public function last()
- {
- $where = [
- 'status' => self::STATUS_OPEN,
- 'article_cate_id' => $this->article_cate_id,
- 'catalog_id' => $this->catalog_id
- ];
- return $this->where("id", "<", $this->id)->where($where)->order('id desc')->find();
- }
- /**
- * 下一篇
- */
- public function next()
- {
- $where = [
- 'status' => self::STATUS_OPEN,
- 'article_cate_id' => $this->article_cate_id,
- 'catalog_id' => $this->catalog_id
- ];
- return $this->where("id", ">", $this->id)->where($where)->order('id asc')->find();
- }
- /**
- * 获取多个栏目属性集合
- */
- public function getCatalogValues($field = "title")
- {
- $catalogs = $this->cate->catalogs;
- if ($catalogs) {
- $name = [];
- foreach ($catalogs as $catalog) {
- $name[] = $catalog->getData($field);
- }
- return implode(',', $name);
- }
- return "";
- }
- //关联多栏目(通过分类发布到栏目时)
- public function catalogs()
- {
- if (empty($this->article_cate_id) && empty($this->catalog_id)) {
- throw new Exception("请先关联栏目或分类");
- }
- if (!$this->cate) {
- throw new Exception("文章{$this->id}找不到对应的分类");
- }
- if (!$this->cate->catalogs) {
- throw new Exception("文章{$this->id}找不到对应的栏目");
- }
- return $this->cate->catalogs;
- }
- //获取一个栏目(多栏目时)
- public function getFirstCatalog()
- {
- if (!$this->cate) {
- throw new Exception("文章{$this->id}找不到对应的分类");
- }
- $catalogs = $this->cate->catalogs;
- if (empty($catalogs)) {
- throw new Exception("文章{$this->id}找不到对应的栏目");
- }
- //有多个栏目时,默认第一个栏目,排序最大的
- return $catalogs[0];
- }
- //关联栏目(直接发布到栏目时)
- public function catalog()
- {
- return $this->belongsTo('Catalog');
- }
- //关联分类
- public function cate()
- {
- return $this->belongsTo('ArticleCate');
- }
- //发布人
- public function admin()
- {
- return $this->belongsTo('Admin');
- }
- //修改人
- public function editor()
- {
- return $this->belongsTo('Admin', 'edit_admin_id');
- }
- }
|