DEDECMS中获取无限栏目子分类的方法
在企业网站开发过程中,使用DEDECMS(织梦内容管理系统)时,通常会遇到需要展示多级栏目分类的情况,DEDECMS默认只能调用一级分类,这对于有四级分类需求的项目来说显然不够,为了实现无限栏目子分类的显示,可以通过修改系统文件来达到目的,以下是具体步骤和方法:
修改/include/taglib/channerl.lib.php文件
需要对系统的/include/taglib/channerl.lib.php文件进行修改,以便支持无限级栏目子分类的调用。
function lib_channel(&$ctag,&$refObj) { global $_sys_globals,$envs,$dsql; $attlist = "typeid|0,reid|0,row|100,col|1,type|son,currentstyle|"; FillAttsDefault($ctag>CAttribute>Items,$attlist); extract($ctag>CAttribute>Items, EXTR_SKIP); $innertext = $ctag>GetInnerText(); if(empty($typeid) && $envs['typeid']!=0) { $typeid = $envs['typeid']; $reid = $envs['reid']; }else{ $reid=0; } if($type==”||$type==’sun’) $type=”son”; if($innertext==”) $innertext = GetSysTemplets("channel_list.htm"); if($reid==0 && $typeid>0) { $dbrow = $dsql>GetOne("Select reid From ying_arctype where id='$typeid' "); if(is_array($dbrow)) $reid = $dbrow['reid']; } $likeType = ”; if($type==’top’) { $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description From ying_arctype where reid=0 And ishidden<>1 order by sortrank asc limit 0,$row”; } else if($type==”son”) { if($typeid==0) { return ”; } $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description From ying_arctype where reid='$typeid' And ishidden<>1 order by sortrank asc limit 0,$row”; } else if($type==”self”) { if($reid==0) { return ”; } $sql = “Select id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,sitepath,description From ‘ying_arctype’ where reid='$reid' And ishidden<>1 order by sortrank asc limit 0,$row”; } $dtp2 = new DedeTagParse(); $dtp2>SetNameSpace(“field”,”[”,"]“); $dtp2>LoadSource($innertext); $dsql2 = clone $dsql; $dsql>SetQuery($sql); $dsql>Execute(); $line = $row; $GLOBALS['autoindex'] = 0; for($i=0;$i < $line;$i++) { if($col>1) $likeType .= “<dl>r ”; for($j=0;$j<$col;$j++) { if($col>1) $likeType .= “<dd>r ”; if($row=$dsql>GetArray()) { if($type==’self’ && $row[‘id’]==$typeid) { //处理同级栏目中,当前栏目的样式 if($currentstyle!=”) { $linkOkstr = $currentstyle; $row[‘typelink’] = GetOneTypeUrlA($row); $linkOkstr = str_replace(“~typelink~”,$row[‘typelink’],$linkOkstr); $linkOkstr = str_replace(“~typename~”,$row[‘typename’],$linkOkstr); $likeType .= $linkOkstr; } }else { $row[‘typelink’] = $row[‘typeurl’] = GetOneTypeUrlA($row); if(is_array($dtp2>CTags)) { foreach($dtp2>CTags as $tagid=>$ctag){ if(isset($row[$ctag>GetName()])) { $dtp2>Assign($tagid,$row[$ctag>GetName()]); } elseif (preg_match(‘/^sonchannel[09]*$/’,$ctag>GetName())) { $dtp2>Assign($tagid,lib_channel_son($ctag,$row[‘id’],$dsql2)); } } } } } if($col>1) $likeType .= “</dd>r ”; }//Loop Col if($col>1) $i += $col – 1; $likeType .= ” </dl>r ”; }//Loop for $i reset($dsql3); $dsql2>FreeResult(); return $likeType; }
在模板中调用子分类标签
完成上述文件修改后,需要在模板中使用特定标签来调用子分类,可以使用以下格式:
<ul id="left_nav"> {dede:channel type='son' typeid='你的大分类ID'} <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel0] <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel1] <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel2] <li><a href="[field:typelink/]">[field:typename/]</a></li> [/field:sonchannel2] </ul> </li> [/field:sonchannel1] </ul> </li> [/field:sonchannel0] </ul> </li> {/dede:channel} </ul>
将上述代码中的typeid='你的大分类ID'
替换为实际的大分类ID即可,通过这种方式,可以实现无限层级的子分类调用。
FAQs
1、Q: DEDECMS中如何调用二级子分类?
A: 要在DEDECMS中调用二级子分类,可以在模板中使用如下代码:
<ul id="left_nav"> {dede:channel type='son' typeid='你的大分类ID'} <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel0] <li><a href="[field:typelink/]">[field:typename/]</a></li> [/field:sonchannel0] </ul> </li> {/dede:channel} </ul>
这样可以实现二级子分类的调用。
2、Q: 如果需要调用更多层级的子分类怎么办?
A: 如果需要调用更多层级的子分类,可以继续嵌套使用[field:sonchannelX]
标签,其中X
是子分类的层级编号。
<ul id="left_nav"> {dede:channel type='son' typeid='你的大分类ID'} <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel0] <li><a href="[field:typelink/]">[field:typename/]</a> <ul> [field:sonchannel1] <li><a href="[field:typelink/]">[field:typename/]</a></li> [/field:sonchannel1] </ul> </li> [/field:sonchannel0] </ul> </li> {/dede:channel} </ul>
通过不断增加sonchannel
的层级,可以实现更多层级的子分类调用。
序号 | 方法名称 | 描述 | 示例代码 |
1 | 获取顶级栏目子分类 | 获取指定顶级栏目的所有子分类 | get_top_column_children($cid) |
2 | 获取指定栏目所有子分类 | 获取指定栏目的所有子分类,包括嵌套子分类 | get_category_children($cid) |
3 | 遍历所有栏目及其子分类 | 遍历所有栏目及其所有子分类,包括嵌套子分类 | get_all_category_children() |
4 | 获取栏目路径 | 获取指定栏目的路径,包括其所有父栏目 | get_category_path($cid) |
5 | 获取栏目信息 | 获取指定栏目的详细信息,包括子分类信息 | get_category_info($cid) |
6 | 构建无限分类列表 | 构建一个包含所有栏目及其子分类的无限分类列表 | category_list($category_data, $level = 0) |
注意:以上代码示例仅供参考,实际使用时可能需要根据DEDECMS的版本和具体实现进行调整。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1210211.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复