dede arclist如何调用自定义字段?

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

核心原理

arclist 标签本身默认只调用系统常用的字段,如 id, title, arcurl, pubdate, litpic 等,要调用自定义字段,你需要明确告诉 arclist 标签:“我需要这个额外的字段”,然后系统才会去数据库里查询并返回它。

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

这个过程主要涉及两个关键属性:

  1. addfields: 指定你要调用的自定义字段名。
  2. channelid: 指定这些自定义字段属于哪个模型(频道),这是最关键的一步,因为不同模型的自定义字段是独立的。

操作步骤

假设你已经完成了以下准备工作:

  1. 在后台创建了自定义模型(一个名为“产品”的模型)。
  2. 在该模型中添加了自定义字段,price (价格)、brand (品牌)、specs (规格) 等。
  3. 使用这个“产品”模型发布了一些文章。

第1步:确定你的模型ID (channelid)

在调用 arclist 之前,你必须知道你的自定义模型对应的 频道ID

  • 如何查找?
    1. 登录 DedeCMS 后台。
    2. 进入【核心】 -> 【内容模型管理】。
    3. 在列表中找到你创建的自定义模型(产品”)。
    4. 查看该模型最左侧的 “ID” 列,这个数字就是你的 channelid,如果你的“产品”模型是第5个创建的,它的ID可能就是 5

第2步:编写 arclist 标签代码

你可以使用以下格式的 arclist 标签来调用自定义字段了。

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

基本语法:

{dede:arclist channelid='你的模型ID' addfields='字段名1,字段名2' row='10' titlelen='30'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 调用自定义字段 -->
        价格: [field:price/]
        品牌: [field:brand/]
    </li>
{/dede:arclist}

参数详解:

  • channelid='你的模型ID'

    • 必填,将 你的模型ID 替换为你在第一步中找到的数字ID。channelid='5',这一步至关重要,否则 addfields 不会生效。
  • addfields='字段名1,字段名2'

    • 必填,指定要调用的自定义字段名,多个字段用英文逗号 隔开,字段名必须是你在后台模型中精确设置的“字段名称”,而不是“字段别名”。addfields='price,brand,specs'
  • row='10'

    • 可选,表示调用多少条记录。 len='30'`
    • 可选,表示标题字符长度。
  • [field:自定义字段名/]

    • arclist 循环体内,使用这个格式来输出自定义字段的值。[field:price/]

完整示例

假设我们有一个“产品展示”栏目,它使用的是 ID 为 6 的自定义模型,该模型有三个自定义字段:

  • 字段名称: price (价格)
  • 字段名称: brand (品牌)
  • 字段名称: intro (简介)

我们想在首页调用这个栏目下的产品列表。

指定栏目ID (typeid) 并调用自定义字段

<h2>我们的产品</h2>
<ul>
    {dede:arclist 
        typeid='产品展示栏目的ID' 
        channelid='6' 
        addfields='price,brand,intro' 
        row='5' 
        titlelen='20'}
        <li>
            <h3><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h3>
            <p>品牌: [field:brand/]</p>
            <p>价格: ¥[field:price/] 元</p>
            <p class="intro">[field:intro/]</p>
        </li>
    {/dede:arclist}
</ul>

直接调用指定模型的所有文章(不限定栏目)

如果你不关心文章属于哪个栏目,只想调用所有使用了该模型的文章,可以省略 typeid

<h2>全部产品</h2>
<ul>
    {dede:arclist 
        channelid='6' 
        addfields='price,brand' 
        row='8'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a> - [field:brand/]
        </li>
    {/dede:arclist}
</ul>

常见问题与解决方案

问题1:为什么我加了 addfields 但自定义字段显示为空?

最可能的原因:忘记设置 channelidchannelid 错误。 arclist 需要知道去哪个数据表里找这些自定义字段。channelid 就是指路牌,请务必确保 channelid 的值是正确的。

问题2:channelidtypeid 有什么区别?

这是一个非常容易混淆的概念,请务必分清楚:

属性 全称 作用 关联对象
typeid 栏目ID 限定文章的来源,指定只调用某个或某几个栏目下的文章。 栏目 (如“产品展示”、“新闻中心”)
channelid 模型ID 限定文章的模型,指定只调用使用了某个自定义模型的文章,并使其自定义字段可用。 内容模型 (如“产品模型”、“下载模型”)

简单记忆:

  • typeid 回答的是:“从哪个栏目里取?
  • channelid 回答的是:“取哪种类型的文章?

在调用自定义字段时,channelid 是必需的,typeid 是可选的。

问题3:如何给自定义字段添加默认样式或格式化输出?

你可以使用 function 属性对字段值进行处理。

示例1:价格格式化(保留两位小数)

[field:price function='sprintf("%.2f", @me)'/]
  • @me 是 DedeCMS 的一个内置变量,代表当前字段的原始值。
  • sprintf() 是 PHP 的格式化函数。

示例2:截取简介长度

[field:intro function='cn_substr(@me, 100)'/]
  • cn_substr() 是 DedeCMS 的常用函数,用于截取中文字符串,避免乱码。

问题4:arclist 调用太慢,有替代方案吗?

对于需要调用大量自定义字段的场景,arclist 因为需要查询 dede_archives 表和额外的附加表,性能可能会下降,此时可以考虑使用 SQL 查询标签 {dede:sql}

{dede:sql} 的优势是直接写 SQL 语句,可以精确控制查询的字段和表,效率更高。

示例:使用 {dede:sql} 调用产品信息

假设你的产品模型ID是 6,附加表是 dede_addon6

{dede:sql sql="
    SELECT 
        a.id, a.title, a.litpic, a.pubdate,
        b.price, b.brand 
    FROM 
        dede_archives AS a 
    JOIN 
        dede_addon6 AS b ON a.id = b.aid 
    WHERE 
        a.channel = 6 
    ORDER BY 
        a.id DESC 
    LIMIT 0, 10
"}
    <li>
        <a href="/plus/view.php?aid=[field:id/]">[field:title/]</a>
        价格: [field:price/] 品牌: [field:brand/]
    </li>
{/dede:sql}
  • dede_archives 是主表,存放文章的基本信息。
  • dede_addon6 是附加表,6 是你的模型ID,存放自定义字段。
  • a.channel = 6 确保我们只查询模型ID为6的文章。

注意: 使用 {dede:sql} 需要你对 DedeCMS 的数据表结构有一定了解,并且要小心SQL注入风险(通常后台调用是安全的)。


  1. 核心:调用自定义字段必须同时使用
-- 展开阅读全文 --
头像
本地织梦与Dreamweaver如何关联使用?
« 上一篇 11-30
织梦htmlspecialchars在哪
下一篇 » 12-01

相关文章

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

目录[+]