织梦默认的channelartlist标签的调用结果没有排除指定栏目的功能,但如果需要,我们可以自己通过修改文件来添加这样的功能,具体修改方法如下:
找到并打开/include/taglib/channelartlist.lib.php文件,
在里面找到$attlist(约43行),将
$attlist = 'typeid|0,row|20,cacheid|';
修改为:
$attlist = 'typeid|0,row|20,cacheid|,notypeid|0';
注:上面修改后的代码添加了一个所要排除typeid的参数notypeid
然后找到如下代码(约79行):
$dsql->SetQuery("Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath from `dede_arctype` where $tpsql order by sortrank asc limit $totalnum");
在其前面添加(注意是在前面添加):
//排除指定栏目ID
if($notypeid!=0) {
$tpsql = $tpsql."and not(id in($notypeid)) ";
}
修改完成后保存。
在模板里面可通过如下方法调用:
{dede:channelartlist typeid ='3' notypeid='14,15'}
其中notypeid='14,15'中的14,15为ID为3的栏目下的两个子栏目,这样就可以调用ID为3的栏目下除id为14和15的所有子栏目了。
---------------------------------------------------------
如果我要调用如下图中ID为5的栏目下所有子栏目中标记属性为头条(即flag='h')的文章,但又不想调用ID为12的子栏目中标记为头条的文章,那么怎么办?
下图还好,只有ID为12、13、14这3个子栏目,如果,我可以写{dede:arclist typeid='13,14' flag='h' row='1' titlelen='40' orderby='pubdate'}这样就不会调用ID为12的栏目了,但如果有100个子栏目呢,岂不是要写上100个,显示是不可取的。
其实,如果能够这样调用,达到我们的目标了:
{dede:arclist typeid='5' notypeid='12' flag='h' row='1' titlelen='40' orderby='pubdate'}
(上述代码中,表示调用ID为5的栏目下所有子栏目中标记属性为头条,但唯独不调取ID为12这个子栏目。)
只是,织梦arclist标签支持flag、noflag属性,但并不支持notypeid属性,那怎么办?自己写吧!
打开/include/taglib/arclist.lib.php文件,找这段代码(大概在129行):
return lib_arclistDone ( $refObj, $ctag, $typeid, $ctag->GetAtt('row'), $ctag->GetAtt('col'), $titlelen, $infolen, $ctag->GetAtt('imgwidth'), $ctag->GetAtt('imgheight'), $listtype, $orderby, $ctag->GetAtt('keyword'), $innertext, $envs['aid'], $ctag->GetAtt('idlist'), $channelid, $ctag->GetAtt('limit'), $flag,$ctag->GetAtt('orderway'), $ctag->GetAtt('subday'), $ctag->GetAtt('noflag'), $tagid,$pagesize,$isweight );
在最后的括号前面加上(注意下述代码中前面的逗号):
,$ctag->GetAtt('notypeid')
再找到这一段代码(大概在168行,不同版权织梦代码可能稍有差异):
function lib_arclistDone(&$refObj, &$ctag, $typeid=0, $row=10, $col=1, $titlelen=30, $infolen=160, $imgwidth=120, $imgheight=90, $listtype='all', $orderby='default', $keyword='', $innertext='', $arcid=0, $idlist='', $channelid=0, $limit='', $att='', $order='desc', $subday=0, $noflag='',$tagid='', $pagesize=0, $isweight='N',$notypeid=0)
在括号的最后面加上(注意下述代码中前面的逗号):
,$notypeid=0
最后再找到这一句:
$orwheres[] = ' arc.arcrank > -1 ';
在其前面增加以下代码:
if(!empty($notypeid)) {
$orwheres[] = " and arc.typeid NOT IN (".GetSonIds($notypeid).")";
}
这样,代码就修改完毕了,我们就可以在模板中通过{dede:arclist typeid='5' notypeid='12' flag='h' row='1' titlelen='40' orderby='pubdate'}调用ID为5的栏目下所有子栏目中标记属性为头条,但唯独不调取ID为12这个子栏目了。