织梦二级栏目如何实现高亮显示?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 织梦建站 正文

通过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 属性,可以实现顶级栏目自身的高亮,但要让其包含子栏目,我们需要稍微改造一下。

这种方法适用于大多数标准导航栏。

步骤:

  1. 找到你的导航栏模板文件 这个文件通常位于你的模板目录下,/templets/default/header.htm/templets/你的模板文件夹/nav.htm

  2. 修改导航栏代码 找到生成顶级栏目的 {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判断。
  3. 引入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 类名。

优点:

  • 代码简洁,直接在模板文件中完成。
  • 利用了织梦的内置函数,稳定可靠。

使用自定义函数(更灵活,推荐用于复杂场景)

如果你的导航结构比较复杂,或者你希望将逻辑和模板更好地分离,可以创建一个自定义函数。

步骤:

  1. 创建自定义函数文件 在你的织梦网站根目录下,找到 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);
    }
  2. 在模板中调用函数 回到你的导航栏模板文件(如 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 中定义函数,在模板中调用。
代码复杂度 对于初学者可能稍难理解。 模板部分非常简洁,逻辑封装在函数中。
灵活性 适合简单判断。 非常灵活,可以处理更复杂的逻辑,易于扩展。
维护性 修改逻辑需要改动模板文件。 修改逻辑只需改动一个函数文件,所有调用它的模板都会生效。
推荐度 ⭐⭐⭐⭐ (简单直接,适合大多数情况) ⭐⭐⭐⭐⭐ (最佳实践,推荐长期项目使用)

对于大多数用户来说,方法一已经足够解决问题,如果你希望构建一个更规范、更易于维护的网站,强烈推荐使用方法二

希望这个详细的教程能帮助你成功实现织梦二级栏目高亮显示!

-- 展开阅读全文 --
头像
dede详情页调关键词
« 上一篇 02-26
dede缩略图绝对路径
下一篇 » 02-26

相关文章

取消
微信二维码
支付宝二维码

目录[+]