织梦arclist嵌套标签

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

arclist 是织梦中最核心、最常用的列表标签,用于调用文章、图集、软件等任意内容模型的数据,而嵌套 arclist 通常用于实现“一个主列表,每个条目下再显示一个子列表”的复杂布局,

织梦arclist嵌套标签
(图片来源网络,侵删)
  • 新闻列表:显示最新新闻,每条新闻下再显示相关的“热门文章”。
  • 产品列表:显示产品分类,每个分类下再显示该分类下的“推荐产品”。
  • 文章归档:按年份归档文章,点击某一年份,展开显示该年份下的所有文章。

基本语法与原理

我们回顾一下 arclist 的基本结构:

{dede:arclist flag='h' typeid='1' row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:arclist}

嵌套的核心原理

织梦的标签系统是基于“块级”执行的,当解析 {dede:arclist}...{/dede:arclist} 时,它会先找到这个大标签,然后执行内部的PHP代码获取数据,最后将数据填充到模板中。

嵌套的关键在于作用域和命名空间

织梦arclist嵌套标签
(图片来源网络,侵删)
  1. 外层 arclist:我们称之为“父列表”,它有自己的循环变量,如 [field:title/][field:arcurl/] 等。
  2. 内层 arclist:我们称之为“子列表”,它也有自己的循环变量。

如果内外层都使用默认的 [field:*] 变量,就会产生冲突,子列表的 [field:title] 会覆盖掉父列表的 [field:title],导致显示错误。

为了解决这个问题,织梦 arclist 标签提供了一个至关重要的属性:addfieldschannelid


核心属性详解

addfields (必须)

这个属性是嵌套的灵魂,它的作用是:从父列表的当前条目中,提取指定的字段,并将其传递给子列表的可用变量中。

  • 语法addfields='字段名1,字段名2'
  • 字段名:必须是你在后台内容模型中定义的字段名,keywords (关键词)、typeid (栏目ID)、writer (作者) 等。
  • 作用:假设父列表的当前文章有 keywords 字段,你设置了 addfields='keywords',那么在子列表的循环体内,你就可以通过 [field:keywords/] 来获取到这篇文章的 keywords 值。

channelid (通常必须)

这个属性指定了子列表要调用哪个内容模型的数据。

织梦arclist嵌套标签
(图片来源网络,侵删)
  • 语法channelid='模型ID'
  • 模型ID:在后台的“核心” -> “内容模型管理”中可以查看到每个模型对应的ID。
    • 普通文章:channelid='1'
    • 图集:channelid='2'
    • 软件或其他自定义模型:需要查看其ID。
  • 作用:告诉子列表要去哪个数据表里取数据,如果调用的是普通文章,通常可以省略,因为默认就是 1,但如果调用的是图集或其他模型,则必须指定。

实战案例:热门文章下的相关文章

这是一个非常经典和实用的嵌套场景。

需求: 在首页显示“热门文章”列表(父列表),每条热门文章下方,再显示与该文章“关键词”相关的其他文章(子列表)。

实现步骤

步骤 1:确保文章有关键词

在后台发布文章时,务必填写“关键词”字段,这是实现相关文章的基础。

步骤 2:编写嵌套模板代码

将以下代码放到你想要显示此列表的模板文件中(通常是 index.htm)。

<!-- 父列表:调用热门文章 -->
{dede:arclist flag='h' row='5' titlelen='40'}
    <div class="hot-news-item">
        <h2><a href="[field:arcurl/]">[field:title/]</a></h2>
        <p class="summary">[field:description function='cn_substr(@me, 100)'/]...</p>
        <!-- 子列表:调用当前文章的相关文章 -->
        {dede:arclist 
            addfields='keywords' 
            channelid='1' 
            row='3' 
            titlelen='20' 
            keyword='[field:keywords/]'}
            <div class="related-news">
                <h4>相关文章</h4>
                <ul>
                    <li>
                        <a href="[field:arcurl/]">[field:title/]</a>
                    </li>
                    <!-- {dede:arclist} 会循环3次,显示3条相关文章 -->
                </ul>
            </div>
        {/dede:arclist}
    </div>
{/dede:arclist}

