这是一个非常强大且常用的功能,可以让模板实现很多复杂的逻辑,而无需修改 PHP 源文件。

(图片来源网络,侵删)
runphp 标签基础
runphp 是 DedeCMS 的一个特殊模板标签,它的作用是在模板渲染时执行一段 PHP 代码,并将代码的最终输出显示在页面上。
基本语法
{dede:runphp}
// 你的 PHP 代码
// echo $value; // 最后一定要用 echo 输出结果
{/dede:runphp}
核心要点:
- 代码块中写的是标准的 PHP 语法。
- 最后必须使用
echo或print来输出你想要显示在页面上的内容。 如果没有输出,标签位置将显示为空。 - 默认情况下,PHP 的安全模式是开启的,很多函数(如
file_get_contents,exec等)会被禁用,这是出于安全考虑。
变量作用域
在 runphp 块中,你可以访问到 DedeCMS 模板中的一些常用变量:
$GLOBALS: 全局变量数组,这是访问 DedeCMS 全局变量的关键。$GLOBALS['cfg_basehost']: 网站根目录 URL,如http://www.yoursite.com。$GLOBALS['cfg_cmspath']: CMS 安装目录,如/dedecms。$GLOBALS['cfg_templets_dir']: 模板目录。
$fields: 在循环标签(如{dede:arclist},{dede:loop})内部,$fields是一个数组,包含了当前记录的所有字段。- 在文章列表中,
$fields['id']是当前文章的 ID,$fields['title']是当前文章的标题。
- 在文章列表中,
$env: 当前环境变量,如typeid(当前栏目ID)等。
runphp 结合 SQL 查询
这是 runphp 最核心的用法之一,当模板需要的数据无法通过常规的 DedeCMS 标签直接获取时,就可以在 runphp 里手动执行 SQL 查询,然后处理并输出结果。

