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

dedecms 模板 嵌套php
(图片来源网络,侵删)

核心思想

DedeCMS 的模板引擎本质上是一个解析器,它会扫描模板文件(.htm),找到特定的标签(如 {dede:arclist}),然后执行对应的 PHP 逻辑,最后将结果替换回标签位置,我们嵌套 PHP 代码,就是利用了这个解析过程,让它在特定位置执行我们自定义的 PHP 脚本。


直接使用 {dede:php} 标签(最直接,但不推荐用于生产环境)

这是最简单的方法,直接在模板中写 PHP 代码。

语法:

{dede:php}
    // 你的 PHP 代码
{/dede:php}

示例: 假设你想在首页显示当前服务器的 PHP 版本。

dedecms 模板 嵌套php
(图片来源网络,侵删)
{dede:php}
    echo '当前 PHP 版本: ' . phpversion();
{/dede:php}

注意事项:

  • 安全性极差:如果网站有上传漏洞,攻击者可以上传一个包含 {dede:php} 的模板文件,从而在服务器上执行任意 PHP 代码,这是非常危险的。
  • 破坏模板结构:这种方式会让模板文件变得混乱,难以维护,前端开发人员可能会看不懂这些 PHP 代码。
  • 适用场景仅限于本地测试、个人学习或你完全信任的、绝对封闭的开发环境,强烈不建议在正式上线的网站上使用。

使用 {dede:func} 标调用自定义函数(推荐)

这是最安全、最规范、最推荐的方法,它的核心思想是:将 PHP 代码写在 DedeCMS 的核心函数库文件中,然后在模板中通过 {dede:func} 标签来调用它。

步骤:

  1. 创建自定义函数 在 DedeCMS 的 include 目录下,找到 helpers.helper.php 文件,这个文件专门用来存放全局可用的辅助函数。 在文件末尾添加你的 PHP 函数,我们创建一个函数来获取一个随机的励志名言。

    dedecms 模板 嵌套php
    (图片来源网络,侵删)
    // 文件路径: /include/helpers.helper.php
    // ... 文件中原有的代码 ...
    /**
     * 获取一条随机的励志名言
     * @return string
     */
    function get_random_inspirational_quote()
    {
        $quotes = array(
            "生活不是等待暴风雨过去,而是学会在雨中跳舞。",
            "成功不是终点,失败也不是末日,最重要的是继续前进的勇气。",
            "你的唯一限制就是你自己内心的限制。"
        );
        // 从数组中随机获取一个元素
        $random_quote = $quotes[array_rand($quotes)];
        return $random_quote;
    }
  2. 在模板中调用函数 在你的模板文件(如 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 属性来引入并执行它。

步骤:

  1. 创建独立的 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;
    ?>
  2. 在模板中引入 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),我们想在列表中根据这个值设置文字颜色。

  1. 在后台添加自定义字段 color

  2. 在文章列表模板中:

    {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 开发中处理模板逻辑的“标准答案”。