场景说明
我们假设有如下的栏目结构:

- 一级栏目 A (ID=1)
- 二级栏目 A1 (ID=2)
- 二级栏目 A2 (ID=3)
- 一级栏目 B (ID=4)
- 二级栏目 B1 (ID=5)
- 二级栏目 B2 (ID=6)
当用户访问 二级栏目 A1 (ID=2) 的列表页或内容页时,我们希望:
- 一级栏目
A(ID=1) 保持高亮(这是 DedeCMS 自带功能)。 - 二级栏目
A1(ID=2) 也保持高亮。
修改 channel 标签(推荐,最常用)
这是最简单、最直接的方法,只需要修改模板文件,无需修改核心文件。
适用场景:主要用于在列表页模板 (list_article.htm) 中高亮当前栏目本身。
操作步骤:

-
找到你的列表页模板文件,通常位于
/templets/你的模板名称/目录下,文件名为list_article.htm。 -
在模板中找到调用一级子栏目的
channel标签,它通常看起来像这样:<ul class="nav"> {dede:channel type='son' typeid='1'} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} </ul>typeid='1'这里是你要高亮的一级栏目的ID。
-
修改这个
channel标签,为其添加一个currentstyle属性,这个属性定义了当栏目是当前栏目时,应该输出的 HTML 代码。<ul class="nav"> {dede:channel type='son' typeid='1' currentstyle="<li class='this'><a href='[field:typeurl/]'>[field:typename/]</a></li>"} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} </ul> -
解释:
currentstyle: 当循环到的栏目是当前页面所在的栏目时,DedeCMS 会输出currentstyle里的内容,而不是默认的<li><a href='...'>...</a></li>。class='this': 我们自定义了一个this类名,你可以在你的 CSS 文件中为这个类名定义高亮样式,.nav li.this a { color: #ff0000; /* 文字颜色变红 */ font-weight: bold; /* 字体加粗 */ background-color: #f0f0f0; /* 背景色变灰 */ }
效果:
当你在 二级栏目 A1 (ID=2) 的列表页时,上面的代码会自动将 二级栏目 A1 对应的 <li> 元素的 class 设置为 this,从而实现高亮。
通过获取当前栏目ID,在 channel 标签中判断
这个方法比方法一更灵活,可以同时处理列表页和内容页,并且可以高亮任意层级的父级。
适用场景:当你需要高亮当前栏目的所有父级,或者想在内容页也实现高亮时。
操作步骤:
-
在模板文件(如
list_article.htm或article_article.htm)的顶部,使用global标签获取当前栏目的ID。{dede:global name='typeid' function='htmlspecialchars(@me)'/}这行代码会输出当前页面的栏目ID。
-
修改你的
channel标签,使用typeid属性来指定从哪个栏目开始获取子栏目,并使用currentstyle。示例:高亮一级栏目 A 下的所有子栏目
<ul class="nav"> {dede:channel type='son' typeid='1' currentstyle="<li class='this'><a href='[field:typeurl/]'>[field:typename/]</a></li>"} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} </ul>这和方法一完全一样,但如果你想在内容页也实现同样的高亮,这个方法依然有效,因为
typeid在内容页页面也能正确获取到当前内容的栏目ID。
修改 include/typelink.class.php 文件(功能最强,但需修改核心)
如果你希望实现一个更“智能”的高亮,即不仅高亮当前栏目,还高亮它的所有父级路径(面包屑导航效果),这个方法可以实现。
适用场景:希望导航栏能像面包屑一样,完整地显示出当前栏目的层级路径。
警告:修改核心文件在 DedeCMS 升级时可能会被覆盖,请提前备份。
操作步骤:
-
备份文件
/include/typelink.class.php。 -
打开
typelink.class.php文件,找到GetChannelList()函数(大约在第 180 行左右)。 -
在函数内找到
$types[] = $row;这一行(可能在if($typeinfos['reid']==0)的条件分支里)。 -
在这行代码之前,添加如下代码:
// 高亮当前栏目及其父级 if($typeid > 0 && $row['id'] == $typeid){ $row['currentstyle'] = "<li class='this'><a href='{$row['typeurl']}'>{$row['typename']}</a></li>"; }else{ $row['currentstyle'] = "<li><a href='{$row['typeurl']}'>{$row['typename']}</a></li>"; } -
保存文件。
-
在你的模板文件中,调用栏目时就可以直接使用
currentstyle了,无需再写判断。<ul class="nav"> {dede:channel type='top' currentstyle="<li class='this'><a href='[field:typeurl/]'>[field:typename/]</a></li>"} <li><a href="[field:typeurl/]">[field:typename/]</a></li> {/dede:channel} </ul>使用
type='top'可以获取所有顶级栏目,由于我们修改了核心,它会自动判断并高亮当前栏目的所有父级。
总结与推荐
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 方法一 | 简单、安全、无需修改核心,能满足90%的需求。 | 只能高亮直接子栏目,不能高亮多级。 | ★★★★★ (最推荐) |
| 方法二 | 灵活,可结合 global 标签,适用于列表页和内容页。 |
代码稍显复杂,和方法一类似。 | ★★★★☆ |
| 方法三 | 功能最强大,可以实现面包屑式的多级高亮。 | 需要修改核心文件,升级有风险,代码改动较大。 | ★★★☆☆ (除非有特殊需求,否则不推荐) |
对于绝大多数用户,强烈推荐使用方法一,它简单、直接、且非常稳定,如果方法一无法满足你的需求(例如需要高亮非直接子栏目),再考虑方法二或方法三。
