dede 循环一级栏目

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

使用 channelartlist 标签(推荐,最常用)

channelartlist 是专门用于调用一级栏目并循环的标签,它会自动将当前循环的栏目信息注入到环境变量中,方便在循环内部调用其子栏目。

dede 循环一级栏目
(图片来源网络,侵删)

标签结构:

{channelartlist typeid='0' }
    <!-- 循环开始,typeid='0' 表示调用所有顶级栏目 -->
    <!-- 一级栏目信息 -->
    <div class="main-nav">
        <h2><a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a></h2>
        <!-- 在循环内部,使用 {dede:channel} 来调用当前一级栏目的子栏目 -->
        <div class="sub-nav">
            <ul>
                {dede:channel type='son' noself='yes'}
                <li><a href="[field:typelink/]">[field:typename/]</a></li>
                {/dede:channel}
            </ul>
        </div>
    </div>
{/channelartlist}

代码详解:

  1. {channelartlist typeid='0'}

    • channelartlist: 指定使用此标签来循环栏目。
    • typeid='0': 这是关键参数。typeid 用于指定要调用的栏目ID。'0' 代表所有顶级栏目(即一级栏目),如果你想指定特定的一级栏目,可以用逗号隔开,typeid='1,3,5'
    • 这个标签对会循环遍历所有匹配的一级栏目。
  2. {dede:field name='typeurl'/}

    dede 循环一级栏目
    (图片来源网络,侵删)
    • channelartlist 循环内部,{dede:field} 标签会自动获取当前栏目的信息。
    • name='typeurl': 获取当前一级栏目的链接地址。
  3. {dede:field name='typename'/}

    • name='typename': 获取当前一级栏目的名称。
  4. {dede:channel type='son' noself='yes'}

    • 这个标签嵌套在 channelartlist 内部,用于调用当前正在循环的这个一级栏目的子栏目。
    • type='son': 指定调用类型为“子栏目”。
    • noself='yes': 表示不调用栏目本身,只调用它的子栏目,这通常是我们想要的效果。

使用 arclist 标签(适用于特定场景)

arclist 主要是用于调用文档(文章)列表,但通过设置 channeltypeid 参数,也可以实现类似的效果,这种方法不如 channelartlist 直观,但有时也很有用。

标签结构:

dede 循环一级栏目
(图片来源网络,侵删)
{dede:channel type='top' }
    <div class="channel-item">
        <a href="[field:typelink/]">[field:typename/]</a>
    </div>
{/dede:channel}

代码详解:

  1. {dede:channel type='top'}

    • channel: 调用栏目。
    • type='top': 这是核心参数,表示调用所有顶级栏目(一级栏目)。
  2. [field:typelink/][field:typename/]

    • channel 标签内部,使用 [field:xxx/] 的形式来获取栏目信息。
    • typelink: 栏目链接。
    • typename: 栏目名称。

注意: channelartlist 的优势在于可以在循环内部方便地调用子栏目,而 channel 标签不行,如果你只是想单纯列出一级栏目的链接,channel 也可以,但 channelartlist 更强大、更灵活。


使用 SQL 查询(最灵活,适合有复杂需求的场景)

如果你需要对栏目进行更复杂的筛选、排序或处理,可以直接使用 dede:sql 标签执行原生SQL查询。

前提: 你需要知道DedeCMS中存储栏目的表是 dede_arctype

标签结构:

{dede:sql sql='SELECT id, typename, typedir FROM `dede_arctype` WHERE reid=0 ORDER BY id ASC'}
    <div class="channel-item">
        <!-- 使用 [field:xxx/] 来获取SQL查询返回的字段 -->
        <a href="[field:typedir function='str_replace("{cmspath}","",@me)'/]">[field:typename/]</a>
    </div>
{/dede:sql}

代码详解:

  1. sql='SELECT ... '

    • SELECT id, typename, typedir: 选择你需要的栏目字段。
    • FROM dede_arctype: 从栏目表查询。
    • WHERE reid=0: reid 字段表示“父栏目ID”,reid=0 就是筛选出所有顶级栏目(一级栏目)。
    • ORDER BY id ASC: 按栏目ID升序排列。
  2. [field:typedir function='str_replace("{cmspath}","",@me)'/]

    • typedir 字段在数据库中存储的值是 {cmspath}/a/b 这样的格式,{cmspath} 是网站根目录变量。
    • 使用 function 对字段值进行处理,用 str_replace{cmspath} 替换为空,得到正确的相对路径。

总结与推荐

方法 优点 缺点 适用场景
channelartlist 代码最直观、最易读,专门为此设计,可方便地在循环内调用子栏目 灵活性相对SQL稍差 绝大多数情况下的首选,特别是需要制作带下拉菜单的多级导航时。
channel 语法简单,代码量少 无法在循环内直接调用子栏目,功能单一 只需要简单列出一级栏目名称和链接时。
dede:sql 灵活性最高,可以执行任何复杂的SQL查询,进行任意筛选和排序 需要了解数据库结构,代码可读性差,有安全风险(需注意防SQL注入) 有非常特殊的需求,比如按特定条件筛选栏目、或者栏目数据有特殊处理时。

对于99%的需求,强烈推荐使用方法一 channelartlist,它既简洁又强大,是DedeCMS模板设计的标准做法。

-- 展开阅读全文 --
头像
织梦5.6升级5.7有哪些注意事项?
« 上一篇 今天
没有更多啦!
下一篇 »

相关文章

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

目录[+]