dede arclist标签内如何直接运行PHP代码?

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

{dede:arclist} 是 DedeCMS 最核心、最常用的列表标签,用于调用文章列表,虽然它本身不是一个“执行任意PHP代码”的标签,但 DedeCMS 提供了多种方式,让我们可以在 {dede:arclist} 的循环体内,或者在获取数据后,灵活地嵌入和执行 PHP 逻辑。

dede arclist运行php
(图片来源网络,侵删)

我将从“简单直接”到“复杂高级”的顺序,为你介绍几种最常用和最有效的方法。


使用 arrayrunphp 属性(最推荐,最灵活)

这是在 {dede:arclist} 标签内执行 PHP 代码最核心、最强大的方法,它不需要修改模板文件,完全在标签内部完成。

核心思路:

  1. 使用 array 屽数据库查询的 SELECT 语句,只选择你需要的字段。
  2. 使用 runphp='yes' 属性来启用 PHP 代码执行。
  3. item 属性中定义一个变量名(phpcode),你的 PHP 代码将放在这个变量里。
  4. 在 PHP 代码中,可以使用 $fields 变量来访问当前文章的各个字段(如 id, title, arcurl 等)。

示例场景: 在文章列表中,显示文章的发布时间,并根据发布时间是否在7天内,显示“新”标签。

dede arclist运行php
(图片来源网络,侵删)

模板代码 (index.htm):

<ul>
  {dede:arclist typeid='1' titlelen='30' row='10' array='id,title,senddate,arcurl' runphp='yes'}
    <li>
      <a href="[field:arcurl/]">[field:title/]</a>
      [field:phpcode/]
    </li>
  {/dede:arclist}
</ul>

代码解析:

  1. {dede:arclist ... runphp='yes'}: 启用PHP运行模式。
  2. array='id,title,senddate,arcurl': 明确告诉 DedeCMS 从数据库中只查询这四个字段,可以提高效率。
  3. [field:phpcode/]: 这是一个占位符,{dede:arclist} 标签会将其替换为 item="phpcode" 中定义的PHP代码的执行结果。
  4. item='phpcode': 定义PHP代码块的变量名为 phpcode,注意,这里的 phpcode 是我们自己定义的,可以换成任何你喜欢的名字,myphp, custom_code 等。

item 属性中的PHP代码:

// $fields 是一个数组,包含了当前文章的所有字段
//  $fields['id'], $fields['title'], $fields['senddate']
// 获取当前文章的发布时间戳
$senddate = $fields['senddate'];
// 计算7天前的时间戳
$sevenday_ago = time() - (7 * 24 * 3600);
// 判断发布时间是否在7天内
if ($senddate > $sevenday_ago) {
    // 如果是,返回一个红色的“新”标签
    $result = ' <span style="color:red; font-weight:bold;">[新]</span>';
} else {
    // 否则,返回空字符串
    $result = '';
}
// 必须输出或返回最终结果
echo $result;

最终效果: 对于7天内发布的文章,标题后面会显示一个红色的 [新]


使用 php 标签(适用于循环外的逻辑)

如果你需要在 {dede:arclist} 循环之外执行一些PHP代码(在调用列表前先获取一些变量),你可以直接在模板中使用 DedeCMS 的 {dede:php}

示例场景: 先获取一个特定分类的ID,然后再用这个ID去调用文章列表。

dede arclist运行php
(图片来源网络,侵删)

模板代码 (index.htm):

{dede:php}
    // 假设我们通过某种方式(比如URL参数)得到了分类ID
    $typeid = isset($_GET['tid']) ? (int)$_GET['tid'] : 1;
    // 将这个ID赋值给一个PHP变量,或者将其设置为全局变量
    // 这里我们将其设置为全局变量,以便在arclist标签中可以使用
    $GLOBALS['typeid_for_list'] = $typeid;
{/dede:php}
<h2>分类ID为 {$typeid_for_list} 的文章列表</h2>
<ul>
  {dede:arclist typeid='{$typeid_for_list}' row='5'}
    <li><a href="[field:arcurl/]">[field:title/]</a></li>
  {dede:arclist}
</ul>

注意:

  • {dede:php} 标签可以执行任意PHP代码,但使用时要非常小心,避免引入安全风险(如SQL注入、XSS等)。
  • 它通常用于模板的顶部,进行一些初始化操作。

使用自定义函数(最规范、最推荐用于复杂逻辑)

