核心思想
DedeCMS 的模板引擎本质上是一个解析器,它默认只解析模板标签(如 {dede:field.title/}),而不会直接执行 PHP 代码,要让模板执行 PHP,我们需要使用 DedeCMS 提供的特定功能或利用 PHP 的原生特性来“注入”代码。

使用 {dede:php} 标签 (推荐,但需谨慎)
这是 DedeCMS 官方提供的、在模板中直接执行 PHP 代码的方法。
基本用法
在模板文件(.htm)中,直接使用 {dede:php}...{/dede:php} 标签包裹你的 PHP 代码。
示例:在模板中打印 "Hello, Dede!"
{dede:php}
echo "Hello, Dede!";
{/dede:php}
访问 DedeCMS 变量和对象
这是 {dede:php} 最强大的功能之一,你可以在 PHP 代码块中直接访问 DedeCMS 的全局变量、数据库连接对象等。

示例:获取当前栏目的名称
{dede:php}
// $this 在循环标签(如 {dede:arclist}, {dede:loop})内部代表当前记录
// 在普通页面,$this 代表当前文档的信息
$typeid = $this->Fields['typeid'];
// 引入 DedeCMS 的类库
// require_once(DEDEINC.'/arc.partview.class.php');
// 使用全局 $dsql 对象进行数据库查询
global $dsql;
$row = $dsql->GetOne("SELECT typename FROM `dede_arctype` WHERE id = $typeid");
if($row) {
echo "当前栏目是:" . $row['typename'];
}
{/dede:php}
在列表或内容页循环中使用
当你在 {dede:arclist} 或 {dede:loop} 等循环标签内部使用 {dede:php} 时,$this 对象会指向当前循环的记录,非常方便。
示例:在列表页给每个标题加上一个链接
{dede:arclist titlelen='50' row='5'}
<li>
{dede:php}
// $this->Fields 包含了当前文章的所有字段,如 id, title, arcurl 等
$title = $this->Fields['title'];
$arcurl = $this->Fields['arcurl'];
echo "<a href='{$arcurl}'>{$title}</a>";
{/dede:php}
</li>
{/dede:arclist}
⚠️ 重要注意事项(安全性)
- 安全性极低:这是最需要注意的一点,如果开启了此功能,任何可以编辑模板的后台管理员都可以在模板中执行任意 PHP 代码,包括
eval($_POST['cmd'])这样的后门代码,直接获取网站服务器控制权。 - 开启方式:默认情况下,
{dede:php}标签可能是被禁用的,你需要在后台手动开启。- 登录 DedeCMS 后台。
- 进入 [系统] -> [系统基本参数] -> [核心设置]。
- 找到 “模板引擎禁用PHP代码” 选项,将其值设置为 “否”。
- 适用场景:仅适用于高度信任的开发者或内部系统,对于面向多用户、有多个管理员的后台,强烈建议不使用或谨慎使用,在商业项目中,应尽量避免使用此方法。
使用 PHP 原始标签 <?php ... ?> (不推荐,需要修改配置)
这种方法直接在模板文件中写原生 PHP 代码,看起来最直观,但在 DedeCMS 中默认是行不通的。

为什么默认不行?
因为 DedeCMS 在解析模板时,会先把模板文件读入一个字符串中,然后通过自己的模板引擎进行标签替换,如果直接 <?php,它会把这段代码当作普通文本输出,而不会交给 PHP 解释器执行。
如何实现(需要修改核心文件)
你需要修改 DedeCMS 的核心解析类文件,让它识别并执行 这是一种“野路子”,为了项目的长期稳定性和可维护性,请绝对不要使用此方法。 这是专业开发中最推荐的方法,它遵循了“逻辑与表现分离”的原则,既安全又灵活。 示例 ( 示例 (模板文件 如果你的功能比较复杂,或者希望做成一个可复用的模块,可以使用 DedeCMS 的插件或模块系统。 这种方法非常适合构建内容块,如“热门文章推荐”、“最新产品展示”等,它是最规范、最可扩展的方式,但开发成本相对较高。 对于任何严肃的、长期维护的 DedeCMS 项目,请优先选择方法三(自定义函数/文件),它虽然比 只有在100%确定环境安全,并且是为了快速实现一个非常简单的、一次性的功能时,才可以考虑使用 <?php
/include/dedetemplate.class.phpParseTemplate 或类似名称的方法),在正则表达式匹配规则中,加入对 <?php ... ?> 的处理。
{dede:php}:一旦开启,任何模板编辑者都可以执行任意 PHP 代码。
使用自定义函数或文件 (最推荐、最安全、最规范)
创建自定义函数文件
/include/ 目录下创建一个你自己的函数文件,my_functions.php。/include/my_functions.php):<?php
if(!defined('DEDEINC')) exit('Request Error!');
// 获取指定栏目的文章数量
function getArticleCount($typeid) {
global $dsql;
$row = $dsql->GetOne("SELECT COUNT(*) AS count FROM `dede_archives` WHERE typeid = $typeid");
return $row['count'];
}
// 格式化价格,添加货币符号
function formatPrice($price) {
return '¥' . number_format($price, 2);
}
?>
在模板中调用函数
{dede:include} 标签引入你的函数文件。{dede:php} 标签来调用函数并输出结果。index.htm):{dede:include filename='my_functions.htm'/}
{dede:php}
// 假设当前栏目的ID是 1
$current_typeid = 1;
$count = getArticleCount($current_typeid);
echo "本栏目共有 " . $count . " 篇文章。";
echo "<br>";
$price = 99.8;
echo "商品价格:" . formatPrice($price);
{/dede:php}
优点:
.php 文件中,普通后台管理员无法通过模板编辑器直接修改和执行。.php 文件中,修改方便,不会影响模板结构。
使用插件或模块 (功能强大)
{dede:module name='mymodule'/} 的方式调用。
总结与对比
方法
优点
缺点
适用场景
{dede:php}简单直接,能访问 DedeCMS 全局对象
安全性极低,可被任意管理员利用作为后门
快速测试、个人项目、内部系统(极度信任环境)
<?php ?> 原生标签直观,无需学习 DedeCMS 标签
需要修改核心文件,破坏升级,同样不安全
不推荐,应彻底避免
自定义函数/文件
安全、规范、可复用、易维护
需要额外创建文件,调用稍显繁琐(需
{dede:php})专业开发首选,几乎所有需要执行逻辑的场景
插件/模块
功能强大,高度封装,可复用,管理方便
开发成本高,学习曲线稍陡
构建复杂、可复用的功能模块,如推荐位、专题等
最终建议
{dede:php} 多了几个步骤,但带来的安全性、可维护性和代码质量的提升是巨大的。{dede:php} 标签,并务必在项目完成后将其注释或移除。
