使用 {dede:channel} 标签(最常用)
{dede:channel} 标签主要用于获取单个栏目的信息,比如当前栏目的子栏目、同级栏目等,它非常适合用来制作网站的主导航栏。

基本语法
{dede:channel type='top' row='8'}
<a href='[field:typelink/]'>[field:typename/]</a>
{/dede:channel}
常用参数说明
type='top':这是最关键的参数,表示只调用顶级栏目,制作主导航时,这个参数是必须的。son:调用当前栏目的子栏目。self:调用当前栏目及其子栏目。top:调用顶级栏目。
row='8':表示调用的栏目数量,'8'代表调用8个顶级栏目,如果省略,默认调用所有顶级栏目。typeid='0':指定调用的栏目ID。'0'表示从根目录开始调用,通常在调用顶级栏目时可以省略。currentstyle='...':这是一个非常实用的参数,可以为当前所在的栏目(高亮显示的栏目)设置特殊的样式。
完整示例:制作一个带高亮效果的主导航
假设我们的导航栏HTML结构如下,我们希望当前页面对应的栏目链接文字变成红色。
<ul class="nav">
<li><a href="/">首页</a></li>
<li><a href="/a/about/" class="active">关于我们</a></li>
<li><a href="/a/news/">新闻中心</a></li>
<li><a href="/a/products/">产品展示</a></li>
<li><a href="/a/contact/">联系我们</a></li>
</ul>
在织梦模板中,我们可以这样写 代码解释: 这样,当用户访问“关于我们”页面时,对应的导航链接就会自动加上 假设我们的HTML结构如下: 在织梦模板中,我们可以这样实现: 进阶优化(判断是否有子菜单): 为了让只有子栏目的父级才显示 这段PHP代码会查询当前顶级栏目下是否有子栏目,如果有,就给 如何选择? 希望这个详细的教程能帮助你成功调用织梦的导航栏!如果在实际操作中遇到问题,可以检查一下栏目的栏目类型(是否为“栏目频道”)以及链接地址是否正确。{dede:channel}
<ul class="nav">
{dede:channel type='top' row='8'}
<li>
<a href="[field:typelink/]"
[field:typelink function='(@me=="$typelink")? "class=active" : ""'/]>
[field:typename/]
</a>
</li>
{/dede:channel}
</ul>
[field:typelink/]:输出栏目的链接地址。[field:typename/]:输出栏目的名称。[field:typelink function='(@me=="$typelink")? "class=active" : ""'/]:这是一个PHP函数判断。
@me:代表当前循环到的栏目的链接。$typelink:代表当前页面的链接(在列表页、内容页等页面中,这个变量是有效的)。? "class=active" : "":如果两者链接相等(说明当前正在访问这个栏目),就给 <a> 标签添加 class="active" 属性,否则为空。active 类,你就可以在CSS中定义 .active { color: red; } 来实现高亮效果。
使用
{dede:channelartlist}
{dede:channelartlist} 标签用于获取顶级栏目及其下的子栏目,通常用于制作带下拉菜单的导航栏。
基本语法
{dede:channelartlist}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</li>
{/dede:channelartlist}
标签解析
{dede:channelartlist}:这个标签会循环遍历所有的顶级栏目。
{dede:field name='typeurl'/}:获取当前顶级栏目的链接。{dede:field name='typename'/}:获取当前顶级栏目的名称。{dede:channel type='son' noself='yes'}:这个标签写在 {dede:channelartlist} 的内部,用于获取当前顶级栏目下的所有子栏目。
type='son':调用子栏目。noself='yes':不调用顶级栏目本身(因为上面已经调用了)。完整示例:制作一个带下拉菜单的导航
<ul class="nav">
<li>
<a href="/">首页</a>
</li>
<li>
<a href="/a/about/">关于我们</a>
<!-- 假设没有子菜单,这里可以为空 -->
</li>
<li class="dropdown">
<a href="/a/news/">新闻中心</a>
<ul class="subnav">
<li><a href="/a/news/gongsi/">公司动态</a></li>
<li><a href="/a/news/hangye/">行业资讯</a></li>
</ul>
</li>
<li>
<a href="/a/products/">产品展示</a>
<ul class="subnav">
<li><a href="/a/products/p1/">产品分类一</a></li>
<li><a href="/a/products/p2/">产品分类二</a></li>
</ul>
</li>
</ul>
<ul class="nav">
{dede:channelartlist}
<li>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
<!-- 只有当有子栏目时,才显示下拉菜单 -->
{dede:channel type='son' noself='yes'}
<ul class="subnav">
<li><a href="[field:typelink/]">[field:typename/]</a></li>
</ul>
{/dede:channel}
</li>
{/dede:channelartlist}
</ul>
dropdown 类,可以稍微修改一下:
<ul class="nav">
{dede:channelartlist}
<li [field:typelink runphp='yes'] global $dsql; $id = @me; $sql = "SELECT COUNT(*) FROM `dede_arctype` WHERE reid='$id'"; $row = $dsql->GetOne($sql); @me = ($row['COUNT(*)'] > 0) ? 'class="dropdown"' : ''; [/field:typelink]>
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
{dede:channel type='son' noself='yes'}
<ul class="subnav">
<li><a href="[field:typelink/]">[field:typename/]</a></li>
</ul>
{/dede:channel}
</li>
{/dede:channelartlist}
</ul>
<li> 添加 class="dropdown"。
总结与对比
特性
{dede:channel}{dede:channelartlist}
主要用途
调用单一层级的栏目(如主导航)
调用父子层级的栏目(如带下拉的导航)
循环方式
循环单个栏目列表
循环顶级栏目,并在内部循环子栏目
性能
较轻量
相对较重,因为会嵌套查询
灵活性
适合简单的列表和当前高亮
适合构建复杂的、有层级关系的导航结构
{dede:channel type='top'} 即可。{dede:channelartlist}。
