当前位置:首页 > 行业动态 > 正文

如何在DEDECMS中获取无限级栏目的子分类?

DEDECMS中获取无限栏目子分类的方法可以通过递归函数实现。

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的版本和具体实现进行调整。

0