DedeCMS 的变量传递机制融合了原生 PHP 的方法和自己的一套封装体系,主要可以分为 PHP 代码层 和 模板层 两个层面。

PHP 代码层 的变量传递
这是指在 .php 文件中,一个变量如何从一处传递到另一处处理逻辑或输出。
超全局变量
这是最基础、最通用的 PHP 变量,在脚本的任何地方都能访问。
$_GET: 通过 URL 参数传递 (index.php?id=1)。$_POST: 通过表单 POST 方法传递。$_REQUEST:$_GET,$_POST,$_COOKIE的集合。$_SESSION: 用于跨页面保存用户状态。$_COOKIE: 用于在客户端保存少量数据。
示例:
在 list.php 中,我们通过 $_GET 获取栏目ID。
// list.php $cid = isset($_GET['cid']) ? (int)$_GET['cid'] : 0; // 安全地获取栏目ID // ...后续逻辑中使用 $cid 查询数据库...
函数内部与外部的变量传递
在函数内部,默认情况下无法直接访问函数外部的变量,需要通过特定方式传递。

-
通过参数传递 (值传递): 将变量的值复制一份给函数参数。
$myVar = "Hello"; function myFunction($param) { $param = "World"; // 这里的修改不会影响外部的 $myVar } myFunction($myVar); echo $myVar; // 输出仍然是 "Hello" -
通过引用传递 (
&): 将变量的内存地址传递给函数,函数内对该变量的修改会直接影响外部变量。$myVar = "Hello"; function myFunction(&$param) { $param = "World"; // 这里的修改会影响外部的 $myVar } myFunction($myVar); echo $myVar; // 输出 "World" -
global关键字: 在函数内部声明一个变量为全局变量,使其可以访问和修改函数外部的同名变量。$globalVar = "Hello"; function myFunction() { global $globalVar; // 声明 $globalVar 是全局变量 $globalVar = "World"; } myFunction(); echo $globalVar; // 输出 "World"
DedeCMS 的核心机制:$dsql 数据库查询类
这是 DedeCMS 中最重要的变量之一,它是一个全局的数据库连接和操作实例,几乎所有涉及数据库查询的地方都会用到它。
$dsql 通常在 include/common.inc.php 中被初始化为全局变量,因此在其他文件中可以直接使用。
示例:
在 arclist.php (用于调用文章列表的PHP文件) 中,通过 $dsql 获取数据。
// arclist.php
require_once(dirname(__FILE__)."/../include/common.inc.php"); // 引入初始化文件,获得 $dsql
// ...解析模板标签...
// 假设我们需要获取某个栏目的文章
$sql = "SELECT id, title, pubdate FROM `#@__archives` WHERE typeid = 10 ORDER BY id DESC";
$dsql->SetQuery($sql);
$dsql->Execute();
while ($row = $dsql->GetArray()) {
// $row 就是每一篇文章的数据,是一个关联数组
// $row['title'] 就是文章标题
// 这里会将数据传递给模板引擎
}
模板层 的变量传递与显示
这是 DedeCMS 的核心,它将 PHP 处理好的数据,通过特定的标签语法,在模板文件 (.htm) 中显示出来。
PHP 将数据“传递”给模板
在 PHP 文件中,处理完数据后,需要将这些数据打包,然后交给模板引擎去解析。
-
$tpl->Assign()方法: 这是 DedeCMS 推荐的、最标准的方式。- 第一个参数是模板中使用的变量名。
- 第二个参数是要传递的 PHP 变量。
示例: 在
index.php中,我们获取一个友情链接列表,然后传递给模板index.htm。// index.php require_once(dirname(__FILE__)."/include/common.inc.php"); // 1. 从数据库获取数据 $sql = "SELECT url, webname FROM `#@__flink` WHERE ischeck = 1"; $dsql->SetQuery($sql); $dsql->Execute(); $flinkArray = array(); while ($row = $dsql->GetArray()) { $flinkArray[] = $row; } // 2. 引入模板引擎类 require_once(DEDEINC."/arc.partview.class.php"); $pv = new PartView(); // 3. 将 PHP 变量 $flinkArray 传递给模板,模板中可以使用 {dede:flink} 标签 $pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/default/index.htm"); $pv->Display(); // 显示模板注意: 上面这个例子中,数据并没有通过
Assign显式传递,这是因为arclist、flink等系统标签的底层逻辑已经封装好了,当我们直接使用{dede:flink}时,DedeCMS 的底层会自动查询数据库并将结果传递给模板。 -
直接赋值给
$artlist等全局变量: 在一些自定义的 PHP 页面中,开发者会直接给一些预定义的全局变量赋值,然后在模板中使用。// mypage.php $artlist = array( array('title' => '文章1', 'pubdate' => '2025-01-01'), array('title' => '文章2', 'pubdate' => '2025-01-02') ); // ...然后引入模板...在模板
mypage.htm中:{dede:artlist} <li> [field:title/] - [field:pubdate function='MyDate("Y-m-d",@me)'/] </li> {/dede:artlist}
模板中如何接收和显示变量
DedeCMS 模板引擎使用 符号来解析变量和标签。
-
单变量:
{dede:field.name/}name是在 PHP 中通过Assign()传递的变量名。- PHP 中
$tpl->Assign('title', '欢迎来到我的网站');,模板中就用{dede:field.title/}来显示。
-
数组/循环变量:
{dede:loop}或{dede:arclist}等块级标签 这些标签用于循环输出一个数组,每次循环,[field:属性名/]就会指向数组中的一个元素。示例: PHP 中传递了一个
$flinkArray数组。 在模板中:{dede:flink type='text'} <a href="[field:url/]" target="_blank">[field:webname/]</a> {/dede:flink}DedeCMS 底层会循环
$flinkArray,每次循环时,[field:url/]对应$row['url'],[field:webname/]对应$row['webname']。 -
函数修饰:
function='函数名'可以对变量值进行 PHP 函数处理后再输出。示例:
[field:pubdate function='MyDate("Y-m-d H:i:s",@me)'/]@me代表当前字段的原始值。MyDate是 DedeCMS 内置的一个日期格式化函数。- 这行代码的意思是:获取
pubdate字段的值,并用MyDate函数将其格式化为 "年-月-日 时:分:秒" 的格式。
实战场景:自定义一个页面并传递变量
假设我们要创建一个 about.php 页面,显示一个关于我们的文本,这个文本从数据库的 dede_arctype 表中获取(假设我们把“关于我们”栏目的描述信息存在这里)。
步骤 1: 创建 PHP 文件 about.php
<?php
require_once(dirname(__FILE__)."/include/common.inc.php"); // 引入核心文件,获得 $dsql
// 1. 从数据库获取数据
// 假设“关于我们”栏目的ID是 1
$aboutTypeId = 1;
$sql = "SELECT description FROM `#@__arctype` WHERE id = $aboutTypeId";
$row = $dsql->GetOne($sql); // GetOne() 用于获取单条记录
$aboutContent = $row['description'];
// 2. 引入并设置模板引擎
require_once(DEDEINC."/arc.partview.class.php");
$pv = new PartView();
$tplfile = $cfg_basedir . $cfg_templets_dir . "/default/about.htm"; // 指定模板文件
// 3. 将变量传递给模板
// 我们使用一个 {dede:field} 标签来接收,所以这里的变量名是 'content'
$pv->Assign('content', $aboutContent);
// 4. 显示模板
$pv->SetTemplet($tplfile);
$pv->Display();
?>
步骤 2: 创建模板文件 templets/default/about.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">关于我们 - {dede:global.cfg_webname/}</title>
</head>
<body>
<h1>关于我们</h1>
<hr>
<!-- 这里接收并显示从 about.php 传递过来的 $aboutContent 变量 -->
{dede:field.content/}
</body>
</html>
流程总结:
about.php执行,通过$dsql从数据库查询出描述文本,存入$aboutContent变量。about.php创建模板引擎对象$pv。$pv->Assign('content', $aboutContent);将 PHP 变量$aboutContent的值,关联到模板中的content字段。$pv->Display();解析about.htm模板。- 模板引擎在解析
{dede:field.content/}时,发现它对应着$aboutContent的值,于是将其替换到模板中。 - 最终生成完整的 HTML 页面并输出给浏览器。
| 传递方向 | 方法/机制 | 示例 | 说明 |
|---|---|---|---|
| PHP 内部 | 超全局变量 $_GET, $_POST |
$id = $_GET['id']; |
获取外部请求的数据。 |
引用传递 & |
function myFunc(&$var) |
函数内修改会影响外部变量。 | |
global 关键字 |
global $myVar; |
在函数内访问全局变量。 | |
| PHP -> 模板 | Assign() 方法 |
$tpl->Assign('title', '首页'); |
标准方式,显式传递变量。 |
| 系统标签底层逻辑 | {dede:arclist...} |
DedeCMS 自动查询数据库并传递,开发者无需关心 Assign。 |
|
| 模板接收 | 单变量标签 | {dede:field.title/} |
显示通过 Assign 传递的单个变量。 |
| 循环标签 | {dede:arclist}<li>[field:title/]</li>{/dede:arclist} |
循环显示数组数据。 | |
| 函数修饰 | [field:pubdate function='MyDate(...)'/] |
对变量值进行二次处理。 |
理解了这套从 PHP 数据处理到模板渲染的完整流程,你就能游刃有余地进行 DedeCMS 的各种二次开发了。
