dede模板里怎么运行php代码?

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

使用官方推荐标签 {dede:php}

这是 DedeCMS 官方提供的最标准、最安全的方式,专门用于在模板中执行 PHP 代码。

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

基本用法

在模板文件(.htm)中,使用 {dede:php}...{/dede:php} 标签包裹你的 PHP 代码。

示例:在模板中打印 "Hello, DedeCMS!"

{dede:php}
    echo "Hello, DedeCMS!";
{/dede:php}

访问 DedeCMS 变量和对象

这是 {dede:php} 最强大的功能之一,你可以在 PHP 代码块中直接访问 DedeCMS 的全局变量,如 $dsql(数据库连接对象)、$cfg_ 系列配置变量、以及 {dede:field} 等标签的值。

示例:查询数据库并输出文章标题

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

假设你在一个文章列表页,想在标题旁边额外输出一个自定义字段 myfield 的值。

{dede:arclist titlelen='50' row='5'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <!-- 使用 {dede:php} 访问当前文章的ID,并查询自定义字段 -->
        {dede:php}
            // 获取当前文章的ID,注意:在arclist标签内,这个ID需要通过全局变量获取
            $aid = $GLOBALS['arcID']; 
            // 如果是在内容页(article_article.htm),则可以直接使用 $aid = $arcid;
            // 使用 dsql 查询自定义字段
            $row = $dsql->GetOne("SELECT `myfield` FROM `dede_arctiny` WHERE id = '$aid'");
            if($row){
                echo " - 自定义字段值: " . $row['myfield'];
            }
        {/dede:php}
    </li>
{/dede:arclist}

示例:获取并使用系统配置变量

{dede:php}
    // 获取网站名称
    $site_name = $cfg_webname;
    echo "欢迎来到 " . $site_name;
    // 获取网站首页链接
    $index_url = $cfg_indexurl;
    echo "<a href='$index_url'>返回首页</a>";
{/dede:php}

核心方法二:使用全局变量 $GLOBALS

DedeCMS 将很多常用变量都放在了 $GLOBALS 超级全局变量中,你可以在模板中直接通过 {$GLOBALS['var_name']} 的方式来调用 PHP 变量,虽然这不是“运行代码”,但它是传递 PHP 数据到模板的桥梁。

在PHP文件中定义变量,在模板中显示

假设你在 index.php 文件中:

dede 模板中运行php
(图片来源网络,侵删)
// 在 index.php 中
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/arc.partview.class.php";
// 定义一个PHP变量
$my_php_variable = "这是一个从PHP传来的变量";
// 将变量注入到全局变量中,供模板使用
$GLOBALS['my_php_variable'] = $my_php_variable;
// 调用首页模板
$tpl = new PartView();
$tpl->Display('index.htm');

然后在你的首页模板 index.htm 中:

<p>直接显示变量: {$my_php_variable}</p>
<p>在 {dede:php} 标签中使用:</p>
{dede:php}
    echo "在PHP标签中显示: " . $GLOBALS['my_php_variable'];
{/dede:php}

在自定义函数或模型中定义变量

这是更常见的用法,比如在自定义模型处理表单提交时,将查询结果传递给模板。

// 在你的自定义处理文件中,addcontent.php
require_once (dirname(__FILE__) . "/include/common.inc.php");
// ... 一些业务逻辑 ...
// 查询数据库
$dsql = new DedeSql(false);
$dsql->SetQuery("SELECT * FROM `dede_mytable`");
$dsql->Execute();
while($row = $dsql->GetArray()){
    // 将每一行数据都存入$GLOBALS
    $GLOBALS['my_list'][] = $row;
}
// 跳转到模板
include_once(DEDETEMPLATE.'/plus/my_template.htm');

在模板文件 my_template.htm 中:

<ul>
    {dede:php}
        if(!empty($GLOBALS['my_list'])){
            foreach($GLOBALS['my_list'] as $item){
                echo "<li>" . $item['title'] . "</li>";
            }
        }
    {/dede:php}
</ul>

核心方法三:使用 eval() 函数(不推荐,有风险)

这是一种非常灵活但极其危险的方法,它可以在模板中直接执行任意 PHP 字符串代码。

用法示例

{dede:eval}
    echo date("Y-m-d H:i:s");
{/dede:eval}

或者更复杂的:

{dede:eval}
    $user = 'John Doe';
    echo "Welcome, " . $user . "!";
{/dede:eval}

为什么不推荐?

  • 安全风险:如果模板内容可以被用户(如管理员、投稿者)修改,那么恶意用户就可以通过注入 {dede:eval} ... {/dede:eval} 代码来执行任意 PHP 命令,比如获取服务器权限、删除文件等,这是典型的代码注入漏洞。
  • 性能开销eval() 函数的执行效率远低于直接执行代码。
  • 维护困难:将业务逻辑和模板混在一起,会使代码难以阅读和维护。

除非你完全信任模板的来源,并且有充分的理由,否则强烈建议不要使用 {dede:eval},优先使用 {dede:php}$GLOBALS


总结与最佳实践

方法 语法 优点 缺点 推荐场景
{dede:php} {dede:php}...PHP 代码...{/dede:php} 官方支持、安全、功能强大,能直接访问 DedeCMS 全局对象。 代码块会破坏模板的简洁性。 绝大多数情况下的首选,用于在模板中执行复杂的逻辑、数据库查询、循环等。
$GLOBALS {$GLOBALS['var']} 安全、高效,是 PHP 与模板数据交互的标准方式。 只能传递变量值,不能执行复杂逻辑。 在 PHP 文件中准备好数据,然后在模板中简单地显示这些数据。
{dede:eval} {dede:eval}...PHP 代码...{/dede:eval} 灵活,可以执行一行代码。 高风险、低性能、不安全 尽量避免使用,仅在你完全控制模板且需要极度灵活性时才考虑。

安全提示

  1. 保持 DedeCMS 更新:官方更新通常会修复已知的安全漏洞。
  2. 限制后台权限:只给必要的管理员用户开放后台权限,避免低权限用户上传或修改模板。
  3. 代码审查:如果你是从网上下载的模板,请仔细检查其中是否包含恶意的 {dede:php}{dede:eval} 代码块。
  4. 最小化原则:尽量在 PHP 文件中完成复杂的业务逻辑,只将最终需要展示的数据通过 $GLOBALS 等方式传递给模板。

希望这份详细的指南能帮助你在 DedeCMS 模板中熟练、安全地使用 PHP!

-- 展开阅读全文 --
头像
dede自动评论SEO工具靠谱吗?效果与风险如何?
« 上一篇 02-15
织梦CMS如何适配HTML5?
下一篇 » 02-15
取消
微信二维码
支付宝二维码

目录[+]