核心概念
runphp='yes' 的核心作用是:将指定字段的值作为 PHP 代码来执行,并将执行结果(通常是 echo 或 return 的内容)输出到模板中。

(图片来源网络,侵删)
它的基本语法是:
{dede:field name='字段名' runphp='yes'}
// 在这里写你的 PHP 代码
// 注意:PHP 代码块必须以 ?>
[/dede:field]
工作原理与关键点
name属性:指定你要获取哪个字段的值,这个值会作为 PHP 代码的输入。runphp='yes':开启 PHP 执行模式。- 代码执行环境:你的 PHP 代码是在一个受限的沙盒环境中执行的,DedeCMS 已经预先定义了一些全局变量和函数,方便你调用。
- 输出方式:有两种主要方式输出结果:
echo输出:直接使用echo或print函数将内容输出,这是最直接的方式。return返回:使用return语句将结果返回给 DedeCMS 的模板引擎。推荐使用这种方式,因为它更灵活,可以在代码中进行逻辑判断,然后返回不同的内容。
实战应用示例
下面通过几个常见的场景来理解它的用法。
示例 1:简单的字符串处理(截取、替换)
假设你有一个文章摘要字段 description太长,想在首页只显示前 50 个字符。
模板代码:

(图片来源网络,侵删)
{dede:field.description runphp='yes'}
$str = @me; // @me 是一个特殊变量,代表当前字段的原始值,即 field.description 的内容
$sub_str = cn_substr($str, 50); // 使用 DedeCMS 自带的 cn_substr 函数进行中文截取
@me = $sub_str; // 将处理后的结果重新赋值给 @me,模板会输出 @me 的值
{/dede:field.description}
代码解析:
$str = @me;:@me是核心变量,它代表了{dede:field.description}这个标签的原始值,你必须先把它赋给一个普通变量才能操作。cn_substr($str, 50);:调用 DedeCMS 的cn_substr函数进行安全的中文截取,防止乱码。@me = $sub_str;:将处理后的字符串重新赋值给@me,模板引擎最终会输出@me的值。
示例 2:根据字段值进行逻辑判断
假设你有一个自定义字段 flag,它的值可能是 1(热门)或 0(普通),你想根据这个值显示不同的文字或样式。
模板代码:
{dede:field name='flag' runphp='yes'}
if(@me == 1) {
@me = "<span class='hot-tag'>热门</span>";
} else {
@me = "<span class='normal-tag'>普通</span>";
}
{/dede:field.flag}
代码解析:

(图片来源网络,侵删)
- 使用
if...else...语句判断@me的值。 @me是1,就将一段 HTML 赋值给@me。- 否则,将另一段 HTML 赋值给
@me。 - 最终模板会渲染出对应的 HTML 标签。
示例 3:调用其他函数或获取其他变量
这是 runphp 最强大的地方,你可以在代码块内调用 DedeCMS 的全局函数或获取其他字段的值。
假设你想在文章列表页显示文章的发布时间,格式为 "Y-m-d H:i:s"。
模板代码:
{dede:field.pubdate runphp='yes'}
// 使用 date() 函数格式化时间戳
// @me 在这里是 pubdate 字段的时间戳
@me = date('Y-m-d H:i:s', @me);
{/dede:field.pubdate}
代码解析:
@me在这里是pubdate字段的值,它是一个 Unix 时间戳。- 使用 PHP 原生的
date()函数将其格式化为我们想要的字符串格式。 - 将格式化后的字符串重新赋值给
@me进行输出。
示例 4:使用 return 语句(更推荐)
当你的逻辑比较复杂,或者需要在一个 if 语句中返回不同内容时,使用 return 会更清晰。
场景:如果文章有缩略图(litpic 字段不为空),则显示缩略图,否则显示一个默认图片。
模板代码:
{dede:field name='litpic' runphp='yes'}
if(empty(@me) || @me == '/images/defaultpic.gif') {
// 如果缩略图为空或者是默认图,则返回默认图片路径
return '/images/no-image.jpg';
} else {
// 否则,返回原来的缩略图路径
return @me;
}
{/dede:field.litpic}
代码解析:
- 这里我们没有使用
@me = ...,而是直接使用return ...。 - 代码的执行结果就是
return的值。 - 这种写法在逻辑判断时更符合 PHP 的习惯,可读性更好。
常用 DedeCMS 全局变量和函数
在 runphp 代码块中,你可以使用以下预定义的变量和函数:
常用全局变量
@me:最重要的变量,代表当前标签的原始值。$dsql:DedeCMS 的数据库连接对象,可以直接用来进行数据库查询。$cfg_cmspath:网站根目录地址。$cfg_mainsite:网站主域名。$cfg_multi_site:是否开启多站点。
常用函数
cn_substr($str, $length):安全截取中文字符串。GetOneUrl($aid):根据文章 ID 获取文章链接。GetMeres($typeid, $row, $col,...`):获取相关文章。GetImage($img, $style=''):处理图片,如添加缩略图样式。
安全注意事项
runphp 虽然强大,但也带来了安全风险,因为它允许在模板中执行任意 PHP 代码。
-
防止 SQL 注入:如果使用
$dsql进行查询,一定要对用户输入或变量进行过滤和转义。// 安全做法 $aid = intval(@me); // 假设 @me 是一个 ID $row = $dsql->GetOne("SELECT title FROM dede_archives WHERE id = $aid"); @me = $row['title']; // 危险做法(不要这样做) $row = $dsql->GetOne("SELECT title FROM dede_archives WHERE id = '@me'"); -
防止 XSS 攻击:如果输出的内容可能包含用户提交的数据(如评论、文章内容),一定要进行转义。
// 安全做法 $content = htmlspecialchars(@me, ENT_QUOTES, 'UTF-8'); @me = $content; // 或者使用 DedeCMS 自带的函数 @me = htmlspecialchars(@me);
-
权限控制:确保只有有权限的管理员或可信的用户才能编辑包含
runphp='yes'的模板,不要在前台用户可以提交内容并直接展示的地方滥用此功能。
| 特性 | 说明 |
|---|---|
| 用途 | 在模板中执行 PHP 代码,实现动态数据处理和逻辑判断。 |
| 核心变量 | @me,代表当前标签的原始值。 |
| 输出方式 | @me = '...' 或 return '...'。return 在复杂逻辑中更推荐。 |
| 优势 | 灵活性极高,能实现很多标签本身无法完成的功能。 |
| 风险 | 安全性较低,容易引入 SQL 注入、XSS 等漏洞。 |
| 最佳实践 | 只在必要时使用,对用户输入进行严格过滤和转义,优先使用 return 语句。 |
掌握了 runphp='yes' 的用法,你就能极大地提升 DedeCMS 模板的定制能力和开发效率。
