dede:field 是 DedeCMS 模板中最核心、最常用的标签之一,主要用于获取并显示数据库中某个字段的值,它的强大之处在于不仅可以直接显示字段,还支持通过特定属性进行格式化、转换和简单的计算。

dede:field 的基本用法
最简单的用法是直接获取一个字段并显示:
{dede:field.title/} // 显示文章标题
{dede:field.pubdate function='MyDate(@me, 'Y-m-d')'/} // 显示文章发布日期,并格式化
这里的 @me 是一个非常重要的内置变量,它代表当前正在处理的字段值,所有函数和计算都是基于 @me 进行的。
dede:field 的核心功能:计算与格式化
dede:field 的计算功能主要通过其 function 属性实现。function 属性允许你传入一个 PHP 函数或自定义函数来处理 @me 的值。
日期/时间计算
这是最常见的计算场景,比如显示“X天前”或格式化日期。

示例1:显示“X天前”
假设 pubdate 字段是时间戳,我们想显示“3天前”这样的格式。
{dede:field.pubdate function='GetDateMk(@me)'/}
这里的 GetDateMk() 是 DedeCMS 的一个内置函数,它会自动将时间戳转换为类似 "3天前"、"1小时前" 的格式。
示例2:自定义日期格式
将 pubdate 格式化为 年-月-日 时:分。
{dede:field.pubdate function='strftime("%Y-%m-%d %H:%M", @me)'/}
这里使用了 PHP 原生的 strftime() 函数。

示例3:计算文章发布至今的天数 这是一个稍微复杂的计算,我们需要写一个自定义函数。
步骤:
a. 在 /include/extend.func.php 文件中添加一个自定义函数(如果文件不存在,可以创建一个)。
// 文件路径:/include/extend.func.php
if (!function_exists('DaysAgo')) {
function DaysAgo($pubdate) {
// $pubdate 是发布时的时间戳
$now = time(); // 获取当前时间戳
$time_diff = $now - $pubdate;
// 计算天数
$days = floor($time_diff / (3600 * 24));
return $days . '天前';
}
}
b. 在模板中调用这个函数:
{dede:field.pubdate function='DaysAgo(@me)'/}
数值计算
常用于处理点击量、价格、评分等字段。
示例1:给点击量加上单位
假设 click 字段是点击数,想在后面加上“次”。
浏览:{dede:field.click/} 次
或者使用函数更灵活地处理:
{dede:field.click function='(@me . " 次")'/}
示例2:价格格式化
假设 price 字段是价格(如 99.8),想格式化为 ¥99.80。
价格:{dede:field.price function='sprintf("¥%.2f", @me)'/}
这里使用了 PHP 的 sprintf() 函数来格式化浮点数。
示例3:计算折扣价
假设原价是 price,折扣是 discount (如 0.8),计算折扣价。
步骤:
a. 在 /include/extend.func.php 中添加函数:
if (!function_exists('GetDiscountPrice')) {
function GetDiscountPrice($price, $discount) {
// 防止 @me 为空导致错误
if (empty($price)) return 0;
return $price * $discount;
}
}
b. 在模板中调用,注意:这里需要传入两个字段,@me 只能代表第一个,我们可以用另一个技巧,在循环外定义变量。
{dede:field name='price' id='original_price'/} // 先把价格存入变量
{dede:field name='discount' id='discount_rate'/} // 再把折扣存入变量
折扣价:{dede:var name='original_price' function='GetDiscountPrice(@me, "'.$discount_rate.'")'/}
注意:这种多字段计算在 DedeCMS 中比较麻烦,更推荐使用下面的 dede:php
字符串处理
示例1:截取文章摘要
description 字段可能很长,我们只想显示前 100 个字符。
{dede:field.description function='cn_substr(@me, 100)'/}
cn_substr() 是 DedeCMS 的一个函数,用于支持中英文字符的截取。
示例2:移除 HTML 标签
body 或 description 字段包含 HTML 标签,想在摘要中显示纯文本。
{dede:field.description function='htmlspecialchars(strip_tags(@me))'/}
这里用到了 PHP 的 strip_tags() (移除标签) 和 htmlspecialchars() (转义HTML字符) 函数。
更强大的计算方式:dede:php
当 dede:field 的 function 属性无法满足复杂的计算逻辑时,我们可以使用 dede:php 标签,它可以在模板中直接执行 PHP 代码,灵活性极高。
示例:计算折扣价(比 field 方便得多)
{dede:php}
$price = $fields['price']; // 通过 $fields 数组获取当前文章的所有字段
$discount = $fields['discount'];
$discount_price = $price * $discount;
echo '折扣价:¥' . number_format($discount_price, 2);
/dede:php}
说明:
- 在
dede:php 标签内部,当前文章的所有字段都存储在 $fields 这个关联数组中。
- 你可以在这里写任何复杂的 PHP 逻辑,如循环、判断、调用数据库等。
echo 输出的内容会直接显示在页面上。
特殊字段的计算:arclist 和 list 标签中的 field
在 {dede:arclist} 和 {dede:list} 循环标签中,field 的用法稍有不同,但功能类似,它通常用于循环体内获取单篇文章的字段。
示例1:在列表页显示文章发布天数
{dede:arclist titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>发布于[field:pubdate function='GetDateMk(@me)'/]</span>
</li>
{/dede:arclist}
示例2:在列表页进行复杂计算
{dede:arclist titlelen='30'}
<li>
[field:title/]
<?php
// 这里直接使用 PHP
$click = $fields['click'];
if ($click > 1000) {
echo ' <span style="color:red;">(热门)</span>';
}
?>
</li>
{/dede:arclist}
在 arclist 或 list 标签的循环体内,直接写 PHP 代码也是被支持的,这比 dede:php 标签更简洁。
总结与最佳实践
需求场景
推荐标签/方法
优点
缺点
简单格式化 (如日期格式化、数字单位)
dede:field.function
代码简洁,模板逻辑清晰
功能有限,无法处理复杂逻辑
复杂计算 (如多字段运算、条件判断)
dede:php 或直接在 arclist/list 中写 PHP
功能强大,灵活性最高
模板中混入 PHP,可读性稍差,对新手不友好
可复用的格式化/计算
自定义函数 + extend.func.php
代码复用性高,便于维护
需要修改核心文件,对模板制作人员有额外要求
核心要点:
@me 是灵魂:在 function 属性中,@me 代表当前字段的原始值。
- 善用内置函数:DedeCMS 提供了如
MyDate, cn_substr, GetDateMk 等很多实用函数,优先使用它们。
- 自定义函数是扩展:当内置函数不够用时,在
extend.func.php 中添加自己的函数是最佳实践。
dede:php 是大招:对于无法用 function 解决的复杂问题,果断使用 dede:php
- 保持模板整洁:尽量将复杂的逻辑处理放在函数中,而不是在模板里写大量的 PHP 代码,以保持模板的清晰和可维护性。
当 dede:field 的 function 属性无法满足复杂的计算逻辑时,我们可以使用 dede:php 标签,它可以在模板中直接执行 PHP 代码,灵活性极高。
示例:计算折扣价(比 field 方便得多)
{dede:php}
$price = $fields['price']; // 通过 $fields 数组获取当前文章的所有字段
$discount = $fields['discount'];
$discount_price = $price * $discount;
echo '折扣价:¥' . number_format($discount_price, 2);
/dede:php}
说明:
- 在
dede:php标签内部,当前文章的所有字段都存储在$fields这个关联数组中。 - 你可以在这里写任何复杂的 PHP 逻辑,如循环、判断、调用数据库等。
echo输出的内容会直接显示在页面上。
特殊字段的计算:arclist 和 list 标签中的 field
在 {dede:arclist} 和 {dede:list} 循环标签中,field 的用法稍有不同,但功能类似,它通常用于循环体内获取单篇文章的字段。
示例1:在列表页显示文章发布天数
{dede:arclist titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>发布于[field:pubdate function='GetDateMk(@me)'/]</span>
</li>
{/dede:arclist}
示例2:在列表页进行复杂计算
{dede:arclist titlelen='30'}
<li>
[field:title/]
<?php
// 这里直接使用 PHP
$click = $fields['click'];
if ($click > 1000) {
echo ' <span style="color:red;">(热门)</span>';
}
?>
</li>
{/dede:arclist}
在 arclist 或 list 标签的循环体内,直接写 PHP 代码也是被支持的,这比 dede:php 标签更简洁。
总结与最佳实践
| 需求场景 | 推荐标签/方法 | 优点 | 缺点 |
|---|---|---|---|
| 简单格式化 (如日期格式化、数字单位) | dede:field.function |
代码简洁,模板逻辑清晰 | 功能有限,无法处理复杂逻辑 |
| 复杂计算 (如多字段运算、条件判断) | dede:php 或直接在 arclist/list 中写 PHP |
功能强大,灵活性最高 | 模板中混入 PHP,可读性稍差,对新手不友好 |
| 可复用的格式化/计算 | 自定义函数 + extend.func.php |
代码复用性高,便于维护 | 需要修改核心文件,对模板制作人员有额外要求 |
核心要点:
@me是灵魂:在function属性中,@me代表当前字段的原始值。- 善用内置函数:DedeCMS 提供了如
MyDate,cn_substr,GetDateMk等很多实用函数,优先使用它们。 - 自定义函数是扩展:当内置函数不够用时,在
extend.func.php中添加自己的函数是最佳实践。 dede:php是大招:对于无法用function解决的复杂问题,果断使用dede:php- 保持模板整洁:尽量将复杂的逻辑处理放在函数中,而不是在模板里写大量的 PHP 代码,以保持模板的清晰和可维护性。
