dede模板如何执行php代码?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 DEDE建站 正文

核心思想

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

dede 模板 执行 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
(图片来源网络,侵删)

示例:获取当前栏目的名称

{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}

⚠️ 重要注意事项(安全性)

  1. 安全性极低:这是最需要注意的一点,如果开启了此功能,任何可以编辑模板的后台管理员都可以在模板中执行任意 PHP 代码,包括 eval($_POST['cmd']) 这样的后门代码,直接获取网站服务器控制权。
  2. 开启方式:默认情况下,{dede:php} 标签可能是被禁用的,你需要在后台手动开启。
    • 登录 DedeCMS 后台。
    • 进入 [系统] -> [系统基本参数] -> [核心设置]
    • 找到 “模板引擎禁用PHP代码” 选项,将其值设置为 “否”
  3. 适用场景仅适用于高度信任的开发者或内部系统,对于面向多用户、有多个管理员的后台,强烈建议不使用或谨慎使用,在商业项目中,应尽量避免使用此方法。

使用 PHP 原始标签 <?php ... ?> (不推荐,需要修改配置)

这种方法直接在模板文件中写原生 PHP 代码,看起来最直观,但在 DedeCMS 中默认是行不通的。

dede 模板 执行 php
(图片来源网络,侵删)

为什么默认不行?

因为 DedeCMS 在解析模板时,会先把模板文件读入一个字符串中,然后通过自己的模板引擎进行标签替换,如果直接 <?php,它会把这段代码当作普通文本输出,而不会交给 PHP 解释器执行。

如何实现(需要修改核心文件)

你需要修改 DedeCMS 的核心解析类文件,让它识别并执行 <?php

  1. 找到核心文件/include/dedetemplate.class.php
  2. 修改代码:在这个文件中,找到处理模板内容的方法(通常是 ParseTemplate 或类似名称的方法),在正则表达式匹配规则中,加入对 <?php ... ?> 的处理。
  3. 风险极高强烈不推荐! 修改核心文件会导致:
    • 升级困难:每次 DedeCMS 官方发布新版本,你都需要手动修改这些代码,非常麻烦。
    • 破坏稳定性:你的修改可能会与官方的其他功能产生冲突,导致未知错误。
    • 安全性同 {dede:php}:一旦开启,任何模板编辑者都可以执行任意 PHP 代码。

这是一种“野路子”,为了项目的长期稳定性和可维护性,请绝对不要使用此方法。


使用自定义函数或文件 (最推荐、最安全、最规范)

这是专业开发中最推荐的方法,它遵循了“逻辑与表现分离”的原则,既安全又灵活。

创建自定义函数文件

  1. /include/ 目录下创建一个你自己的函数文件,my_functions.php
  2. 在这个文件中编写你的 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);
}
?>

在模板中调用函数

  1. 引入函数文件:在需要调用函数的模板文件的开头,使用 {dede:include} 标签引入你的函数文件。
  2. 调用函数:使用 {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 文件中,普通后台管理员无法通过模板编辑器直接修改和执行。
  • 代码复用:函数可以被多个模板文件调用,避免重复代码。
  • 易于维护:所有逻辑代码都集中在 .php 文件中,修改方便,不会影响模板结构。
  • 符合 MVC 思想:将业务逻辑(Model/Controller)与视图(View)分离。

使用插件或模块 (功能强大)

如果你的功能比较复杂,或者希望做成一个可复用的模块,可以使用 DedeCMS 的插件或模块系统。

  1. 开发一个模块:在后台可以创建一个新模块,将你的 PHP 逻辑和 HTML 模板封装在一起。
  2. 调用模块:在任意模板页面,通过 {dede:module name='mymodule'/} 的方式调用。

这种方法非常适合构建内容块,如“热门文章推荐”、“最新产品展示”等,它是最规范、最可扩展的方式,但开发成本相对较高。


总结与对比

方法 优点 缺点 适用场景
{dede:php} 简单直接,能访问 DedeCMS 全局对象 安全性极低,可被任意管理员利用作为后门 快速测试、个人项目、内部系统(极度信任环境)
<?php ?> 原生标签 直观,无需学习 DedeCMS 标签 需要修改核心文件,破坏升级,同样不安全 不推荐,应彻底避免
自定义函数/文件 安全、规范、可复用、易维护 需要额外创建文件,调用稍显繁琐(需 {dede:php} 专业开发首选,几乎所有需要执行逻辑的场景
插件/模块 功能强大,高度封装,可复用,管理方便 开发成本高,学习曲线稍陡 构建复杂、可复用的功能模块,如推荐位、专题等

最终建议

对于任何严肃的、长期维护的 DedeCMS 项目,请优先选择方法三(自定义函数/文件),它虽然比 {dede:php} 多了几个步骤,但带来的安全性、可维护性和代码质量的提升是巨大的。

只有在100%确定环境安全,并且是为了快速实现一个非常简单的、一次性的功能时,才可以考虑使用 {dede:php} 标签,并务必在项目完成后将其注释或移除。

-- 展开阅读全文 --
头像
帝国CMS转织梦步骤复杂吗?
« 上一篇 01-30
dede导航limit参数如何正确使用?
下一篇 » 01-30
取消
微信二维码
支付宝二维码