dede field 计算如何实现?

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

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

dede field 计算
(图片来源网络,侵删)

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天前”或格式化日期。

dede field 计算
(图片来源网络,侵删)

示例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() 函数。

dede field 计算
(图片来源网络,侵删)

示例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 标签 bodydescription 字段包含 HTML 标签,想在摘要中显示纯文本。

{dede:field.description function='htmlspecialchars(strip_tags(@me))'/}

这里用到了 PHP 的 strip_tags() (移除标签) 和 htmlspecialchars() (转义HTML字符) 函数。


更强大的计算方式:dede:php

dede:fieldfunction 属性无法满足复杂的计算逻辑时,我们可以使用 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 输出的内容会直接显示在页面上。

特殊字段的计算:arclistlist 标签中的 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}

arclistlist 标签的循环体内,直接写 PHP 代码也是被支持的,这比 dede:php 标签更简洁。


总结与最佳实践

需求场景 推荐标签/方法 优点 缺点
简单格式化 (如日期格式化、数字单位) dede:field.function 代码简洁,模板逻辑清晰 功能有限,无法处理复杂逻辑
复杂计算 (如多字段运算、条件判断) dede:php 或直接在 arclist/list 中写 PHP 功能强大,灵活性最高 模板中混入 PHP,可读性稍差,对新手不友好
可复用的格式化/计算 自定义函数 + extend.func.php 代码复用性高,便于维护 需要修改核心文件,对模板制作人员有额外要求

核心要点:

  1. @me 是灵魂:在 function 属性中,@me 代表当前字段的原始值。
  2. 善用内置函数:DedeCMS 提供了如 MyDate, cn_substr, GetDateMk 等很多实用函数,优先使用它们。
  3. 自定义函数是扩展:当内置函数不够用时,在 extend.func.php 中添加自己的函数是最佳实践。
  4. dede:php 是大招:对于无法用 function 解决的复杂问题,果断使用 dede:php
  5. 保持模板整洁:尽量将复杂的逻辑处理放在函数中,而不是在模板里写大量的 PHP 代码,以保持模板的清晰和可维护性。

-- 展开阅读全文 --
头像
C语言代码region是什么?有什么作用?
« 上一篇 今天
dede nginx配置如何正确设置?
下一篇 » 今天

相关文章

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