您的位置:首页 > 其它

dedecms中如何让专题不显示在文章列表中

2012-04-16 15:10 232 查看
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'}

<li><a href="[field:arcurl/]" target="_blank">[field:title function=' (strlen("@me")>28 ? cn_substr("@me",28)."..." : "@me" ) '/]</a></li>  

{/dede:arclist}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: