dede导航选中标签怎么实现?

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

在 PHP 模板中,通过判断当前页面的 URL 或栏目 ID,来动态给对应的 <li><a> 标签添加一个特定的 CSS 类名(activeselected),然后在 CSS 中为这个类名定义样式。

dede 导航 选中 标签
(图片来源网络,侵删)

下面我将分两种最常见的情况进行详细说明,并提供完整的代码示例。


主导航栏(一级栏目)高亮

这种情况最常见,就是当用户访问某个栏目时,主导航栏中对应的那个栏目项要高亮显示。

第1步:准备 CSS 样式

在你的 CSS 文件中,定义一个高亮状态的样式,通常我们会改变文字颜色、背景色或添加下划线。

/* 假设你的导航链接默认样式是 */
.nav-item a {
  color: #333; /* 默认文字颜色 */
  text-decoration: none;
  padding: 10px 15px;
  display: block;
}
/* 当链接被选中或高亮时,添加的 active 类样式 */
.nav-item a.active {
  color: #ff6600; /* 高亮文字颜色 */
  background-color: #f0f0f0; /* 高亮背景色 */
  font-weight: bold; /* 可以加粗 */
}

第2步:修改 DedeCMS 的导航标签 ({dede:channel})

这是最关键的一步,我们需要修改 DedeCMS 的内置标签 {dede:channel},在其中加入判断逻辑。

dede 导航 选中 标签
(图片来源网络,侵删)

默认的 {dede:channel} 标签通常是这样的:

<ul class="nav">
  <li class="nav-item"><a href='{dede:global.cfg_cmsurl/}/'>首页</a></li>
  {dede:channel type='top' row='8'}
  <li class="nav-item"><a href='[field:typelink/]'>[field:typename/]</a></li>
  {/dede:channel}
</ul>

我们需要修改它,使其在当前栏目时添加 active 类,这里有两种主流的实现方法。

方法 A:使用 DedeCMS 的 currentstyle 属性(推荐,最简单)

{dede:channel} 标签有一个非常方便的属性 currentstyle,专门用来实现这个功能,它会在当前栏目链接上应用你指定的 HTML 模板。

修改后的代码:

dede 导航 选中 标签
(图片来源网络,侵删)
<ul class="nav">
  <!-- 首页单独处理,因为首页不属于任何栏目 -->
  <li class="nav-item">
    <a href='{dede:global.cfg_cmsurl/}/' 
       {dede:field name='typeid' runphp='yes'}@me = (@me == '0') ? "class='active'" : "" ;{/dede:field}>
       首页
    </a>
  </li>
  <!-- 一级栏目循环 -->
  {dede:channel type='top' row='8'}
    <li class="nav-item">
      <a href="[field:typelink/]" 
         [field:typelink runphp='yes']
            @me = (@me == dedeGetCurUrl()) ? "class='active'" : "";
         [/field:typelink]>
         [field:typename/]
      </a>
    </li>
  {/dede:channel}
</ul>

代码解释:

  1. 首页判断{dede:field name='typeid' runphp='yes'}...{/dede:field} 这段 PHP 代码判断当前栏目的 ID (typeid) 是否为 0(首页的 typeid 为 0),如果是,就在 <a> 标签里加上 class='active'
  2. 栏目判断[field:typelink runphp='yes']...[/field:typelink] 这段代码对每个栏目的链接进行判断。
    • @me 是 DedeCMS 模板中的变量,在这里代表 [field:typelink/] 的值(即当前栏目的链接)。
    • dedeGetCurUrl() 是一个 DedeCMS 函数,用于获取当前页面的完整 URL。
    • (@me == dedeGetCurUrl()) ? "class='active'" : "" 是一个三元运算符,如果当前栏目的链接 (@me) 等于当前页面的 URL,就返回 class='active',否则返回空字符串。
    • 这个 class='active' 会被插入到 <a> 标签中。

方法 B:手动判断(更灵活,适用于复杂逻辑)

如果你觉得 currentstyle 不够灵活,或者想用更通用的 PHP 语法,可以手动写判断。

修改后的代码:

