dede导航如何正确调用?

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

最基础的导航调用:channelartlist

这是调用顶级栏目(一级导航)最常用、最强大的标签,它会循环输出所有顶级栏目,并且可以在循环内调用其子栏目。

dede导航调用问题
(图片来源网络,侵删)

基本语法和参数

{dede:channelartlist type='top' row='8'}
    <li>
        <a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
        {dede:channel type='son' noself='yes'}
            <a href="[field:typelink/]">[field:typename/]</a>
        {dede:channel}
    </li>
{/dede:channelartlist}

参数详解

  • type='top': 指定调用顶级栏目,这是最常用的参数。
  • row='8': 指定调用栏目的数量,例如只显示前8个导航。
  • currentstyle='active': 指定当前栏目高亮的样式名,这个样式名会自动被添加到 <li> 标签的 class 属性中。
  • typeid='1': 指定调用某个特定的顶级栏目及其子栏目,如果留空,则调用所有顶级栏目。

字段说明 (在 {dede:channelartlist} 内部使用)

  • {dede:field name='typename'/}: 获取当前顶级栏目的名称。
  • {dede:field name='typeurl'/}: 获取当前顶级栏目的链接地址。
  • {dede:field name='id'/}: 获取当前顶级栏目的 ID。

channelartlist 中调用子栏目

这是 channelartlist 的核心优势,它使用一个嵌套的 {dede:channel} 标签来调用当前顶级栏目下的所有子栏目。

示例代码(带当前栏目高亮和子栏目)

<ul class="main-nav">
    {dede:channelartlist type='top' row='8' currentstyle='class="current"'}
        <li class="{dede:field name='typeid' function='IsPart(@me, $typeid)'}">
            <a href="{dede:field name='typeurl'/}" {dede:field name='typeid' function='IsPart(@me, $typeid)'}>{dede:field name='typename'/}</a>
            {dede:channel type='son' noself='yes'}
                <div class="sub-nav">
                    <a href="[field:typelink/]">[field:typename/]</a>
                </div>
            {dede:channel}
        </li>
    {dede:channelartlist}
</ul>

代码解析:

  1. {dede:channelartlist} ... {/dede:channelartlist}: 循环输出所有顶级栏目。
  2. currentstyle='class="current"': 当访问的页面属于某个顶级栏目时,<li> 标签会自动带上 class="current" 属性,如果当前页面是“产品介绍”下的“产品A”,产品介绍”这个 <li> 就会有 class="current"
  3. {dede:channel type='son' noself='yes'} ... {/dede:channel}:
    • type='son': 表示调用子栏目。
    • noself='yes': 表示不调用栏目本身,只调用子栏目。
    • [field:typelink/]: 子栏目的链接。
    • [field:typename/]: 子栏目的名称。
  4. function='IsPart(@me, $typeid)': 这是一个非常重要的自定义函数,用于判断当前页面是否属于某个栏目。$typeid 是当前页面的栏目ID,这个函数会返回 class='current' 字符串,实现更精确的高亮。

调用指定栏目的子导航

有时候我们只想在某个特定页面(比如首页)调用某个固定栏目的子导航,而不是所有顶级栏目的子导航。

示例:在首页调用 ID 为 2 的栏目的所有子栏目

在首页模板 (index.htm) 中,你可以这样写:

dede导航调用问题
(图片来源网络,侵删)
{dede:channelartlist typeid='2'}
    <h2>{dede:field name='typename'/}</h2>
    <ul>
        {dede:channel type='son' noself='yes'}
            <li><a href="[field:typelink/]">[field:typename/]</a></li>
        {dede:channel}
    </ul>
{/dede:channelartlist}

说明:

  • typeid='2': 这里指定了只调用 ID 为 2 的顶级栏目。
  • 外层的 {dede:channelartlist} 只是为了获取父栏目名称和提供一个上下文,如果不需要父栏目名称,可以简化调用。

更简洁的写法(直接调用子栏目):

如果你明确知道父栏目的ID,可以直接使用 {dede:channel} 标签,但需要配合 reid 参数。

