123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
- /**
- * Created by PhpStorm.
- * User: 中闽 < 1464674022@qq.com >
- * Date: 2019/12/5
- * Time: 17:44
- */
- namespace app\common\model;
- class Catalog extends Tree
- {
- protected $autoWriteTimestamp = false;
- const TYPE_CATALOG = 0;
- const TYPE_ARTICLE_LIST = 1;
- const TYPE_DIRECTORY = 2;
- const TYPES = [
- self::TYPE_DIRECTORY => '目录',
- self::TYPE_CATALOG => '栏目',
- self::TYPE_ARTICLE_LIST => '文章列表',
- ];
- //type_text 栏目类型
- public function getTypeTextAttr($value, $data)
- {
- return self::TYPES[$data['type']]??$data['type'];
- }
- //article_count 文章数量
- public function getArticleCountAttr($value, $data)
- {
- return $this->hasMany('Article')->where('status', Article::STATUS_OPEN)->count();
- }
- //article_cate_count 分类数量
- public function getArticleCateCountAttr($value, $data)
- {
- return $this->belongsToMany('ArticleCate', 'app\common\model\CateCatalog')->where('status', ArticleCate::STATUS_OPEN)->count();
- }
- /**
- * 栏目下拉数据
- */
- public function treelistForCatalog()
- {
- $catalogs = $this->where('type', self::TYPE_DIRECTORY)->order('sort asc,id')->select();
- return $this->treelist($catalogs);
- }
- /**
- * 文章下拉框数据
- */
- public function treelistForArticle()
- {
- $catalogs = $this->where(['type' => ['in', [self::TYPE_ARTICLE_LIST, self::TYPE_DIRECTORY]], 'status' => self::STATUS_OPEN])->order("tree_path")->select();
- $whileflag = true;
- while ($whileflag) {
- $count = 0;
- foreach ($catalogs as $key => $catalog) {
- if ($catalog->getData('type') == self::TYPE_DIRECTORY) {
- $flag = false;
- foreach ($catalogs as $key2 => $catalog2) {
- if ($catalog2->pid == $catalog->id) {
- $flag = true;
- break;
- }
- }
- if (!$flag) {
- $count++;
- unset($catalogs[$key]);
- }
- } else if ($catalog->articleCateCount) {
- $count++;
- unset($catalogs[$key]);
- }
- }
- if ($count == 0) {
- $whileflag = false;
- }
- }
- return $this->treelist2($catalogs);
- }
- /**
- * 栏目HTML生成路径
- * @return string
- */
- public function getRealPath()
- {
- return Templet::getRootDir() . deleteStartDS(replaceDS($this->tpath()));
- }
- /**
- * 发布路径
- * 如果存在上级目录,则拼接上级目录
- */
- public function tpath()
- {
- $tpath = "";
- if ($this->pid) {
- $pnode = $this->getDirectParentNode();
- if ($pnode && $pnode->tpath()) {
- $tpath = $pnode->tpath();
- }
- }
- $enname = $this->path;
- if ($tpath && $enname) {
- return $tpath . appendStartDS($enname, '/');
- } else {
- return $enname ?: $tpath;
- }
- }
- /**
- * 获取栏目uri
- * @return mixed
- */
- public function getUri()
- {
- return replaceUrlDS($this->getData('path'));
- }
- /**
- * 获取栏目模板
- * @return Templet|null
- */
- public function getCatalogTemplet()
- {
- return (new Templet)->setName($this->catalog_templet);
- }
- /**
- * 获取文章模板
- * @return Templet|null
- */
- public function getArticleTemplet()
- {
- return (new Templet)->setName($this->article_templet);
- }
- //关联分类
- public function articleCates()
- {
- return $this->belongsToMany('ArticleCate', 'app\common\model\CateCatalog')->where('status', ArticleCate::STATUS_OPEN)->order('sort desc');
- }
- //分类个数
- public function articleCateCount()
- {
- return $this->belongsToMany('ArticleCate', 'app\common\model\CateCatalog')->where('status', ArticleCate::STATUS_OPEN)->count();
- }
- /**
- * 获取一个分类
- * @return mixed
- * @throws \Exception
- */
- public function getFirstArticleCate()
- {
- $cates = $this->articleCates;
- if (empty($cates)) {
- throw new \Exception("栏目{$this->id}找不到对应的分类");
- }
- return current($cates);
- }
- }
|