首页 › 程序设计 › php

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

泡在网上的日子 / 文 发表于2012-04-15 20:00 次阅读 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'}
<li><a href="[field:arcurl/]" target="_blank">[field:title function=' (strlen("@me")>28 ? cn_substr("@me",28)."..." : "@me" ) '/]</a></li>  
{/dede:arclist}



收藏 赞 (0) 踩 (0)
上一篇:dedecms tag标签调用
dede tag标签用于显示系统文档内容中的TAG标记,我们在添加文章或者其他内容的时候会发现系统中有添加TAG这个选项
下一篇:比file_get_contents稳定的curl_get_contents函数
/*curl_get_contents函数比file_get_contents稳定的多!$timeout为超时时间,单位是秒,默认为1s。*/ function curl_get_contents($url,$timeout=1) { $curlHandle = curl_init(); curl_setopt( $curlHandle , CURLOPT_URL, $url ); curl_setopt( $curlHandl