dede列表页调用自定义字段

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

下面我将为你详细讲解如何实现,从简单到复杂,并提供不同情况下的解决方案。

dede列表页调用自定义字段
(图片来源网络,侵删)

核心原理

列表页调用自定义字段的核心原理是:

  1. 修改列表页模板:在 list_article.htm 模板文件中,找到循环内容的标签 {dede:list}
  2. 获取字段值:在 {dede:list} 循环内部,使用专门的标签来获取当前文章的自定义字段值,这个标签不是像内容页那样直接用 [field:自定义字段名/],而是需要调用PHP函数来获取。

使用 GetArcyv() 函数(最常用、最推荐)

这是最标准、最安全的方法,适用于大多数情况。

步骤 1:确保自定义字段已正确创建并添加到模型

  1. 登录DedeCMS后台。
  2. 进入「核心」 -> 「内容模型管理」。
  3. 找到你正在使用的模型(文章模型”),点击「更改」或「字段管理」。
  4. 在字段管理中,确保你的自定义字段已经创建,并且勾选了“使字段在列表页可以调用”这一项,这是非常关键的一步!

步骤 2:修改列表页模板 list_article.htm

  1. 使用FTP或文件管理器,找到你的模板目录下的 list_article.htm 文件。
  2. 打开该文件,找到 {dede:list}
  3. {dede:list} 循环内部,使用以下语法来调用自定义字段:
{dede:list pagesize='20'}
    <li>
        <!-- 调用文章标题 -->
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 调用文章摘要 -->
        <p>[field:description function='cn_substr(@me,100)'/]...</p>
        <!-- 调用自定义字段,我们创建了一个叫 "shuxing1" 的字段 -->
        <span>自定义字段1的值是:[field:id function="GetArcyv(@me, 'shuxing1')"/]</span>
        <!-- 调用另一个自定义字段,我们创建了一个叫 "price" 的字段 -->
        <span>价格:[field:id function="GetArcyv(@me, 'price')"/]</span>
        <!-- 调用自定义字段(单选/多选类型),一个叫 "leixing" 的字段 -->
        <span>类型:[field:id function="GetArcyv(@me, 'leixing')"/]</span>
        <!-- 调用自定义字段(图片类型),一个叫 "tuwen" 的字段 -->
        <!-- 注意:图片字段通常返回的是图片路径,需要加上网站根目录 -->
        <img src="[field:id function="GetArcyv(@me, 'tuwen')"/]" alt="图片" />
    </li>
{/dede:list}

语法解析:

  • [field:id function="GetArcyv(@me, '字段名')"]
    • field:id:这里的 id 是一个占位符,它代表当前循环中的文章ID。@me 会自动替换为这个ID。
    • function="...":这是调用PHP函数的指令。
    • GetArcyv():这是DedeCMS专门用于从附加表获取自定义字段值的函数。
    • '字段名':就是你后台创建的字段名(英文),shuxing1, price 等。

步骤 3:更新列表页缓存

修改完模板后,回到后台的「生成」 -> 「更新HTML」:

dede列表页调用自定义字段
(图片来源网络,侵删)
  • 选择「更新列表页」。
  • 点击“开始生成”。

系统会重新解析模板并生成新的列表页,这样你才能看到效果。


使用 array 循环(适用于需要复杂逻辑或更多字段)

如果你的列表页需要调用非常多的自定义字段,或者需要一些复杂的判断逻辑,可以使用 array 循环的方式,这种方法更灵活,但代码稍多。

步骤 1:与方法一相同

确保自定义字段已创建并勾选了“使字段在列表页可以调用”

步骤 2:修改列表页模板 list_article.htm

{dede:list} 标签替换为 {dede:arclist},并设置 typeidaddfields 参数。