<ul class="nav">
  <li class="nav-item"><a href='{dede:global.cfg_cmsurl/}/' {dede:field name='typeid' runphp='yes'}@me = (@me == '0') ? "class='active'" : "" ;{/dede:field}>首页</a></li>
  {dede:channel type='top' row='8'}
    <li class="nav-item">
      <a href="[field:typelink/]" 
         [field:id runphp='yes']
            $currentTypeId = intval(@me); // 获取当前循环栏目的ID
            $current_pageTypeId = intval($GLOBALS['typeid']); // 获取当前页面的typeid
            // 判断当前栏目的ID是否等于当前页面的typeid
            if($currentTypeId == $current_pageTypeId) {
                @me = " class='active'";
            } else {
                @me = "";
            }
         [/field:id]>
         [field:typename/]
      </a>
    </li>
  {/dede:channel}
</ul>

代码解释:

这种方法直接比较栏目的 id 和当前页面的 typeid$GLOBALS['typeid'] 是一个全局变量,存储了当前页面的栏目 ID,这种方法在某些特殊页面(如列表页、文章页)上判断更准确。


子栏目高亮(面包屑导航或侧边栏)

有时候我们需要在面包屑导航或者侧边栏中,让当前层级的父栏目也高亮。

面包屑:首页 > 产品中心 > 手机,我们希望“产品中心”也保持高亮状态。

解决方案

这同样是通过 PHP 判断实现的,在面包屑或子栏目列表中,我们不仅判断当前栏目,还要判断其父栏目。

面包屑导航示例 ({dede:field name='position'})

默认的面包屑标签是 {dede:field name='position' /},它会生成类似 首页 > 产品中心 > 手机 的链接,我们可以自定义它的样式。

<div class="breadcrumb">
  {dede:field name='position' runphp='yes'}
    $tc = @me;
    $tc = preg_replace('/<a[^>]+>([^<]+)<\/a>/i', '<a href="#" class="active">$1</a>', $tc);
    @me = $tc;
  {/dede:field}
</div>

代码解释:

这段代码使用了正则表达式 preg_replace 来替换面包屑中的链接。

  • '/<a[^>]+>([^<]+)<\/a>/i' 是一个正则表达式,用来匹配所有 <a>
  • '<a href="#" class="active">$1</a>' 是替换的模板。$1 代表第一个捕获组 ([^<]+),也就是链接的文本内容。
  • 这个方法简单粗暴,会将面包屑里的所有链接都加上 active 类,如果你只想高亮父栏目,需要更复杂的逻辑,通常需要获取当前栏目的父栏目 ID,然后进行针对性替换。

侧边栏子栏目高亮

侧边栏的子栏目通常用 {dede:channel} 来调用,方法和一级导航完全一样,只是 type 属性可能需要调整。

<!-- 假设当前栏目ID是 5,我们要显示它的所有子栏目 -->
{dede:channel type='son' typeid='5'}
  <a href="[field:typelink/]" [field:id runphp='yes'] if($GLOBALS['typeid'] == @me) @me=" class='active'"; else @me=""; [/field:id]>[field:typename/]</a>
{/dede:channel}

这里 typeid='5' 指定了要显示哪个栏目的子栏目,判断逻辑则和前面一样,比较 @me(子栏目ID)和 $GLOBALS['typeid'](当前页面ID)。


总结与最佳实践

  1. CSS 优先:先在 CSS 文件中定义好 .active.selected 的样式,这样修改 HTML 时就能立即看到效果。
  2. 善用 currentstyle:对于简单的导航栏高亮,{dede:channel}currentstyle 属性是最简单、最直接的方法。
  3. 理解 PHP 逻辑runphp='yes' 是实现复杂判断的核心,要理解 @me 变量和 $GLOBALS 等全局变量的用法。
  4. 首页特殊处理:记住首页的 typeid0,需要单独判断。
  5. 测试:在修改模板后,一定要到前台实际点击各个栏目、文章,检查高亮效果是否符合预期。

希望这份详细的指南能帮助你完美解决 DedeCMS 导航选中高亮的问题!

-- 展开阅读全文 --
头像
Visual C/C语言如何高效开发与调试?
« 上一篇 今天
dede sql多表查询如何实现?
下一篇 » 今天

相关文章

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