channel 标签是 DedeCMS 中最核心、最常用的标签之一,用于获取并显示网站的所有栏目(包括顶级栏目和子栏目)。
channel 标签的基本语法
channel 标签的基本结构如下:
{dede:channel}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
{dede:channel}: 标签的开始,用于定义一个循环。[/dede:channel]: 标签的结束。[field:typeurl/]: 循环体内使用的字段,表示当前栏目的链接地址。[field:typename/]: 循环体内使用的字段,表示当前栏目的名称。
常用属性详解
channel 标签可以通过多种属性来精确控制输出的内容。
typeid (指定栏目ID)
这是最常用的属性,用于指定从哪个栏目开始调用。
- 不使用
typeid: 默认调用网站所有的一级栏目(顶级栏目)。 - 使用
typeid: 调用指定栏目及其所有下级栏目。
示例: 调用栏目ID为 2 的栏目及其所有子栏目。
{dede:channel typeid='2'}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
type (栏目类型)
用于指定调用栏目的类型,通常与 reid (父栏目ID) 配合使用。
son: 调用指定栏目 (typeid) 的直接子栏目。self: 调用指定栏目 (typeid) 本身。top: 调用所有顶级栏目(不包含子栏目)。grandson: 调用指定栏目 (typeid) 的所有下级栏目(包括子栏目和孙栏目)。
示例: 假设栏目ID为 2 的栏目下有子栏目 3 和 4。
{dede:channel typeid='2' type='son'}: 只会调用栏目 3 和 4。{dede:channel typeid='2' type='grandson'}: 会调用栏目 3、4 以及 3 和 4 的所有子栏目。
row (调用条数)
限制输出的栏目数量。
示例: 只调用前 5 个顶级栏目。
{dede:channel row='5'}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
currentstyle (当前栏目样式)
用于为当前所在页面对应的栏目链接添加一个特殊的样式(比如高亮)。
示例:
如果当前页面是这个栏目,链接会加上 class="active"。
{dede:channel currentstyle="<a href='~typelink~' class='active'>~typename~</a>"}
<a href='[field:typeurl/]'>[field:typename/]</a>
{/dede:channel}
~typelink~: 会被替换为[field:typeurl/]。~typename~: 会被替换为[field:typename/]。
常用字段 (Fields)
在 {dede:channel} 循环体内,可以使用以下字段来获取栏目的详细信息:
| 字段名 | 说明 |
|---|---|
[field:id/] |
栏目的ID |
[field:typename/] |
栏目的名称 |
[field:typeurl/] |
栏目的链接地址 (会自动判断是列表页还是跳转链接) |
[field:typedir/] |
栏目的目录地址 (物理路径) |
[field:seotitle/] |
栏目的SEO标题 |
[field:description/] |
栏目的描述 |
[field:ishidden/] |
栏目是否隐藏 (0=否, 1=是) |
[field:isdefault/] |
是否为默认栏目 (0=否, 1=是) |
综合实例
实例1:调用网站所有顶级栏目(导航栏)
这是最常见的导航栏实现方式。
<div class="nav">
<ul>
{dede:channel}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
实例2:调用指定栏目的直接子栏目(产品”栏目的分类)
假设“产品”栏目的ID是 2。
<div class="product-category">
<h3>产品分类</h3>
<ul>
{dede:channel typeid='2' type='son'}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
实例3:带当前栏目高亮的导航栏
这个例子非常实用,能自动高亮用户正在访问的栏目。
<div class="nav">
<ul>
{dede:channel
type='top'
currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"
}
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
注意:这里使用了 这个稍微复杂一点,需要嵌套使用 说明: 栏目类型为“外部链接”:
如果一个栏目在后台设置为了“外部链接”(链接到其他网站), 栏目类型为“单页”:
如果栏目是“单页”类型, 栏目列表为空:
如果调用出的栏目列表为空,请检查: 希望这份详细的教程能帮助你完全掌握 DedeCMS 的 type='top' 来确保只调用顶级栏目,避免在多级菜单下出现重复高亮。currentstyle 会自动替换掉循环体中对应的 <li>
实例4:调用顶级栏目及其子栏目(二级下拉菜单)
channel
<div class="main-nav">
<ul>
{dede:channel type='top'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
{dede:channel type='son' typeid='[field:id]'}
<div class="sub-nav">
<a href="[field:typeurl/]">[field:typename/]</a>
</div>
{/dede:channel}
</li>
{/dede:channel}
</ul>
</div>
{dede:channel type='top'} 循环所有顶级栏目。{dede:channel type='son' typeid='[field:id]'} 循环其下的直接子栏目。[field:id] 是外层循环中顶级栏目的ID,它被传递给内层循环,作为 typeid 的值。
常见问题与注意事项
[field:typeurl/] 会输出你设置的链接地址,而不是 DedeCMS 的栏目链接。[field:typeurl/] 会指向该单页内容的详情页。
typeid 和 type 属性的组合是否正确。currentstyle 不生效:
typeid 的值是否正确,如果只调用了部分栏目,currentstyle 只会在这些被调用的栏目中生效。channel
