DedeCMS 的模板系统是一个基于 XML 和标签的语言,它允许你在不接触复杂 PHP 代码的情况下构建网站,为了实现更灵活、更复杂的功能,它也巧妙地集成了 PHP 的执行能力。

dedecms5.7 模板 php
(图片来源网络,侵删)

理解 DedeCMS 模板中的 PHP,主要分为三个层面:

  1. 安全模式:通过内置的 {dede:php} 标签执行。
  2. 原生模式:直接在模板文件中写 PHP 代码(不推荐,但有特定用途)。
  3. 模板文件自身.php 文件作为模板被调用。

安全模式:使用 {dede:php} 标签(推荐)

这是 DedeCMS 官方提供且最安全的在模板中执行 PHP 代码的方式,它被设计用来执行一些简单的逻辑、数据处理或调用外部函数。

基本语法

{dede:php}
    // 在这里写你的 PHP 代码
    // 定义一个变量
    $myVar = 'Hello from Dede PHP!';
    // 使用 DedeCMS 的内置函数
    $arc = GetOneArchive(10); // 获取 ID 为 10 的文章数据
    if($arc) {
        echo $arc['title'];
    }
{/dede:php}

特点与限制

  • 安全性:DedeCMS 后台有一个“模板安全开关”(系统 -> 系统基本参数 -> 核心设置 -> 模板引擎禁用标签),默认情况下,php 标签是被允许的,但管理员可以通过禁用 php 来关闭此功能,防止恶意代码执行。
  • 作用域:在 {dede:php} 块内定义的变量,默认情况下不能被模板的其他部分(如 {dede:field.title/})直接使用,它是一个独立的执行环境。
  • 输出:直接使用 echoprint 来输出内容到页面上。
  • 适用场景
    • 进行一些数学计算。
    • 调用 DedeCMS 的 API 函数(如 GetOneArchive, GetOneType 等)。
    • 处理简单的条件逻辑并输出结果。

示例:获取指定栏目信息并输出

假设你想在首页某个位置显示“关于我们”栏目的描述。

  1. 在后台找到“关于我们”栏目的 ID(ID=5)。
  2. 在模板文件中,使用以下代码:
<div class="about-desc">
    {dede:php}
        // 获取栏目ID为5的栏目信息
        $typeInfo = GetOneType(5);
        if($typeInfo) {
            // 输出栏目描述
            echo $typeInfo['description'];
        }
    {/dede:php}
</div>

原生模式:直接嵌入 PHP 代码(不推荐,有风险)

这种方式是在模板文件(.htm)中直接写 <?php ... ?> 代码块。

dedecms5.7 模板 php
(图片来源网络,侵删)

示例

<div>
    <?php
        $time = time();
        echo "当前服务器时间是: " . date('Y-m-d H:i:s', $time);
    ?>
</div>

为什么不推荐?

  1. 严重的安全风险:这是最大的问题,如果网站存在上传漏洞,攻击者可以上传一个恶意的 .htm 文件,里面包含直接执行的 PHP 代码,这会导致服务器被完全控制,DedeCMS 的安全开关无法禁止这种原生 PHP 的执行。
  2. 破坏模板结构:这使得模板文件变得混乱,难以维护,违背了“逻辑与表现分离”的原则。
  3. 升级困难:官方模板升级时,你的这些原生 PHP 代码很容易被覆盖。

除非你有特殊需求且对服务器安全有绝对的控制权,否则请务必避免使用这种方式。


模板文件自身作为 PHP 文件调用

这是一种更高级的用法,通常用于创建一个独立的页面,比如一个自定义的表单提交页面、一个复杂的会员中心页面等。

原理

你创建一个 .php 文件,但这个文件的内容和写法遵循 DedeCMS 的模板规范,你通过 DedeCMS 的文章或页面管理功能,将这个 PHP 文件“发布”为一个页面,用户就可以通过 URL 访问它。

操作步骤

  1. 创建 PHP 模板文件templets/你的模板目录/ 下创建一个文件,my_page.php

    <?php
    /**
     * 模板变量赋值区域,从 DedeCMS 接收数据
     * 这部分代码是必须的,用于接收系统传递过来的变量
     */
    if (!defined('DEDEINC')) exit('Request Error!');
    require_once(DEDEINC.'/arc.partview.class.php');
    // --- 在这里可以编写你的 PHP 业务逻辑 ---
    // 处理表单提交
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {
        $name = trim($_POST['name']);
        $email = trim($_POST['email']);
        // 这里可以进行数据验证、存入数据库等操作
        // 为了演示,我们只简单输出
        echo "<h3>提交成功!</h3>";
        echo "姓名: " . htmlspecialchars($name) . "<br>";
        echo "邮箱: " . htmlspecialchars($email);
        // 为了不继续显示下面的表单,我们可以 exit 或直接 return
        // exit; 
    }
    // --- 模板文件内容开始 ---
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <title>我的自定义页面</title>
    </head>
    <body>
        <h1>这是一个自定义 PHP 页面</h1>
        <?php
        // 在这里也可以嵌入 PHP 代码来动态生成内容
        echo "<p>当前页面加载时间: " . date('Y-m-d H:i:s') . "</p>";
        ?>
        <hr>
        <h2>联系我们</h2>
        <form action="/my_page.php" method="post">
            <p>姓名: <input type="text" name="name" required></p>
            <p>邮箱: <input type="email" name="email" required></p>
            <p><input type="submit" name="submit" value="提交"></p>
        </form>
    </body>
    </html>
  2. 在后台创建页面并关联

    • 登录 DedeCMS 后台,进入 核心 -> 内容发布 -> 添加普通文档
    • 选择栏目:选择一个“频道模型”为“单页文档”的栏目。
    • :填写页面标题,我的自定义页面”。
    • 来源:选择“选择自定义页面”。
    • 选择页面:在下拉菜单中,选择你刚刚创建的 my_page.php 文件。
    • 生成 HTML:勾选“生成 HTML”。
    • 提交并生成。
  3. 访问页面 根据你设置的栏目和文档 ID,生成对应的 URL,http://你的域名/plus/view.php?aid=123,访问这个 URL,就会执行 my_page.php 文件中的代码并显示其内容。

适用场景

  • 自定义表单:创建复杂的、需要后端处理的表单。
  • 会员中心:构建功能丰富的会员个人页面。
  • API 接口页面:创建一个简单的、输出 JSON 或 XML 数据的接口。

总结与最佳实践

方法 语法 安全性 推荐度 主要用途
安全模式 {dede:php} ... {/dede:php} (可后台控制) ⭐⭐⭐⭐⭐ 模板内的简单逻辑、数据处理、调用 API。
原生模式 <?php ... ?> (无法后台控制) ⭐☆☆☆☆ 不推荐,仅在绝对必要时使用。
模板文件 创建 .php 文件作为模板 (依赖文件权限) ⭐⭐⭐⭐ 创建独立的、功能复杂的页面。

核心建议:

  1. 优先使用 {dede:php}:这是最安全、最符合 DedeCMS 设计哲学的方式。
  2. 绝对避免直接 <?php ?>:除非你 100% 确定你的网站没有上传漏洞,并且你愿意承担由此带来的风险。
  3. 善用 .php 模板文件:当你需要创建一个逻辑远超普通模板的独立页面时,这是最规范、最强大的方法。
  4. 熟悉 DedeCMS API:很多时候,你想要实现的功能可能已经有现成的 DedeCMS 函数(如 GetOneArchive, GetOneType, GetChannelUrls 等),先去查阅文档,这比自己用 PHP 实现要简单和安全得多。