菜鸟科技网

织梦如何调用PHP?

核心原则:安全第一

在织梦中执行PHP代码,尤其是用户提交的或来自数据库的内容,存在巨大的安全风险,不正确的使用可能导致网站被植入后门、数据泄露等严重问题。

织梦如何调用PHP?-图1
(图片来源网络,侵删)

黄金法则:永远不要信任任何来自数据库或用户输入的PHP代码。 只在你完全可控的环境下执行你编写的代码。


使用 {dede:php} 标签(最官方、最安全)

这是织梦官方提供的、在模板中直接执行PHP代码的标签,它的作用域仅限于当前模板文件,并且默认情况下织梦为了安全,在后台的“系统” -> “系统基本参数” -> “核心设置”中是关闭的。

开启 {dede:php}
  1. 登录织梦后台。
  2. 进入 系统 -> 系统基本参数
  3. 在左侧菜单选择 核心设置
  4. 找到 模板引擎禁PHP标签 选项。
  5. 将其值从 Y 修改为 N,然后点击“保存”。
    • Y:禁用,标签无效。
    • N:启用,标签生效。

使用方法

在需要执行PHP的模板文件(如 index.htm, article_list.htm 等)中,直接使用标签语法。

语法:

织梦如何调用PHP?-图2
(图片来源网络,侵删)
{dede:php}
    // 在这里写你的PHP代码
    // 输出当前时间
    echo date('Y-m-d H:i:s');
{/dede:php}

示例: 在首页模板中,调用一个自定义函数来显示欢迎语。

  1. 在织梦的核心文件中定义函数(推荐) 为了安全,不要把函数写在模板里,最好的做法是写在织梦的核心文件里,/include/common.inc.php,这个文件在每次页面加载时都会被引入。

    打开 /include/common.inc.php,在文件末尾添加你的函数:

    // 自定义函数:获取欢迎语
    function getWelcomeMessage() {
        $hour = date('H');
        if ($hour < 6) {
            return '夜深了,注意休息!';
        } elseif ($hour < 12) {
            return '早上好!新的一天开始了!';
        } elseif ($hour < 18) {
            return '下午好!';
        } else {
            return '晚上好!';
        }
    }
  2. 在模板中调用 在你的首页模板 index.htm 中,使用 {dede:php} 标签来调用这个函数:

    织梦如何调用PHP?-图3
    (图片来源网络,侵删)
    <div class="welcome-message">
        {dede:php}
            echo getWelcomeMessage();
        {/dede:php}
    </div>

优点:

  • 官方支持:最标准、最稳定的方式。
  • 作用域隔离:PHP代码只在当前模板文件中执行,不会影响全局。
  • 相对安全:相比其他方法,安全性更高。

缺点:

  • 需要在后台开启,有一定门槛。
  • 对于复杂的逻辑,可能会使模板文件变得臃肿。

使用 {dede:global} 标签结合PHP文件(灵活且安全)

这种方法适用于那些需要在多个页面重复使用的PHP逻辑,你将代码写在一个独立的PHP文件中,然后在模板中通过 {dede:global} 标签来引入并执行它。

创建PHP文件

在网站根目录下创建一个PHP文件,/my_functions.php

<?php
// my_functions.php
// 定义一个函数来获取最新的文章列表
function getLatestArticles($limit = 10) {
    global $dsql;
    $articles = array();
    $query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
    $dsql->Execute('me', $query);
    while ($row = $dsql->GetArray('me')) {
        $articles[] = $row;
    }
    return $articles;
}
?>

在模板中调用

在需要显示最新文章列表的模板文件中,使用 {dede:global}

语法:

{dede:global name='your_function_name' function='your_php_file::your_static_method_or_function'/}

示例: 在首页 index.htm 中调用上面的函数。

<h3>最新文章</h3>
<ul>
    {dede:global name='getLatestArticles' function='my_functions::getLatestArticles'/}
</ul>

注意: 这种方法通常需要你的PHP文件中定义的是一个类和静态方法,或者是一个可以被 call_user_func 调用的函数,上面的例子稍微简化了,更标准的写法是使用类:

