dede二级栏目高亮如何实现?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 DEDE建站 正文

场景说明

我们假设有如下的栏目结构:

dede 二级栏目高亮
(图片来源网络,侵删)
- 一级栏目 A (ID=1)
  - 二级栏目 A1 (ID=2)
  - 二级栏目 A2 (ID=3)
- 一级栏目 B (ID=4)
  - 二级栏目 B1 (ID=5)
  - 二级栏目 B2 (ID=6)

当用户访问 二级栏目 A1 (ID=2) 的列表页或内容页时,我们希望:

  1. 一级栏目 A (ID=1) 保持高亮(这是 DedeCMS 自带功能)。
  2. 二级栏目 A1 (ID=2) 也保持高亮。

修改 channel 标签(推荐,最常用)

这是最简单、最直接的方法,只需要修改模板文件,无需修改核心文件。

适用场景:主要用于在列表页模板 (list_article.htm) 中高亮当前栏目本身。

操作步骤:

dede 二级栏目高亮
(图片来源网络,侵删)
  1. 找到你的列表页模板文件,通常位于 /templets/你的模板名称/ 目录下,文件名为 list_article.htm

  2. 在模板中找到调用一级子栏目的 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。
  3. 修改这个 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>
  4. 解释

    • 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 标签中判断

这个方法比方法一更灵活,可以同时处理列表页内容页,并且可以高亮任意层级的父级。

适用场景:当你需要高亮当前栏目的所有父级,或者想在内容页也实现高亮时。

操作步骤:

  1. 在模板文件(如 list_article.htmarticle_article.htm)的顶部,使用 global 标签获取当前栏目的ID。

    {dede:global name='typeid' function='htmlspecialchars(@me)'/}

    这行代码会输出当前页面的栏目ID。

  2. 修改你的 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 升级时可能会被覆盖,请提前备份。

操作步骤:

  1. 备份文件 /include/typelink.class.php

  2. 打开 typelink.class.php 文件,找到 GetChannelList() 函数(大约在第 180 行左右)。

  3. 在函数内找到 $types[] = $row; 这一行(可能在 if($typeinfos['reid']==0) 的条件分支里)。

  4. 在这行代码之前,添加如下代码:

    // 高亮当前栏目及其父级
    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>";
    }
  5. 保存文件。

  6. 在你的模板文件中,调用栏目时就可以直接使用 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 标签,适用于列表页和内容页。 代码稍显复杂,和方法一类似。 ★★★★☆
方法三 功能最强大,可以实现面包屑式的多级高亮。 需要修改核心文件,升级有风险,代码改动较大。 ★★★☆☆ (除非有特殊需求,否则不推荐)

对于绝大多数用户,强烈推荐使用方法一,它简单、直接、且非常稳定,如果方法一无法满足你的需求(例如需要高亮非直接子栏目),再考虑方法二或方法三。

-- 展开阅读全文 --
头像
dede音乐播放器插件如何安装使用?
« 上一篇 03-04
织梦如何实现多图上传功能?
下一篇 » 03-04
取消
微信二维码
支付宝二维码

目录[+]