dede list如何调用子栏目?

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

场景说明

假设你的网站结构如下:

dede list调用子栏目
(图片来源网络,侵删)
首页
├─ 新闻中心 (栏目ID=1, 类型=栏目)
│  ├─ 公司新闻 (栏目ID=3, 类型=栏目)
│  └─ 行业动态 (栏目ID=4, 类型=栏目)
└─ 产品展示 (栏目ID=2, 类型=栏目)
   ├─ 产品分类A (栏目ID=5, 类型=栏目)
   └─ 产品分类B (栏目ID=6, 类型=栏目)

当你访问 新闻中心 的列表页 (list_1.php) 时,你希望调用出它的子栏目:公司新闻行业动态


最常用和推荐的方法 - 使用 channel

这是最直接、最简单的方法,专门用于获取当前栏目的子栏目,它默认会调用顶级栏目和当前栏目的下一级子栏目。

基本语法

{dede:channel type='son' currentstyle="<li><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
    <li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}

参数详解

  • type='son': 核心参数,表示只调用当前栏目的直接子栏目。
  • currentstyle: 非常实用的参数,它会给当前正在访问的子栏目(即列表页面对应的栏目)应用一个特殊的样式,你正在看“公司新闻”列表页,currentstyle 里的内容就会渲染给“公司新闻”这个栏目链接。
    • ~typelink~: currentstyle 中的特殊变量,会被替换为栏目的链接地址。
    • ~typename~: currentstyle 中的特殊变量,会被替换为栏目的名称。
  • [field:typelink/]: 子栏目的链接地址。
  • [field:typename/]: 子栏目的名称。

完整示例(带CSS高亮)

假设你的列表页模板文件是 list_article.htm

<!-- 在列表页的适当位置,比如标题下方,放置子栏目导航 -->
<div class="subnav">
    <h3>栏目导航</h3>
    <ul>
        {dede:channel type='son' currentstyle="<li class='active'><a href='~typelink~' class='thisclass'>~typename~</a></li>"}
        <li><a href='[field:typelink/]'>[field:typename/]</a></li>
        {/dede:channel}
    </ul>
</div>

效果解释:

dede list调用子栏目
(图片来源网络,侵删)
  • 当你访问 list_1.php (新闻中心) 时,如果新闻中心没有开启“使用列表”,这个标签可能不会显示任何内容,因为 type='son' 要求父栏目本身也必须是“栏目”类型,并且有子栏目。
  • 当你访问 list_3.php (公司新闻) 时,ul 内的HTML会变成:
    <ul>
        <li class="active"><a href='/plus/list.php?tid=3' class='thisclass'>公司新闻</a></li>
        <li><a href='/plus/list.php?tid=4'>行业动态</a></li>
    </ul>

    你可以通过CSS的 .thisclass.active 类来为当前栏目链接设置高亮样式,比如改变颜色或加粗。


更灵活的方法 - 使用 arclist

arclist 是万能的列表标签,也可以用来调用子栏目,它的好处是功能更强大,可以结合其他属性使用,limit (限制数量)、orderby (排序方式) 等。

基本语法

{dede:arclist typeid='son' channelid='1' row='10' titlelen='30'}
    <a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}

注意: 这种方法调用的是子栏目下的文章,而不是子栏目本身,如果你只是想显示一个栏目导航列表,不推荐此方法,但如果你想在父栏目列表页同时显示子栏目的最新文章,这个方法就非常有用。

参数详解

  • typeid='son': 核心参数,表示获取当前栏目的子栏目ID作为文章查询的范围。
  • channelid='1': 指定要查询的模型ID,对于栏目,通常需要指定为栏目模型的ID,但更常见的是用它来限制文章的频道,如果目标是获取栏目信息,这个标签用起来不太直观。
  • row='10': 显示10条记录。
  • [field:arcurl/]: 文章的链接地址。
  • [field:title/]: 文章的标题。

重要提示: arclist 是用来调内容的,不是专门用来调栏目的,如果你只想显示“公司新闻”、“行业动态”这样的栏目名称和链接,强烈推荐使用方法一的 channel。aritelist 更适合“显示公司新闻栏目的最新5篇文章”这类需求。


获取所有顶级栏目(适用于首页)

如果你的需求是在首页调用所有一级栏目(如“新闻中心”、“产品展示”),而不是某个列表页的子栏目,那么应该使用 channel 标签的默认行为。

基本语法

{dede:channel type='top' currentstyle="<li class='thisclass'><a href='~typelink~'>~typename~</a></li>"}
    <li><a href='[field:typelink/]'>[field:typename/]</a></li>
{/dede:channel}
  • type='top': 表示只调用顶级栏目,这个参数在列表页中是可选的,因为默认行为就是如此,但在首页必须明确指定。

总结与最佳实践

用途 推荐场景 优点 缺点
{dede:channel type='son'} 调用当前栏目的直接子栏目 列表页/频道页的子栏目导航 专用、简单、高效、支持currentstyle高亮 功能相对单一,只调用栏目
{dede:arclist typeid='son'} 调用子栏目下的文章内容 在父栏目列表页同时显示子栏目的最新文章 功能强大,可结合多种参数 不适合纯栏目导航,逻辑上容易混淆
{dede:channel type='top'} 调用所有顶级栏目 首页主导航 专用,调用顶级栏目清晰 不适用于子栏目调用

对于“在dede list调用子栏目”这个问题,方法一 {dede:channel type='son'} 是最标准、最推荐的解决方案,它代码简洁,意图明确,currentstyle 功能在实际开发中非常实用。

常见问题排查 (FAQ)

Q1: 为什么我用了 {dede:channel type='son'} 什么都没显示?

A1: 请检查以下几点:

  1. 父栏目设置:确保你所在的列表页面对应的父栏目,在后台“栏目管理”中,“栏目列表选项”没有勾选“使用列表”,如果勾选了,DedeCMS 会认为这是一个内容列表页而不是一个栏目索引页,子栏目调用可能会失效。
  2. 子栏目是否存在:确认当前栏目下是否真的有子栏目,并且子栏目的“类型”是“栏目”而不是“外部链接”或“单页”。
  3. 栏目类型:确保父栏目本身是“栏目”类型。

Q2: 我想调用所有子栏目(包括孙栏目),怎么办?

A2: DedeCMS 的 channel 标签本身没有直接调用所有层级子栏目的参数,一个变通的方法是使用 son + self,但这依然有限,如果需要调用所有后代栏目,通常需要更复杂的处理,比如编写一个自定义函数或使用递归标签,这超出了基础标签的范畴,对于99%的网站,调用直接子栏目 (son) 已经足够。

-- 展开阅读全文 --
头像
c framwork 易语言
« 上一篇 01-25
dede tag标签结果出错,原因何在?
下一篇 » 01-25

相关文章

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