代码解析:

  1. 父列表 {dede:arclist flag='h' row='5'...}:

    • flag='h':调用带有“头条”属性的文章(即热门文章)。
    • row='5':只显示5条热门文章。
    • [field:title/][field:arcurl/]:这是父列表的变量,代表当前这条热门文章的标题和链接。
  2. 子列表 {dede:arclist addfields='keywords'...}:

    • addfields='keywords':这是最关键的一步!它告诉子列表:“请把父列表当前文章的 keywords 字段值拿过来,变成你可以用的变量。”
    • channelid='1':指定子列表调用的是“普通文章”模型的数据。
    • keyword='[field:keywords/]:这是子列表的查询条件,它的意思是“用从父列表传过来的 keywords 值作为关键词,去文章表中查找包含这些关键词的文章”。
    • row='3':每个父条目下,只显示3条相关文章。
    • [field:title/][field:arcurl/]:这里的 [field:*]子列表自己的循环变量,代表当前正在循环的“相关文章”的标题和链接,它们与父列表的变量不冲突。

常见问题与注意事项

  1. 变量冲突:忘记使用 addfields,导致内外层 [field:title] 混淆,这是90%的错误来源。
  2. channelid 错误:调用图集、软件等模型时,没有指定正确的 channelid,导致调用不到数据或调用错乱。
  3. 性能问题:嵌套 arclist 会对数据库进行多次查询,如果父列表 row 值很大(比如20),每个父条目下再调用5个子条目,那么总共会产生 20 * 5 = 100 次查询(实际是 1 + 20 = 21 次查询,但循环次数多),这会对服务器造成较大压力。请谨慎使用,避免在大流量页面上进行深度嵌套。
  4. 关键词为空:如果父列表的文章没有填写关键词,keyword='' 将查询不到任何结果,子列表区域会空白。
  5. 循环次数控制:合理使用 row 属性来控制父列表和子列表的显示数量,避免页面过长。
  6. 命名空间隔离:从织梦V5.6开始,官方推荐使用 [field:全局变量名/] 的方式来明确指定变量来源,以增强代码可读性和避免潜在冲突,在子列表中明确写成 [field:子列表标题/] 虽然语法不支持,但理解这个概念很重要——addfields 就是创建了一个新的命名空间。

进阶用法

除了 addfields,你还可以结合其他 arclist 属性实现更复杂的嵌套:

  • 按栏目嵌套
    {dede:arclist typeid='top' row='5'} <!-- 调用顶级栏目下的文章 -->
        <div>
            <h3>[field:typename/]</h3> <!-- 注意:这里要用[field:typename/]显示栏目名 -->
            {dede:arclist 
                addfields='typeid' 
                channelid='1' 
                row='5' 
                typeid='[field:typeid/]'}>
                <a href="[field:arcurl/]">[field:title/]</a>
            {/dede:arclist}
        </div>
    {/dede:arclist}

    注意:这种方式需要确保父列表能获取到 typeid 字段,并且子列表用 typeid='[field:typeid/]' 来指定栏目ID。

织梦 arclist 嵌套的核心就是 “数据传递”“作用域隔离”

  • 数据传递:通过 addfields 将父列表条目的特定字段(如 keywords, typeid)传递给子列表。
  • 作用域隔离:子列表通过 channelid 确定数据源,并通过 keywordtypeid 等属性利用传递来的数据进行查询,从而在各自的循环中使用独立的 [field:*] 变量。

掌握 addfieldschannelid 的用法,你就能灵活应对绝大多数需要复杂列表布局的织梦开发需求。

-- 展开阅读全文 --
头像
dede如何删除添加的全局变量
« 上一篇 01-02
seo 织梦5.7 seo
下一篇 » 01-02

相关文章

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

目录[+]