如果你的PHP逻辑比较复杂,或者想在多个地方复用,最佳实践是创建一个自定义函数,然后在模板中调用它。

步骤:

  1. 创建自定义函数文件/include/extend.func.php 文件中添加你的PHP函数,如果这个文件不存在,你可以自己创建一个,DedeCMS 在解析模板时会自动加载这个文件。

    文件路径:/include/extend.func.php

    <?php
    /**
     * 检查文章是否为最新(7天内)
     * @param int $senddate 文章的发布时间戳
     * @return string 返回'[新]'标签或空字符串
     */
    function isNewArticle($senddate) {
        $sevenday_ago = time() - (7 * 24 * 3600);
        if ($senddate > $sevenday_ago) {
            return ' <span style="color:red; font-weight:bold;">[新]</span>';
        }
        return '';
    }
    ?>
  2. 在模板中调用自定义函数 现在你可以在任何模板文件中使用这个函数了,包括在 {dede:arclist}runphp 代码块中。

    模板代码 (index.htm):

    <ul>
      {dede:arclist typeid='1' titlelen='30' row='10' array='id,title,senddate,arcurl' runphp='yes'}
        <li>
          <a href="[field:arcurl/]">[field:title/]</a>
          [field:phpcode/]
        </li>
      {/dede:arclist}
    </ul>

    item 属性中的PHP代码(调用自定义函数):

    // 直接调用我们在 extend.func.php 中定义的函数
    // $fields['senddate'] 是当前文章的发布时间戳
    $result = isNewArticle($fields['senddate']);
    // 输出结果
    echo $result;

优点:

  • 代码复用:同一个函数可以在不同模板中重复使用。
  • 逻辑分离:将PHP逻辑与HTML模板分离,使模板更干净,更易于维护。
  • 性能更好:函数定义只加载一次,效率更高。

修改底层PHP文件(不推荐,用于极端情况)

这种方法非常强大,但破坏了DedeCMS的封装性,升级时可能会被覆盖,因此仅作为最后手段

示例场景: 你想在 {dede:arclist} 的底层文件中,为每条数据自动添加一个额外的字段。

步骤:

  1. 找到底层文件 {dede:arclist} 的底层逻辑通常在 /include/taglib/arclist.lib.php 文件中。

  2. 修改文件 打开 arclist.lib.php,找到获取数据并循环处理的部分(通常在一个 while 循环中),在循环内部,你可以添加自定义的PHP代码来修改 $row 数组(代表单条数据的数组)。

    示例(伪代码,非真实修改):

    // ... 在 while($row = $dsql->GetArray()) { ... } 循环内部 ...
    // 获取当前行的发布时间戳
    $senddate = $row['senddate'];
    // 调用我们的自定义函数(如果extend.func.php存在)
    if (function_exists('isNewArticle')) {
        $row['new_tag'] = isNewArticle($senddate);
    } else {
        $row['new_tag'] = ''; // 如果函数不存在,则设为空
    }
    // ... 循环继续 ...
  3. 在模板中使用新字段 修改后,你就可以在模板中直接使用这个新添加的字段了。

    {dede:arclist row='5'}
      <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        [field:newtag/]  <!-- 直接使用我们添加的新字段 -->
      </li>
    {/dede:arclist}

警告:

  • 升级风险:每次升级DedeCMS,这个文件都可能被覆盖,导致你的修改丢失。
  • 维护困难:代码逻辑与核心文件混合,难以排查问题。

总结与推荐

方法 优点 缺点 适用场景
array + runphp 灵活、强大、无需修改文件 PHP代码写在模板里,可能稍显杂乱 绝大多数需要在列表内执行PHP逻辑的场景
{dede:php} 可以执行任意代码,位置灵活 安全风险高,与模板混合 模板顶部的初始化、全局变量设置等
自定义函数 最规范、可复用、易维护 需要额外创建文件 逻辑复杂或需要在多处复用的场景
修改底层文件 功能最底层,效率可能最高 破坏性大,升级易丢失 极端性能优化或需要修改核心行为的场景

最终建议:

  • 对于在 {dede:arclist} 循环内执行简单到中等复杂度的PHP代码,首选 array + runphp
  • 对于复杂或可复用的逻辑,强烈推荐使用自定义函数,然后在 runphp 代码中调用它,这是最专业、最可持续的方案。
-- 展开阅读全文 --
头像
C语言struct option结构体如何解析命令行参数?
« 上一篇 2025-12-18
dede ucenter通信失败怎么办?
下一篇 » 2025-12-18

相关文章

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