织梦CMS如何调用顶级栏目?

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

使用 channel 标签(最常用、最灵活)

channel 标签是织梦调用栏目的核心标签,功能非常强大,可以轻松实现调用顶级栏目的需求。

场景1:只调用顶级栏目,不包含子栏目

这是最基本的需求,通常用于网站主导航。

标签代码:

{dede:channel type='top' row='8'}
    <a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}

代码解析:

  • {dede:channel ...}:这是调用栏目的开始和结束标签。
  • type='top':这是最关键的参数,它指定了只调用顶级栏目
  • row='8':表示调用8个栏目,如果不设置,默认调用所有顶级栏目。
  • [field:typelink/]:字段标签,表示获取栏目的链接地址
  • [field:typename/]:字段标签,表示获取栏目的名称

场景2:调用顶级栏目,并高亮当前栏目

在导航菜单中,我们通常希望当前所在的栏目能够高亮显示(改变颜色或加粗),织梦的 channel 标签通过 currentstyle 参数可以轻松实现。

标签代码:

{dede:channel type='top' row='8' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
    <li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}

代码解析:

  • currentstyle='...':这个参数用于定义当前栏目的HTML样式。
    • ~typelink~:是 [field:typelink/] 的简写形式。
    • ~typename~:是 [field:typename/] 的简写形式。
    • 当用户访问某个顶级栏目时,该栏目对应的 <li> 会被替换成 currentstyle 中定义的 <li class='active'>...</li>
  • 默认样式 <li><a href="[field:typelink/]">[field:typename/]</a></li> 用于非当前栏目。

使用 channelartlist 标签(带下拉菜单的导航)

如果你的顶级栏目下有子栏目,并且希望实现鼠标悬停时显示子菜单的效果,channelartlist 是最佳选择,它会先循环顶级栏目,然后在每个顶级栏目内循环其子栏目。

标签代码:

<ul id="nav">
    {dede:channelartlist typeid='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}
</ul>

代码解析:

  1. 外层循环 {dede:channelartlist ...}:

    • typeid='top':指定只循环顶级栏目。
    • row='8':循环8个顶级栏目。
    • {dede:field name='typeurl'/}:获取当前顶级栏目的链接。
    • {dede:field name='typename'/}:获取当前顶级栏目的名称。
  2. 内层循环 {dede:channel type='son' ...}:

    • type='son':这个参数指定只调用当前顶级栏目下的子栏目
    • noself='yes':不包含栏目本身,只调用子栏目,通常用于下拉菜单,避免重复显示顶级栏目名。
    • [field:typelink/][field:typename/]:这里调用的是子栏目的链接和名称。

CSS配合: 为了让子菜单在悬停时显示,你需要一些CSS样式:

#nav li {
    position: relative;
    float: left;
    list-style: none;
}
#nav li a {
    display: block;
    padding: 10px;
    text-decoration: none;
}
/* 默认隐藏子菜单 */
#nav li ul {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    background: #fff;
    border: 1px solid #ccc;
}
/* 鼠标悬停在父级li上时,显示子菜单 */
#nav li:hover ul {
    display: block;
}

使用SQL直接查询(适用于复杂场景)

channelchannelartlist 标签无法满足非常特殊的需求时(根据特定条件筛选顶级栏目),可以直接使用SQL语句查询。

标签代码:

{dede:sql sql='SELECT id, typename, typedir FROM `dede_arctype` WHERE reid=0 AND ishidden=0 ORDER BY sortrank ASC LIMIT 0, 10'}
    <a href="[field:typedir function='str_replace("{cmspath}", "", "@me")'/]">[field:typename/]</a>
{/dede:sql}

代码解析:

  • {dede:sql sql='...'}:执行自定义SQL查询的标签。
  • SELECT id, typename, typedir FROM ...:查询 dede_arctype 表(栏目表)的 idtypename(栏目名)、typedir(栏目目录)字段。
  • WHERE reid=0:这是关键条件,reid 字段为 0 表示该栏目是顶级栏目。
  • AND ishidden=0:可选条件,ishidden0 表示不隐藏的栏目。
  • ORDER BY sortrank ASC:按 sortrank(栏目排序)升序排列。
  • LIMIT 0, 10:限制查询结果为10条。
  • [field:typedir function='str_replace("{cmspath}", "", "@me")'/]:由于 typedir 字段的值可能包含 {cmspath}(网站根目录路径),我们需要用 function 函数将其替换掉,得到正确的URL。{cmspath}/a/ 会变成 /a/

总结与对比

方法 适用场景 优点 缺点
channel 简单的顶级栏目列表、主导航、带高亮效果 代码简洁、性能好、官方支持 功能相对固定,不适合复杂嵌套
channelartlist 带下拉菜单的多级导航 结构清晰,能完美处理“父栏目 -> 子栏目”的嵌套结构 代码稍复杂,主要用于导航
sql 直接查询 需要根据特定条件筛选、排序或获取其他额外字段 灵活性最高,可以完全控制查询逻辑 代码可读性差,有一定性能开销,不熟悉SQL不建议使用

推荐:

  • 99% 的情况下,使用 channel 就足够了,特别是制作网站主导航。
  • 如果需要下拉菜单,请使用 channelartlist
  • 除非有特殊需求,否则尽量避免直接使用SQL,以保持模板的简洁和可维护性。

希望这些详细的解释能帮助你更好地在织梦CMS中调用顶级栏目!

-- 展开阅读全文 --
头像
dede如何判断是否存在二级分类?
« 上一篇 02-04
dede数据库还原0条记录
下一篇 » 02-04

相关文章

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