使用官方推荐标签 {dede:php}
这是 DedeCMS 官方提供的最标准、最安全的方式,专门用于在模板中执行 PHP 代码。

(图片来源网络,侵删)
基本用法
在模板文件(.htm)中,使用 {dede:php}...{/dede:php} 标签包裹你的 PHP 代码。
示例:在模板中打印 "Hello, DedeCMS!"
{dede:php}
echo "Hello, DedeCMS!";
{/dede:php}
访问 DedeCMS 变量和对象
这是 {dede:php} 最强大的功能之一,你可以在 PHP 代码块中直接访问 DedeCMS 的全局变量,如 $dsql(数据库连接对象)、$cfg_ 系列配置变量、以及 {dede:field} 等标签的值。
示例:查询数据库并输出文章标题

(图片来源网络,侵删)
假设你在一个文章列表页,想在标题旁边额外输出一个自定义字段 myfield 的值。
{dede:arclist titlelen='50' row='5'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<!-- 使用 {dede:php} 访问当前文章的ID,并查询自定义字段 -->
{dede:php}
// 获取当前文章的ID,注意:在arclist标签内,这个ID需要通过全局变量获取
$aid = $GLOBALS['arcID'];
// 如果是在内容页(article_article.htm),则可以直接使用 $aid = $arcid;
// 使用 dsql 查询自定义字段
$row = $dsql->GetOne("SELECT `myfield` FROM `dede_arctiny` WHERE id = '$aid'");
if($row){
echo " - 自定义字段值: " . $row['myfield'];
}
{/dede:php}
</li>
{/dede:arclist}
示例:获取并使用系统配置变量
{dede:php}
// 获取网站名称
$site_name = $cfg_webname;
echo "欢迎来到 " . $site_name;
// 获取网站首页链接
$index_url = $cfg_indexurl;
echo "<a href='$index_url'>返回首页</a>";
{/dede:php}
核心方法二:使用全局变量 $GLOBALS
DedeCMS 将很多常用变量都放在了 $GLOBALS 超级全局变量中,你可以在模板中直接通过 {$GLOBALS['var_name']} 的方式来调用 PHP 变量,虽然这不是“运行代码”,但它是传递 PHP 数据到模板的桥梁。
在PHP文件中定义变量,在模板中显示
假设你在 index.php 文件中:

(图片来源网络,侵删)
// 在 index.php 中
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
// 定义一个PHP变量
$my_php_variable = "这是一个从PHP传来的变量";
// 将变量注入到全局变量中,供模板使用
$GLOBALS['my_php_variable'] = $my_php_variable;
// 调用首页模板
$tpl = new PartView();
$tpl->Display('index.htm');
然后在你的首页模板 index.htm 中:
<p>直接显示变量: {$my_php_variable}</p>
<p>在 {dede:php} 标签中使用:</p>
{dede:php}
echo "在PHP标签中显示: " . $GLOBALS['my_php_variable'];
{/dede:php}
在自定义函数或模型中定义变量
这是更常见的用法,比如在自定义模型处理表单提交时,将查询结果传递给模板。
// 在你的自定义处理文件中,addcontent.php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// ... 一些业务逻辑 ...
// 查询数据库
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT * FROM `dede_mytable`");
$dsql->Execute();
while($row = $dsql->GetArray()){
// 将每一行数据都存入$GLOBALS
$GLOBALS['my_list'][] = $row;
}
// 跳转到模板
include_once(DEDETEMPLATE.'/plus/my_template.htm');
在模板文件 my_template.htm 中:
<ul>
{dede:php}
if(!empty($GLOBALS['my_list'])){
foreach($GLOBALS['my_list'] as $item){
echo "<li>" . $item['title'] . "</li>";
}
}
{/dede:php}
</ul>
核心方法三:使用 eval() 函数(不推荐,有风险)
这是一种非常灵活但极其危险的方法,它可以在模板中直接执行任意 PHP 字符串代码。
用法示例
{dede:eval}
echo date("Y-m-d H:i:s");
{/dede:eval}
或者更复杂的:
{dede:eval}
$user = 'John Doe';
echo "Welcome, " . $user . "!";
{/dede:eval}
为什么不推荐?
- 安全风险:如果模板内容可以被用户(如管理员、投稿者)修改,那么恶意用户就可以通过注入
{dede:eval}...{/dede:eval}代码来执行任意 PHP 命令,比如获取服务器权限、删除文件等,这是典型的代码注入漏洞。 - 性能开销:
eval()函数的执行效率远低于直接执行代码。 - 维护困难:将业务逻辑和模板混在一起,会使代码难以阅读和维护。
除非你完全信任模板的来源,并且有充分的理由,否则强烈建议不要使用 {dede:eval},优先使用 {dede:php} 和 $GLOBALS。
总结与最佳实践
| 方法 | 语法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
{dede:php} |
{dede:php}...PHP 代码...{/dede:php} |
官方支持、安全、功能强大,能直接访问 DedeCMS 全局对象。 | 代码块会破坏模板的简洁性。 | 绝大多数情况下的首选,用于在模板中执行复杂的逻辑、数据库查询、循环等。 |
$GLOBALS |
{$GLOBALS['var']} |
安全、高效,是 PHP 与模板数据交互的标准方式。 | 只能传递变量值,不能执行复杂逻辑。 | 在 PHP 文件中准备好数据,然后在模板中简单地显示这些数据。 |
{dede:eval} |
{dede:eval}...PHP 代码...{/dede:eval} |
灵活,可以执行一行代码。 | 高风险、低性能、不安全。 | 尽量避免使用,仅在你完全控制模板且需要极度灵活性时才考虑。 |
安全提示
- 保持 DedeCMS 更新:官方更新通常会修复已知的安全漏洞。
- 限制后台权限:只给必要的管理员用户开放后台权限,避免低权限用户上传或修改模板。
- 代码审查:如果你是从网上下载的模板,请仔细检查其中是否包含恶意的
{dede:php}或{dede:eval}代码块。 - 最小化原则:尽量在 PHP 文件中完成复杂的业务逻辑,只将最终需要展示的数据通过
$GLOBALS等方式传递给模板。
希望这份详细的指南能帮助你在 DedeCMS 模板中熟练、安全地使用 PHP!
