通过PHP判断当前页面的栏目ID是否属于某个顶级栏目的子栏目集合,如果是,则给该顶级栏目添加一个高亮的CSS类名。

下面我将为您提供两种最常用、最稳定的方法,并附上详细的步骤和代码。
准备工作:CSS样式
无论使用哪种方法,你都需要先在CSS文件中定义高亮状态的样式,通常我们通过添加一个 .active 或 .current 类来实现。
在你的CSS文件(/css/main.css)中添加以下样式:
/* 导航栏默认样式 */
.nav-item {
/* 你的默认样式,比如颜色、边距等 */
color: #333;
padding: 10px 15px;
}
/* 高亮状态的样式 */
.nav-item.active {
/* 你的高亮样式,比如背景色、文字颜色等 */
background-color: #ff6600;
color: #fff;
font-weight: bold;
}
使用织梦自带的 {dede:channel} 标签(推荐,最简单)
织梦的 {dede:channel} 标签本身有一个 typeid 属性,可以指定当前顶级栏目,结合 currentstyle 属性,可以实现顶级栏目自身的高亮,但要让其包含子栏目,我们需要稍微改造一下。
这种方法适用于大多数标准导航栏。
步骤:
-
找到你的导航栏模板文件 这个文件通常位于你的模板目录下,
/templets/default/header.htm或/templets/你的模板文件夹/nav.htm。 -
修改导航栏代码 找到生成顶级栏目的
{dede:channel}循环部分,将其修改为以下格式:<ul class="nav"> <!-- 首页链接 --> <li class="nav-item"><a href="{dede:global.cfg_basehost/}">首页</a></li> <!-- 顶级栏目循环 --> {dede:channel type='top' currentstyle='<li class="nav-item active"><a href~class="active">~text</a></li>'} <li class="nav-item"> <a href="[field:typelink/]">[field:typename/]</a> </li> {/dede:channel} </ul>代码解释:
type='top':只获取顶级栏目。currentstyle='...':这是关键,它会在当前栏目与typeid属性指定的栏目匹配时,使用currentstyle里的内容替换默认的<li>。- 上面的代码默认只高亮顶级栏目本身,不包含其子栏目。 为了实现包含子栏目,我们需要结合一个PHP判断。
-
引入PHP判断逻辑(核心步骤) 在
{dede:channel}循环的li标签内部,加入一小段PHP代码来判断当前页面是否属于该顶级栏目的子栏目。修改后的完整代码如下:
<ul class="nav"> <!-- 首页链接 --> <li class="nav-item"><a href="{dede:global.cfg_basehost/}">首页</a></li> <!-- 顶级栏目循环 --> {dede:channel type='top'} <li class="nav-item [field:ID runphp='yes'] $GLOBALS['thisid'] = @me; $GLOBALS['topid'] = GetTopid($GLOBALS['thisid']); if($GLOBALS['topid'] == @me) @me = 'active'; else @me = ''; [/field:ID]"> <a href="[field:typelink/]">[field:typename/]</a> </li> {/dede:channel} </ul>代码解释:
[field:ID runphp='yes'] ... [/field:ID]:这是织梦的自定义字段解析功能,允许在模板中直接运行PHP代码。$GLOBALS['thisid'] = @me;:获取当前正在循环的这个顶级栏目的ID,并存入全局变量$thisid。$GLOBALS['topid'] = GetTopid($GLOBALS['thisid']);:调用织梦内置函数GetTopid(),这个函数的作用是:获取当前页面的顶级栏目ID。$GLOBALS['thisid']是顶级栏目自己的ID,GetTopid()获取的是当前页面所属的顶级栏目ID。if($GLOBALS['topid'] == @me) @me = 'active'; else @me = '';:判断当前页面的顶级ID ($GLOBALS['topid']) 是否和正在循环的这个顶级栏目的ID (@me) 相等,如果相等,就给@me赋值'active',否则赋空字符串。[field:ID runphp='yes']...[/field:ID]整个表达式的结果(@me的最终值)会被插入到class="nav-item "的后面,从而实现了动态添加active类名。
优点:
- 代码简洁,直接在模板文件中完成。
- 利用了织梦的内置函数,稳定可靠。
使用自定义函数(更灵活,推荐用于复杂场景)
如果你的导航结构比较复杂,或者你希望将逻辑和模板更好地分离,可以创建一个自定义函数。
步骤:
-
创建自定义函数文件 在你的织梦网站根目录下,找到
include/extend.func.php文件,如果这个文件不存在,就新建一个,这个文件专门用来存放自定义的PHP函数。在
extend.func.php文件中,添加以下函数:/** * 判断当前页面是否属于某个顶级栏目 * @param int $topid 要判断的顶级栏目ID * @return bool 如果是则返回true,否则返回false */ function isTopCategoryActive($topid) { // 获取当前页面的栏目ID $typeid = getTypeld(); // 如果没有栏目ID(例如在首页),则不匹配 if (empty($typeid)) { return false; } // 获取当前页面栏目的顶级ID $currentTopid = GetTopid($typeid); // 判断是否相等 return ($currentTopid == $topid); } -
在模板中调用函数 回到你的导航栏模板文件(如
header.htm),修改{dede:channel}循环部分,使用我们刚刚创建的函数。<ul class="nav"> <!-- 首页链接 --> <li class="nav-item"><a href="{dede:global.cfg_basehost/}">首页</a></li> <!-- 顶级栏目循环 --> {dede:channel type='top'} <li class="nav-item [field:ID function='isTopCategoryActive(@me) ? "active" : ""'/]"> <a href="[field:typelink/]">[field:typename/]</a> </li> {/dede:channel} </ul>代码解释:
[field:ID function='...'/]:这是织梦模板中调用自定义函数的语法。isTopCategoryActive(@me):将当前栏目的ID (@me) 作为参数传递给我们自定义的isTopCategoryActive函数。? "active" : "":这是一个三元运算符,如果函数返回true,则字符串为"active",否则为空字符串,结果同样会动态添加到class属性中。
优点:
- 逻辑和模板分离,代码更清晰。
- 函数可以被其他模板重复调用,提高复用性。
- 更容易进行复杂的逻辑判断。
总结与对比
| 特性 | 方法一 (runphp) | 方法二 (自定义函数) |
|---|---|---|
| 实现方式 | 直接在模板标签内嵌入PHP代码。 | 在 extend.func.php 中定义函数,在模板中调用。 |
| 代码复杂度 | 对于初学者可能稍难理解。 | 模板部分非常简洁,逻辑封装在函数中。 |
| 灵活性 | 适合简单判断。 | 非常灵活,可以处理更复杂的逻辑,易于扩展。 |
| 维护性 | 修改逻辑需要改动模板文件。 | 修改逻辑只需改动一个函数文件,所有调用它的模板都会生效。 |
| 推荐度 | ⭐⭐⭐⭐ (简单直接,适合大多数情况) | ⭐⭐⭐⭐⭐ (最佳实践,推荐长期项目使用) |
对于大多数用户来说,方法一已经足够解决问题,如果你希望构建一个更规范、更易于维护的网站,强烈推荐使用方法二。
希望这个详细的教程能帮助你成功实现织梦二级栏目高亮显示!