(图片来源网络,侵删)
执行 SQL 查询
在 runphp 中执行 SQL,主要通过 DedeCMS 提供的数据库操作类 dedesql。
// 1. 获取数据库实例
$dsql = $GLOBALS['dsql'];
// 2. 准备你的 SQL 语句
$sql = "SELECT id, title FROM `#@__archives` WHERE typeid = 10 ORDER BY id DESC LIMIT 5";
// 3. 执行查询
$rs = $dsql->Execute('me', $sql); // 'me' 是一个别名,用于后续的 fetch 操作
// 4. 遍历结果并处理
$items = '';
while ($row = $rs->GetArray()) {
$items .= "<a href='/plus/view.php?aid={$row['id']}'>{$row['title']}</a><br />";
}
// 5. 输出最终结果
echo $items;
代码解释:
$GLOBALS['dsql']: 这是 DedeCMS 全局数据库连接对象,可以直接拿来用。$dsql->Execute('alias', sql): 执行 SQL 查询。- 第一个参数
'me'是一个别名,在GetArray()方法中会用到,可以随便写,但必须是唯一的。 - 第二个参数是 SQL 语句。注意: DedeCMS 的表名前缀
#@__会被自动替换为你数据库中配置的前缀(如dede_),请务必使用#@__。
- 第一个参数
$rs->GetArray(): 从结果集中获取一行数据,并将其转换为关联数组,如果数据获取完毕,则返回false,因此非常适合用在while循环中。$row['id'],$row['title']: 通过列名访问数组中的数据。echo $items: 将拼接好的 HTML 字符串输出到模板中。
完整示例:调用指定栏目的最新5篇文章
假设你想在首页某个位置,调用 ID 为 3 的栏目的最新5篇文章,而首页默认没有这个栏目列表。
步骤 1:修改首页模板文件 (index.htm)
在你希望显示文章列表的地方,添加如下代码:
<div class="hot-articles">
<h3>栏目ID为3的最新文章</h3>
{dede:runphp}
// 1. 获取数据库连接
$dsql = $GLOBALS['dsql'];
// 2. 定义SQL
$sql = "SELECT id, title FROM `#@__archives` WHERE typeid = 3 ORDER BY id DESC LIMIT 5";
// 3. 执行查询
$rs = $dsql->Execute('me', $sql);
// 4. 遍历结果
$articleList = '<ul>';
while($row = $rs->GetArray())
{
// 获取文章链接
$arcUrl = GetOneArchive($row['id']);
$articleList .= "<li><a href='{$arcUrl['arcurl']}'>{$row['title']}</a></li>";
}
$articleList .= '</ul>';
// 5. 输出
echo $articleList;
{/dede:runphp}
</div>
代码优化点:
GetOneArchive($row['id']): 这是一个 DedeCMS 的内置函数,比手写plus/view.php?aid=xxx更推荐,因为它能正确处理文章的静态/动态链接。
步骤 2:生成首页
保存模板文件后,登录 DedeCMS 后台,点击 “生成” -> “主页HTML” -> “更新主页”,让新的模板代码生效。
现在访问你的首页,就能看到指定栏目的最新文章列表了。
进阶用法与注意事项
单条数据查询
如果你只想查询一条记录(例如获取网站配置),可以使用 GetOne() 方法。
{dede:runphp}
$dsql = $GLOBALS['dsql'];
$row = $dsql->GetOne("SELECT value FROM `#@__sysconfig` WHERE varname = 'cfg_webname'");
if(is_array($row)) {
echo "网站名称是:" . $row['value'];
} else {
echo "未能获取网站名称";
}
{/dede:runphp}
安全性考虑
- SQL 注入:SQL 语句中的参数来自用户输入(如 URL、表单),必须进行过滤。
$dsql对象提供了EscapeString()方法。$typeid = intval($_GET['typeid']); // 最简单的方式,确保是整数 // 或者 $typeid = $dsql->GetOne("SELECT id FROM `#@__arctype` WHERE typename LIKE '{$typename}'"); $typeid = is_numeric($typeid) ? $typeid : 1; // 确保是数字 - 代码执行:
runphp是一把双刃剑,不要在模板中写过于复杂的业务逻辑,也不要引入不安全的第三方代码,保持模板的简洁性。
性能考虑
runphp中的 SQL 查询是在每次页面加载时执行的,如果页面被大量用户同时访问,或者查询非常复杂,可能会对数据库造成压力。- 对于频繁访问但数据不常变动的模块,可以考虑使用 DedeCMS 的缓存机制,查询数据后,将结果序列化存入缓存文件,下次访问时先读取缓存,这需要你对 PHP 文件操作有一定了解。
调试技巧
runphp 代码没有按预期工作,可以尝试使用 var_dump() 和 <pre> 标签来调试。
{dede:runphp}
$dsql = $GLOBALS['dsql'];
$typeid = 3;
$sql = "SELECT * FROM `#@__archives` WHERE typeid = {$typeid} LIMIT 1";
// 调试:打印 SQL 语句
echo '<!-- SQL: ' . htmlspecialchars($sql) . ' -->';
$rs = $dsql->Execute('me', $sql);
// 调试:打印查询结果
if($rs){
$row = $rs->GetArray();
echo '<pre>';
var_dump($row);
echo '</pre>';
} else {
echo '查询无结果或执行失败。';
}
// 你的正式代码...
{/dede:runphp}
查看页面源码,你会看到注释中的 SQL 和 <pre> 标签格式化的数组,这能帮你快速定位问题。
| 功能 | 代码示例 | 说明 |
|---|---|---|
| 基础执行 | {dede:runphp}echo 'Hello World';{/dede:runphp} |
执行简单 PHP 并输出。 |
| 访问全局变量 | {dede:runphp}echo $GLOBALS['cfg_basehost'];{/dede:runphp} |
输出网站域名。 |
| 访问循环字段 | {dede:arcpy}<li>{dede:runphp}echo $fields['id'];{/dede:runphp}</li>{/dede:arclist} |
在列表中输出当前文章 ID。 |
| 执行 SQL 查询 | 见上文完整示例 | 在 runphp 中通过 $dsql 执行 SQL 并处理结果。 |
| 获取单条数据 | 见上文单条数据查询示例 | 使用 $dsql->GetOne() 获取一行数据。 |
掌握 runphp 和 SQL 的结合使用,能让你在 DedeCMS 的模板定制中游刃有余,实现各种个性化、复杂化的数据展示需求。
