下面我将为你提供几种常用场景的实现方法,并附上详细解释。

在当前栏目页(如 list_article_list.htm)调用其所有二级栏目
这是最常见的需求,比如在列表页的侧边栏显示当前栏目下的所有子栏目。
适用场景:
- 当前是“产品中心”栏目,想在列表页显示其所有子栏目,如“产品A”、“产品B”、“产品C”。
核心标签:{dede:channelartlist}
示例代码:

{dede:channelartlist typeid='top' currentstyle='active'}
<div class="sub-category">
<h3>{dede:field name='typename'/}</h3>
<ul>
{dede:channel type='son' noself='yes'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
</div>
{/dede:channelartlist}
代码详解:
-
{dede:channelartlist typeid='top' currentstyle='active'}typeid='top':这个参数非常重要,它告诉织梦从顶级栏目开始匹配,并找到当前栏目所在的顶级栏目及其所有子栏目,这样即使你在一个三级栏目下,也能正确显示其顶级父栏目下的所有二级栏目。currentstyle='active':可以给当前所在的栏目项添加一个特定的样式(class="active"),方便进行样式控制,这个样式会应用到<a>标签上。
-
{dede:field name='typename'/}- 这行代码会输出顶级父栏目的名称,如果当前栏目是“产品A”,那么这里输出的是“产品中心”。
-
{dede:channel type='son' noself='yes'}
(图片来源网络,侵删)- 这个标签是在
channelartlist的循环内部使用的,用于获取当前顶级父栏目下的所有子栏目(也就是二级栏目)。 type='son':指定调用类型为“子栏目”。noself='yes':排除掉顶级父栏目本身,只显示它的子栏目。
- 这个标签是在
页(如 article_article.htm)调用当前栏目的二级栏目
在文章页的面包屑导航或者侧边栏,你可能也想展示该文章所在栏目的同级(兄弟)栏目。
适用场景:
- 当前文章属于“产品A”栏目,想在文章页显示“产品中心”下的所有子栏目,即“产品A”、“产品B”、“产品C”。
核心思路:
在文章页,我们无法直接通过 channelartlist 获取父栏目信息,我们需要先获取当前栏目的顶级父栏目ID,然后再用这个ID去查找它的所有子栏目。
示例代码:
{dede:field name='typeid' function='GetTopid(@me)'/}
这行代码需要配合一个自定义函数来实现。
完整实现步骤:
第一步:在 /include/common.func.php 文件中添加自定义函数
打开 /include/common.func.php 文件,在文件末尾 ?> 之前,添加如下函数:
/**
* 获取当前栏目的顶级栏目ID
* @param int $typeid 当前栏目ID
* @return int 顶级栏目ID
*/
function GetTopid($typeid)
{
global $dsql;
$row = $dsql->GetOne("SELECT reid FROM `dede_arctype` WHERE id = $typeid");
if ($row['reid'] == 0) {
// 如果已经是顶级栏目
return $typeid;
} else {
// 递归查找顶级栏目
return GetTopid($row['reid']);
}
}
第二步:在文章模板文件 (article_article.htm) 中调用
现在你可以在文章模板中使用这个函数了。
{dede:field name='typeid' function='GetTopid(@me)'/}
这行代码会输出当前文章所在栏目的顶级父栏目ID,假设“产品中心”的ID是 5,那么这行代码就会输出 5。
第三步:使用获取到的顶级栏目ID调用其子栏目
将上一步得到的ID,通过 channelartlist 调用其子栏目。
{dede:channelartlist typeid='[field:typeid function="GetTopid(@me)"/]'}
<div class="related-category">
<h3>相关栏目</h3>
<ul>
{dede:channel type='son' noself='yes'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
</div>
{/dede:channelartlist}
这里我们使用了 typeid='[field:typeid function="GetTopid(@me)"/]' 的方式,直接在模板中完成函数调用和ID传递。
调用指定栏目的二级栏目
如果你想在任何地方(比如首页)调用某个特定栏目的所有二级栏目。
适用场景:
- 在网站首页的页脚,显示“关于我们”栏目的所有子栏目。
核心标签:{dede:channelartlist} + 指定 typeid
示例代码:
假设“关于我们”栏目的ID是 2。
{dede:channelartlist typeid='2'}
<h3>关于我们</h3>
<ul>
{dede:channel type='son' noself='yes'}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
{/dede:channelartlist}
这个方法和方法一类似,只是直接指定了 typeid 为目标栏目的ID,而不是让系统自动匹配。
| 需求场景 | 推荐方法 | 核心标签/代码 |
|---|---|---|
| 在当前栏目页调用其二级栏目 | 方法一 | {dede:channelartlist typeid='top'} + {dede:channel type='son'} |
| 页调用当前栏目的二级栏目 | 方法二 | 在 common.func.php 中添加 GetTopid() 函数,然后在模板中使用 {dede:channelartlist typeid='[field:typeid function="GetTopid(@me)"/]'} |
| 在任意位置调用指定栏目的二级栏目 | 方法三 | {dede:channelartlist typeid='目标栏目ID'} + {dede:channel type='son'} |
对于绝大多数情况,方法一已经足够解决你的问题,请根据你的具体页面和需求选择合适的方案。
