DedeCMS 提供了多种方式来执行 PHP 代码,从最简单直接到最推荐、最安全的方式,我会逐一为你介绍。

核心思想
DedeCMS 的模板引擎本质上是一个解析器,它会扫描模板文件(.htm),找到特定的标签(如 {dede:arclist}),然后执行对应的 PHP 逻辑,最后将结果替换回标签位置,我们嵌套 PHP 代码,就是利用了这个解析过程,让它在特定位置执行我们自定义的 PHP 脚本。
直接使用 {dede:php} 标签(最直接,但不推荐用于生产环境)
这是最简单的方法,直接在模板中写 PHP 代码。
语法:
{dede:php}
// 你的 PHP 代码
{/dede:php}
示例: 假设你想在首页显示当前服务器的 PHP 版本。

{dede:php}
echo '当前 PHP 版本: ' . phpversion();
{/dede:php}
注意事项:
- 安全性极差:如果网站有上传漏洞,攻击者可以上传一个包含
{dede:php}的模板文件,从而在服务器上执行任意 PHP 代码,这是非常危险的。 - 破坏模板结构:这种方式会让模板文件变得混乱,难以维护,前端开发人员可能会看不懂这些 PHP 代码。
- 适用场景:仅限于本地测试、个人学习或你完全信任的、绝对封闭的开发环境,强烈不建议在正式上线的网站上使用。
使用 {dede:func} 标调用自定义函数(推荐)
这是最安全、最规范、最推荐的方法,它的核心思想是:将 PHP 代码写在 DedeCMS 的核心函数库文件中,然后在模板中通过 {dede:func} 标签来调用它。
步骤:
-
创建自定义函数 在 DedeCMS 的
include目录下,找到helpers.helper.php文件,这个文件专门用来存放全局可用的辅助函数。 在文件末尾添加你的 PHP 函数,我们创建一个函数来获取一个随机的励志名言。
(图片来源网络,侵删)// 文件路径: /include/helpers.helper.php // ... 文件中原有的代码 ... /** * 获取一条随机的励志名言 * @return string */ function get_random_inspirational_quote() { $quotes = array( "生活不是等待暴风雨过去,而是学会在雨中跳舞。", "成功不是终点,失败也不是末日,最重要的是继续前进的勇气。", "你的唯一限制就是你自己内心的限制。" ); // 从数组中随机获取一个元素 $random_quote = $quotes[array_rand($quotes)]; return $random_quote; } -
在模板中调用函数 在你的模板文件(如
index.htm)中,使用{dede:func}标签来调用这个函数。<div class="daily-quote"> <h3>今日一言</h3> <p>{dede:func function='get_random_inspirational_quote'/}</p> </div>解析后,模板引擎会执行
get_random_inspirational_quote()函数,并将返回的字符串显示在<p>标签内。
优点:
- 安全性高:PHP 代码在服务器端的核心文件中,无法通过模板上传等方式被篡改。
- 逻辑与表现分离:PHP 代码(逻辑)和 HTML 结构(表现)完全分开,代码结构清晰,易于维护。
- 可复用:定义好的函数可以在任何模板中通过
{dede:func}调用。
使用 {dede:global} 标签配合 PHP 文件(适用于复杂逻辑)
如果你的 PHP 逻辑非常复杂,或者需要用到 DedeCMS 的全局变量(如 $GLOBALS),你可以创建一个独立的 PHP 文件,然后在模板中通过 {dede:global} 的 phpfile 属性来引入并执行它。
步骤:
-
创建独立的 PHP 文件 在网站根目录下创建一个文件夹,
myphp,然后在里面创建一个文件,get_user_info.php。/myphp/get_user_info.php文件内容:<?php // 必须包含 DedeCMS 的核心入口文件,以获得所有环境变量和类 require_once(dirname(__FILE__) . "/include/common.inc.php"); // 现在你可以使用 DedeCMS 的所有变量和函数了 // 获取当前登录的用户信息(如果已登录) $member_id = $cfg_ml->M_ID; // 获取当前会员ID $member_name = $cfg_ml->M_UserName; // 获取当前会员名 // 定义要输出的变量 $output = ''; if ($member_id > 0) { $output = "欢迎回来," . $member_name . "!"; } else { $output = "您尚未登录,请先登录。"; } // 将结果输出,这个结果将被 {dede:global} 标签捕获 echo $output; ?> -
在模板中引入 PHP 文件 在你的模板文件中,使用
{dede:global}标签的phpfile属性。<div class="user-status"> {dede:global name='user_status' phpfile='myphp/get_user_info.php'/} </div>工作原理:
- 模板引擎解析
{dede:global}标签时,会发现phpfile属性。 - 它会执行
myphp/get_user_info.php这个文件。 - PHP 文件
echo输出的内容,会被{dede:global}标签捕获并显示在模板中。
- 模板引擎解析
优点:
- 功能强大:可以执行非常复杂的 PHP 逻辑,并且能完整访问 DedeCMS 的所有全局变量和数据库。
- 代码组织:将复杂的逻辑块独立成文件,方便管理。
缺点:
- 相比
{dede:func}稍微复杂一点,需要创建额外的文件。
使用 runphp='yes' 属性(适用于循环标签内)
这个方法主要用于在 DedeCMS 的循环标签(如 {dede:arclist}, {dede:loop})内部执行 PHP 代码来处理单个字段的数据。
语法:
在循环标签的字段标签上,添加 runphp='yes' 属性。
示例:
假设文章列表中有一个自定义字段 color,存储的是颜色值(如 red, blue),我们想在列表中根据这个值设置文字颜色。
-
在后台添加自定义字段
color。 -
在文章列表模板中:
{dede:arclist titlelen='30' row='10'} <li> <a href="[field:arcurl/]">[field:title/]</a> <!-- 使用 runphp 处理 color 字段 --> <span style="color: [field:color runphp='yes'] $color = @me; // @me 代表当前字段的原始值,这里是 'red' if ($color == 'red') { @me = '#ff0000'; // 如果是 red,输出十六进制颜色码 } elseif ($color == 'blue') { @me = '#0000ff'; } else { @me = '#000000'; // 默认黑色 } "/> ([field:color/]) </li> {/dede:arclist}
关键点:
runphp='yes':开启 PHP 执行模式。@me:这是一个特殊的变量,始终代表当前标签的原始值,在runphp开始时,@me是[field:color]的值,在runphp结束时,@me的新值会成为标签最终的输出内容。- 安全风险:虽然
runphp很方便,但如果对用户输入的字段也使用它,并且处理不当,也可能存在安全风险(如果用户能输入恶意代码并执行),确保你处理的数据是可信的,或者进行了严格的过滤。
总结与最佳实践
| 方法 | 语法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
{dede:php} |
{dede:php}...{/dede:php} |
简单直接,无需修改其他文件 | 极不安全,破坏模板结构 | 仅限本地测试,强烈不推荐生产环境使用 |
{dede:func} |
{dede:func function='myFunc'/} |
安全规范,逻辑与表现分离,可复用 | 需要修改核心文件 helpers.helper.php |
强烈推荐,用于封装常用、独立的工具函数。 |
{dede:global} |
{dede:global name='x' phpfile='a.php'/} |
功能强大,可处理复杂逻辑,访问全局变量 | 需要创建额外文件,稍复杂 | 用于封装复杂的、有多个输出或需要访问数据库的逻辑块。 |
runphp='yes' |
[field:name runphp='yes']...[/field:name] |
方便在循环内处理单个字段数据 | 功能相对局限,滥用有安全风险 | 用于对列表、内容页中的某个字段进行简单的条件判断或格式化处理。 |
最终建议:
为了网站的安全和长期维护,请优先使用 {dede:func} 方法,将你的 PHP 逻辑封装成干净的函数,放在 include/helpers.helper.php 中,然后在模板中优雅地调用它们,这是 DedeCMS 开发中处理模板逻辑的“标准答案”。
