{dede:channel} 是一个功能强大的栏目列表标签,主要用于获取和显示网站的所有栏目或指定层级的栏目,通过使用它的 son 属性,我们可以精确地控制只显示当前栏目的直接子栏目。

(图片来源网络,侵删)
{dede:channel} 标签基础
我们来看一下这个标签的基本语法和常用属性。
基本语法
{dede:channel type='top' row='8'}
<a href='[field:typelink/]'>[field:typename/]</a>
{/dede:channel}
核心属性
-
typeid(栏目ID)- 作用: 指定要调用的栏目。
- 用法:
typeid='栏目ID',如果省略,则默认从当前栏目开始。 - 重要: 当使用
son属性时,typeid通常指定的是父栏目的ID。
-
type(栏目类型)- 作用: 定义调用栏目的范围。
- 常用值:
top: 仅调用顶级栏目,这是最常用的值之一,常用于网站主导航。son: 仅调用指定栏目(typeid)下的子栏目,这是实现“子栏目”调用的关键属性。self: 调用指定栏目(typeid)及其所有下级栏目(包括多级子栏目)。grandson: 调用指定栏目(typeid)下的所有二级子栏目。
-
row(调用数量)
(图片来源网络,侵删)- 作用: 设置要显示的栏目数量。
- 用法:
row='10',表示显示10个栏目。
-
currentstyle(当前栏目样式)- 作用: 为当前所在的栏目设置一个高亮样式。
- 用法:
currentstyle='<li class="active"><a href~</a></li>',当用户访问某个栏目时,该栏目链接会自动应用currentstyle中定义的HTML结构。
使用 son 属性调用子栏目
son 属性的核心功能是:在指定父栏目(typeid)下,只调用其直接子栏目(一级子栏目),不调用更深层次的栏目。
场景举例
假设你的网站栏目结构如下:
- 顶级栏目 (ID=1)
- 产品中心 (ID=2) -> 父栏目
- 产品分类一 (ID=3)
- 产品分类二 (ID=4)
- 产品分类三 (ID=5)
- 新闻资讯 (ID=6)
- 公司新闻 (ID=7)
- 行业动态 (ID=8)
- 产品中心 (ID=2) -> 父栏目
你希望在“产品中心”这个页面上,只显示它的三个直接子栏目(产品分类一、二、三)。
实现步骤
-
获取父栏目ID:
- 登录DedeCMS后台,在“栏目管理”中找到“产品中心”,记下它的ID,这里是
2。
- 登录DedeCMS后台,在“栏目管理”中找到“产品中心”,记下它的ID,这里是
-
编写模板代码:
- 在“产品中心”的栏目模板文件(通常是
templets/default/list_channel.htm或你自定义的模板)中,加入以下代码:
- 在“产品中心”的栏目模板文件(通常是
<h3>产品分类</h3>
<ul class="sub-category-list">
{dede:channel typeid='2' type='son' row='10'}
<li>
<a href="[field:typelink/]">[field:typename/]</a>
</li>
{/dede:channel}
</ul>
代码解析
{dede:channel ...}: 开始标签。typeid='2': 这是关键! 我们指定了父栏目“产品中心”的ID为2,标签会在这个ID的栏目下查找子栏目。type='son': 这是另一个关键! 它告诉标签,我们只需要调用typeid指定栏目的直接子栏目,即使“产品分类一”下面还有子栏目,它们也不会被显示出来。row='10': 最多显示10个子栏目,如果不足10个,则显示全部。<li><a href='[field:typelink/]'>[field:typename/]</a></li>: 循环体内的HTML代码。[field:typelink/]: 子栏目的链接地址。[field:typename/]: 子栏目的名称。
</ul>: 结束标签。
效果
当用户访问“产品中心”页面时,页面会输出如下HTML:
<h3>产品分类</h3>
<ul class="sub-category-list">
<li>
<a href="/plus/list.php?tid=3">产品分类一</a>
</li>
<li>
<a href="/plus/list.php?tid=4">产品分类二</a>
</li>
<li>
<a href="/plus/list.php?tid=5">产品分类三</a>
</li>
</ul>
高级用法与注意事项
结合 currentstyle 实现高亮
如果希望用户当前所在的子栏目能高亮显示,可以这样写:
{dede:channel typeid='2' type='son' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
- 工作原理: 当用户访问“产品分类二”(ID=4)时,DedeCMS会自动将
currentstyle中的 符号替换为对应的字段值,最终生成的HTML会是:<li><a href="/plus/list.php?tid=3">产品分类一</a></li> <li class="active"><a href="/plus/list.php?tid=4">产品分类二</a></li> <li><a href="/plus/list.php?tid=5">产品分类三</a></li>
- 注意:
currentstyle会替换掉循环体内的默认HTML,所以通常直接在currentstyle里写完整的<li>结构即可,而不需要再写一个默认的<li>。
调用顶级栏目(常用作主导航)
{dede:channel type='top' row='8'}
<a href="[field:typelink/]" [field:typename/]</a>
{/dede:channel}
调用当前栏目的所有下级栏目(包括多级)
如果你想在“产品中心”页面显示它下面所有层级的子栏目,应该使用 type='self'。
{dede:channel typeid='2' type='self'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
这会显示:产品分类一、产品分类二、产品分类三,以及它们各自下面的所有子栏目。
| 属性组合 | 功能描述 | 适用场景 |
|---|---|---|
typeid='父ID' type='son' |
调用指定父栏目的直接子栏目。 | 在栏目详情页、列表页调用其子栏目作为分类导航。 |
type='top' |
调用所有顶级栏目。 | 网站主导航、页脚栏目。 |
typeid='父ID' type='self' |
调用指定栏目及其所有下级栏目。 | 生成网站地图、面包屑导航的子级部分。 |
typeid='父ID' type='grandson' |
调用指定栏目的所有二级子栏目。 | 特殊的栏目布局需求。 |
掌握 {dede:channel} 的 typeid 和 type(特别是 son)属性,是进行 DedeCMS 栏目导航开发的基础和核心,希望这个详细的解释能帮助你更好地理解和使用它!