{dede:channel type='son' reid='2' row='10'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

参数说明:

dede导航调用问题
(图片来源网络,侵删)
  • type='son': 调用子栏目。
  • reid='2': 指定父栏目的ID,这里的 reid 是相对于当前栏目的父级ID。

常见问题与解决方案 (FAQ)

问题1:为什么我的导航调用不出来?

  • 检查栏目设置: 进入后台“[核心]-[栏目管理]”,检查你的栏目是否正确设置,栏目类型”是否为“栏目”(而不是“外部链接”或“单页”)。
  • 检查模板标签: 确保标签拼写正确,没有遗漏 {dede:}{/dede:}
  • 检查缓存: DedeCMS 有强大的缓存机制,调用不出来时,尝试在后台“[系统]-[清除缓存]”中清除所有缓存,然后刷新页面。

问题2:为什么当前栏目没有高亮?

  • currentstyle 参数未设置: 确保你的标签里加了 currentstyle 参数,currentstyle='class="on"'
  • 高亮逻辑错误: 如果你手动判断,请确保你的 PHP 函数(如 IsPart)逻辑正确。currentstyle 是最简单可靠的方法。
  • 页面不属于任何栏目: 如果你访问的是首页,而首页没有关联到任何栏目,顶级导航自然不会高亮,我们会将首页设置为“不显示在导航中”,或者为首页设置一个特殊的样式。

问题3:为什么子导航只显示一个?

  • 检查 row 参数: 你可能在 {dede:channel} 标签里误加了 row='1',导致只调用一个子栏目,如果需要调用所有子栏目,请删除 row 参数。

问题4:如何实现“首页”导航,并且高亮?

首页的导航高亮逻辑比较特殊,因为它不属于任何一个栏目。

手动添加首页导航,并用JS控制

<ul class="nav">
    <li><a href="{dede:global.cfg_basehost/}" id="nav-home">首页</a></li>
    {dede:channelartlist type='top' row='8' currentstyle='class="current"'}
        <li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
    {/dede:channelartlist}
</ul>
<script>
    // 获取当前页面的URL
    var currentUrl = window.location.href;
    // 获取首页链接
    var homeUrl = "{dede:global.cfg_basehost/}";
    if (currentUrl == homeUrl || currentUrl == homeUrl + "/") {
        document.getElementById("nav-home").className = "current";
    }
</script>

在模板里用PHP判断(更推荐)

在模板文件中,你可以使用 DedeCMS 的全局变量 $typeid 来判断。

<ul class="nav">
    <li><a href="{dede:global.cfg_basehost/}">首页</a></li>
    {dede:channelartlist type='top' row='8' currentstyle='class="current"'}
        <li><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></li>
    {/dede:channelartlist}
</ul>
<style>
    /* 默认首页高亮 */
    #nav-home.current { background-color: #f00; }
</style>
<script>
    <?php
        // 如果当前页面是首页,则给首页的li添加current类
        if ($GLOBALS['typeid'] == 0) {
            echo "document.getElementById('nav-home').className = 'current';";
        }
    ?>
</script>

需求场景 推荐标签 关键参数/用法
调用所有顶级导航 {dede:channelartlist} type='top', row='N', currentstyle
顶级导航带子导航 {dede:channelartlist} + {dede:channel type='son'} currentstyle 用于高亮父级,[field:typelink/] 调用子级
调用指定栏目的子导航 {dede:channelartlist typeid='N'} typeid 指定父栏目ID
调用指定栏目的子导航(简化版) {dede:channel type='son' reid='N'} reid 指定父栏目ID
首页导航高亮 手动添加 <a> 标签 + JS/PHP判断 通过 $typeid == 0 判断是否为首页

希望这份详细的指南能帮助你彻底解决 DedeCMS 的导航调用问题!如果还有具体的问题,可以随时提出。

-- 展开阅读全文 --
头像
织梦还离不开PHP吗?
« 上一篇 今天
织梦文件管理器空白怎么办?
下一篇 » 今天
取消
微信二维码
支付宝二维码