客服首页>建站教程>Dedecms>正文

Dedecms非官方功能增强之多个副分类

Dedecms系统默认支持一个副分类,也就是一篇文章除了其所属的频道分类外,还可以分属于另外一个栏目分类。问题是我们总是贪心的,一个并不够,多个就更好,我们有时候需要实现类似ecshop的商品多属性功能,比如一篇文章除了属于主分类外,我们还想它属于一个年份分类,同时还属于一个英文或拼音首字母分类。。。本文将讲述如何修改实现DEDE一个文章同时属于多个副分类的功能。(本文摘录自Dedecms官方论坛,作者羽山。)

本文针对DedecmsV5.1版本,一共需要作两处修改,缺一不可,并请务必在修改前做好备份,以防万一。

1、给dede_archives 表新建一个字段 typeid_any ,字段类型:varchar,长度:50

在 后台 -> 功能菜单 -> SQL命令运行器 中输入:
alter table dede_archives add column typeid_any varchar(50);
按确定执行即可。


2、打开 include/inc_arclist_view.php ,150行左右,找到如下代码

        if($cfg_list_son=='N'){
                $this->addSql .= " And (arc.typeid='".$this->TypeID."' or arc.typeid2='".$this->TypeID."') ";
        }else{
                $idlist = $this->TypeLink->GetSunID($this->TypeID,'',$this->Fields['channeltype'],true);
                if(ereg(',',$idlist)){   
                    $this->addSql .= " And (arc.typeid in ($idlist) Or arc.typeid2='{$this->TypeID}') ";
                }else{ 
                    $this->addSql .= " And (arc.typeid='{$this->TypeID}' Or arc.typeid2='{$this->TypeID}') ";
                }
        }

修改其中的sql语句,将
(arc.typeid='".$this->TypeID."' or arc.typeid2='".$this->TypeID."')
改为
(arc.typeid='".$this->TypeID."' or arc.typeid2='".$this->TypeID."' or arc.typeid_any like '%(".$this->TypeID.")%')


(arc.typeid in ($idlist) Or arc.typeid2='{$this->TypeID}')
改为
(arc.typeid in ($idlist) Or arc.typeid2='{$this->TypeID}' or arc.typeid_any like '%({$this->TypeID})%')


这句话的意思是,在dede_archives 表中找出typeid等于当前栏目id的文章
简单来说,就是当浏览某个栏目的时候(动态浏览),程序自动找出属于该栏目的文章。
dede源程序只有两个条件,就是typeid和typeid2,那么我们又加了一个条件,typeid_any
修改后使用了模糊查询,而且加了括号
也就是说 typeid_any 字段中的内容格式是 : (4)(34)(22)(11)
为什么加括号呢,就是为了更精准的匹配。

数据库和程序修改好以后
就在添加文章的页面,增加一个表单,来填写多个栏目id

这个方法是最简单的方法,有条件的用户可以改成复选框的形式,就不用手动填写栏目id了