// my_functions.php
<?php
class my_functions {
    public static function getLatestArticles($limit = 10) {
        global $dsql;
        $articles = array();
        $query = "SELECT id, title, pubdate FROM `dede_archives` ORDER BY pubdate DESC LIMIT 0, {$limit}";
        $dsql->Execute('me', $query);
        while ($row = $dsql->GetArray('me')) {
            $articles[] = $row;
        }
        return $articles;
    }
}
?>

然后在模板中:

{dede:global name='getLatestArticles' function='my_functions::getLatestArticles' limit='5'/}

(织梦会自动将标签的属性作为参数传递给函数)

优点:

  • 代码复用:将逻辑与模板分离,非常利于维护。
  • 安全性高:PHP文件是独立的,不直接暴露在模板中,不易被恶意注入。
  • 灵活性高:可以传递参数。

缺点:

  • 语法比 {dede:php} 稍微复杂一些。

修改源码,在特定位置嵌入PHP(不推荐,仅用于二次开发)

如果你需要修改织梦的核心PHP文件(如 index.php, list.php 等)来执行代码,这属于二次开发的范畴。此方法非常危险,可能导致升级困难,且极易引入安全漏洞。

示例: 想在首页 index.php 加载时执行一段代码。

  1. 打开 /index.php

  2. 找到 require_once(dirname(__FILE__)."/include/common.inc.php"); 这一行。

  3. 在它后面添加你的PHP代码:

    // index.php
    require_once(dirname(__FILE__)."/include/common.inc.php");
    // ==============================================
    // 在这里添加你的自定义PHP代码
    $current_time = date('Y-m-d H:i:s');
    // 可以在这里进行数据库操作、调用函数等
    // ==============================================
    require_once(DEDEINC."/arc.partview.class.php");
    ...

优点:

  • 功能最强大:可以在任何你想执行代码的地方执行。
  • 性能最高:没有模板解析的开销。

缺点:

  • 极度危险:直接修改核心文件,一旦出错可能导致整个网站瘫痪。
  • 升级困难:下次织梦升级时,你的修改会被覆盖,需要重新修改。
  • 破坏性大:代码与织梦核心耦合度高,维护成本高。

使用自定义模型(高级用法)

当你需要让用户在前台提交内容,并且这个内容需要经过复杂的PHP处理时(表单提交、数据计算等),可以创建自定义模型。

  1. 在后台 核心 -> 内容模型管理 -> 添加模型
  2. 定义表单字段,并将字段的“处理函数”指向一个你编写的PHP函数。
  3. 这个函数通常放在 /include/extend.func.php(用于函数)或 /include/custom.func.php(用于类)中。

这是处理用户输入复杂数据逻辑最规范、最安全的方式,但实现起来也最复杂。


总结与推荐

方法 适用场景 安全性 推荐度
{dede:php} 在模板中执行少量、简单的PHP代码,如输出变量、调用简单函数。 ⭐⭐⭐⭐⭐ (首选)
{dede:global} 在多个模板中复用一段复杂的PHP逻辑,代码与模板分离。 ⭐⭐⭐⭐⭐ (首选)
修改源码 进行深度的二次开发,需要在流程的特定节点插入代码。 ⭐ (不推荐,除非必要)
自定义模型 处理用户提交的表单数据,或需要复杂后台逻辑的内容模型。 ⭐⭐⭐⭐ (高级场景)

给新手的建议:

  • {dede:php} 标签开始,它最简单直观。
  • 当你的代码需要在多处使用时,立刻转向 {dede:global},养成良好的代码分离习惯。
  • 永远不要在模板里写复杂的业务逻辑,尽量将逻辑封装到函数或类中。
  • 绝对不要开启模板里执行任意代码的功能(如 {dede:eval},这是一个非常危险的标签,新版本织梦已移除),也绝对不要相信从数据库里取出来的PHP代码。

分享:
扫描分享到社交APP
上一篇
下一篇