#@__arctype表添加一个名为pidpath的字段,用于存储每个分类的父级路径。在模板中使用递归函数来获取无限子分类。,,具体步骤如下:,,1. 修改数据库结构,为
#@__arctype表添加pidpath字段。,2. 修改/include/channelunit.func.php文件,添加一个名为GetSonIdList()的函数,用于获取子分类ID列表。,3. 修改/templets/default/channel_list.htm文件,使用递归函数调用GetSonIdList()函数来获取无限子分类。,,以下是具体的代码示例:,,1. 修改数据库结构:,,“sql,ALTER TABLE #@__arctype ADD pidpath VARCHAR(255) NOT NULL;,`,,2. 修改/include/channelunit.func.php文件,添加GetSonIdList()函数:,,`php,function GetSonIdList($pid, $type = 'both', $recursion = false) {, global $dsql;, $result = array();, if ($recursion) {, $row = $dsql>GetOne("SELECT id, mid, pidpath FROM #@__arctype WHERE id='$pid'");, $result[] = $row['id'];, $result = array_merge($result, explode(',', $row['mid']));, } else {, $row = $dsql>GetOne("SELECT id, mid FROM #@__arctype WHERE pid='$pid' AND type='$type'");, $result[] = $row['id'];, $result = array_merge($result, explode(',', $row['mid']));, }, return $result;,},`,,3. 修改/templets/default/channel_list.htm文件,使用递归函数调用GetSonIdList()函数:,,`php,,`,,然后在模板中调用GetSubCategory()函数:,,`html,,,,“,,这样,你就可以在Dedecms 5.7中实现织梦栏目获取无限子分类了。
在织梦CMS(DedeCMS)中获取无限子分类是一项常见需求,尤其是在构建具有多层级分类的企业网站时,以下是详细的修改方法,适用于DedeCMS 5.7版本:


修改文件
1、打开/include/taglib/channerl.lib.php文件:
找到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=$dsql2>GetArray()) {
$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'],$dsql3));
}
}
}
$likeType .= $dtp2>GetResult();
}
if($col>1) $likeType .= "</dd>r
";
}//Loop Col
if($col>1) {
$i += $col 1;
$likeType .= " </dl>r
";
}
保存并关闭文件。
调用标签
1、模板文件中的调用:
在模板文件中,使用以下标签来调用子栏目:


[field:sonchannel0/] [/field:sonchannel0]
根据需要,可以嵌套使用多个标签以显示多级子栏目:
[field:sonchannel1/] [/field:sonchannel1]
[field:sonchannel2/] [/field:sonchannel2]
[field:sonchannel3/] [/field:sonchannel3]
示例如下:
<ul id="left_nav">
{dede:channel type='son' typeid='16'}
<li><a href="[field:typelink/]">[field:typename/]</a>
<ul>
[field:sonchannel0/] [/field:sonchannel0]
<li><a href="[field:typelink/]">[field:typename/]</a>
<ul>
[field:sonchannel1/] [/field:sonchannel1]
<li><a href="[field:typelink/]">[field:typename/]</a>
<ul>
[field:sonchannel2/] [/field:sonchannel2]
<li><a href="[field:typelink/]">[field:typename/]</a>
<ul>
[field:sonchannel3/] [/field:sonchannel3]
</ul>
</li>
[/field:sonchannel2]
</ul>
</li>
[/field:sonchannel1]
</ul>
</li>
{/dede:channel}
</ul>
将上述代码中的typeid='16'替换为你的大分类ID。
注意事项
1、备份文件:在修改任何文件之前,请确保已经备份原始文件,以防出现问题时能够恢复。
2、引号问题:注意代码中的引号是否为全角或半角,确保使用正确的引号以避免错误。
3、测试:完成修改后,请在本地环境中进行测试,确保功能正常后再上传到生产环境。


FAQs
1. 为什么需要修改/include/taglib/channerl.lib.php文件?
这是因为DedeCMS默认只支持一级子分类的调用,通过修改该文件可以实现对无限子分类的支持,修改后的文件能够递归地获取并处理子分类数据。
2. 如何避免嵌套标签解析错误?
为了避免嵌套标签解析错误,建议使用“sonchannel+数字”作为标签名,[field:sonchannel0/]用于第一级子分类,[field:sonchannel1/]用于第二级子分类,依此类推,这样可以确保标签在嵌套使用时能够正确解析和显示。




