dedecms中如何让专题不显示在文章列表中
dede的对专题的构思有很多好的方面,但是也有不合理的地方,比如专题的处理。
在dede中专题会默认显示在文章列表中,多数时候我们是不希望这样的,设置专题就是为了和普通文章区分开来。
但是dede默认是要这样显示的。那么我们可以来改arclist标签对应的php文件。
处理arclist文章列表的标签对应的php文件是文件\include\taglib\arclist.lib.php。
然后找到查询文章列表的sql语句,经过仔细的分析,初步认为设置查询语句条件是在lib_arclistDone()函数的$orwhere变量里面。在文件中搜索orwhere,发现orwhere其实是一个数组 $orwheres = array();,这个数组是这样赋值的: $orwheres[] = " And arc.channel !=-1",先判断标签属性,如果有某某标签需要更改查询条件,就用这种方式将限制条件的字符串保存在
orwheres里面,在最后将整个数组用join函数连在一起,结合其他变量形成sql语句。在lib_arclistDone函数中是这样做的
if(isset($orwheres[0])) {
$orwhere = join(' And ',$orwheres);
$orwhere = preg_replace("#^ And#is", '', $orwhere);
$orwhere = preg_replace("#And[ ]{1,}And#is", 'And ', $orwhere);
}
if($orwhere!='') $orwhere = " WHERE $orwhere ";
上面这段代码形成 where查询条件
然后sql语句是这样的:
$query = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
$addfieldsSql
FROM `$maintable` arc LEFT JOIN `jcode_arctype` tp on arc.typeid=tp.id
$addfieldsSqlJoin
$orwhere $ordersql $limitsql";
弄清楚了查询文章的sql语句在哪里,我们就很好修改了,不是要取消默认专题被显示的功能么,我们都知道所有专题都有个channel字段,该字段为-1就表示为专题,那么我们只需在orwheres里面加上这个条件就行了。
$orwheres[] = " And arc.channel !=-1";
但是我们还需要考虑到,有些地方是需要显示专题列表的,仅仅这样做,会让需要专题的地方也显示不出来。
所以最终我决定这样写:
if(preg_match('#spec#i', $listtype))
$channelid=-1;
else
$orwheres[] = " And arc.channel !=-1";
if(!empty($channelid)) $orwheres[] = " And arc.channel = '$channelid' ";
把上面这段代码的位置放在大概该文件的305行的地方,需要注意的是不仅仅是增加代码而已,原有的代码还是有小小的改动,不过假如你读懂了我写的,你应该知道怎么改。如果你不放心,可以先保存再修改试试,不成功的话也不会有大的影响。
有了上面的代码,所有arclist标签默认情况下均不会显示专题。
如果需要显示专题的话需要这样写arclist标签:
{dede:arclist titlelen=42 row=10 type='spec'}