dede列表页调用自定义字段
(图片来源网络,侵删)
{dede:arclist typeid='0' addfields='shuxing1,price,leixing,tuwen' pagesize='20'}
    <li>
        <!-- 调用文章标题 -->
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 调用自定义字段 -->
        <!-- 这种方式下,可以直接使用 [field:字段名/] -->
        <span>自定义字段1的值是:[field:shuxing1/]</span>
        <span>价格:[field:price/]</span>
        <span>类型:[field:leixing/]</span>
        <!-- 调用图片字段 -->
        <img src="[field:tuwen/]" alt="图片" />
        <!-- 你还可以在这里加入其他判断 -->
        [field:price runphp='yes']
            if(@me > 100) {
                @me = "<b style='color:red;'>高价:".@me."</b>";
            } else {
                @me = "平价:".@me;
            }
        [/field:price]
    </li>
{/dede:arclist}

语法解析:

  • {dede:arclist ...}:使用 arclist 标签来模拟列表页。
  • typeid='0':表示调用所有栏目,如果只想调用特定栏目,填入栏目ID。
  • addfields='shuxing1,price,leixing,tuwen'这是关键参数!它告诉系统在列表查询时,需要从附加表中查询哪些自定义字段,字段名之间用英文逗号隔开。
  • [field:字段名/]:一旦在 addfields 中声明了字段,就可以像调用普通字段一样直接使用。

步骤 3:更新列表页缓存

与方法一相同,更新列表页HTML。


常见问题与注意事项

  1. 为什么我的自定义字段在列表页显示为空?

    • 最常见原因:在后台「内容模型管理」的字段管理中,忘记勾选“使字段在列表页可以调用”,请检查并勾选,然后更新缓存。
    • 字段名错误:检查模板中 GetArcyv() 函数里的字段名是否与后台创建的字段名完全一致(区分大小写)。
    • 缓存问题:确保已经重新生成了列表页。
  2. GetArcyv()addfields 方法有什么区别?

    • GetArcyv():按需调用,每调用一次,就会执行一次数据库查询,如果调用次数多,可能会对性能有轻微影响,但代码更直观,适合少量字段。
    • addfields:批量查询,在查询列表时就把所有需要的自定义字段一次性取出来,后续直接使用,性能更好,适合需要调用多个自定义字段的场景,但需要预先知道所有要用到的字段。
  3. 自定义字段是图片,为什么图片不显示?

    • GetArcyv()addfields 返回的通常是相对路径,如 /uploads/allimg/202510/abc.jpg

    • 在模板中,最好使用 [field:全局变量名/] 来获取网站根目录,然后拼接路径。

      <!-- 错误方式 -->
      <img src="[field:id function="GetArcyv(@me, 'tuwen')"/]" />
      <!-- 正确方式 -->
      <img src="{dede:global.cfg_basehost/}[field:id function="GetArcyv(@me, 'tuwen')"/]" />

      {dede:global.cfg_basehost/} 会输出你的网站域名,如 http://www.yoursite.com

  4. 调用单选/多选框的值显示的是选项ID而不是文字怎么办?

    • 这是因为 GetArcyv() 默认返回的是选项的值(value),如果你需要显示选项的文字(label),通常需要自己写PHP函数进行转换,或者在后台模型设置中,将字段的“录入方式”设置为“文本框”,而不是“单选/多选框”。
方法 适用场景 优点 缺点
GetArcyv() 调用少量自定义字段,代码直观。 灵活,按需调用,无需预定义字段列表。 调用频繁时可能影响性能。
addfields 需要在列表页调用多个自定义字段。 性能更好,一次性获取所有数据。 需要预先知道所有字段名,不够灵活。

对于绝大多数用户来说,方法一 (GetArcyv()) 是最简单、最通用的解决方案,强烈建议从它开始尝试。

-- 展开阅读全文 --
头像
findrecord c语言
« 上一篇 02-02
C语言中PostMessage如何正确使用?
下一篇 » 02-02
取消
微信二维码
支付宝二维码