DedeCMS中栏目与文章列表调用时排除指定栏目方法

云南的天空有一种静谧之美,在这片土地上就连时间都流淌得格外缓慢。东方刚露出第一抹红霞,小河像一位刚梳洗完毕的姑娘,对着镜子整理晨妆,面颊上飞出几片羞答答的红晕。

与在使用织梦的时候,我们大部分顶级栏目都需要把子栏目列表掉出来,常规的调用标签为:

	
	{dede:channelartlist}
	

调用出来的栏目为全部子栏目:

这样就能把当前顶级栏目下的子栏目给调用出来,同理,调用文章列表的标签为:

	
	 {dede:arclist row='10' orderby='rand' }
	

这样也可以实现调用某一属性的文章。

但是,网站是千变万化的,很多时候,我们在制作织梦的模版时,有些栏目或者某些栏目下的文章我们不想调用出来,比如“关于我们”、“联系方式”等不是持续更新的栏目,那么我们在使用channelartlist与arclist调用列表时就需要排除一些指定栏目,今天余斗就说说如何修改DedeCMS核心文件来实现调用栏目列表与文章列表调用时排除指定栏目,老规矩,修改之前接的备份好文件,以免出错。

一、channelartlist调用时排除指定栏目

首先找到 文件channelartlist.lib.php ,路径为\include\taglib\channelartlist.lib.php,查找$attlist,大概在第43行,将:

	
	$attlist = 'typeid|0,row|20,cacheid|';
	

修改为:

	
	$attlist = 'typeid|0,row|20,cacheid|,notypeid|0'; // 此处添加了一个所要排除typeid的参数—notypeid再查找;
	

添加的代码

再查找$dsql->SetQuery,大概在第78行。

	
	$dsql->SetQuery("Selectid,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath from `dede_arctype` where $tpsql order by sortrank asc limit $totalnum");
	

在这段代码上方加上:

	
	if($notypeid!=0) {
	         $tpsql = $tpsql."and not(id in($notypeid)) "; //否定指定ID
	  }
	

添加的代码

到此就添加了一个notypeid属性限制,调用时这样使用:

	
	  {dede:channelartlist notypeid='10'}
	

这样就排除了id为10的子栏目的调用:

notypeid还可以和typeid搭配使用,比如:

	
	  {dede:channelartlist typeid ='7' notypeid='8'}
	

这样就实现id为7的栏目中id为8的子栏目不调用。

二、arclist调用时排除指定栏目

arclist标签的typeid属性里把想显示文章的栏目ID全部设置上,但这样做栏目ID太多的话,维护起来很麻烦,我们需要添加一个notypeid标签。

首先打开arclist.lib.php文件,路径为/include/taglib/arclist.lib.php文件,查找return lib_arclistDone,大概在130行:

	
	  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')
	

添加后的代码

再查找function lib_arclistDone,大概在第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
	

添加后的代码

再查找$orwheres[] = ' arc.arcrank > -1 ';,大概在第321行:

	
	 $orwheres[] = ' arc.arcrank > -1 ';
	

在这段代码下面加上代码:

	
	if(!empty($notypeid))
	{
	    $orwheres[] = " and arc.typeid NOT IN (".GetSonIds($notypeid).")";
	}
	

添加后的代码

这样,DedeCMS的核心代码就修改完毕,保存之后,我们在arclist标签里试试看notypeid属性,代码为:

	
	{dede:arclist row='10' orderby='rand' notypeid='10'}
	

不仅仅可以限制一个id,还可以实现多个id限制:

	
	{dede:arclist row='10' orderby='rand' notypeid='10,11,12'}
	

以上就是栏目调用的文章列表调用的时候排除某个或几个栏目的实现方法,希望这篇好代码教程能帮助有需要的人,如果你看完这篇好代码教程还有什么疑问,欢迎给余斗留言。