dede php 内变量如何传递?

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

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

dede 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 查询数据库...

函数内部与外部的变量传递

在函数内部,默认情况下无法直接访问函数外部的变量,需要通过特定方式传递。

dede php 内变量传递
(图片来源网络,侵删)
  • 通过参数传递 (值传递): 将变量的值复制一份给函数参数。

    $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 显式传递,这是因为 arclistflink 等系统标签的底层逻辑已经封装好了,当我们直接使用 {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>

流程总结:

  1. about.php 执行,通过 $dsql 从数据库查询出描述文本,存入 $aboutContent 变量。
  2. about.php 创建模板引擎对象 $pv
  3. $pv->Assign('content', $aboutContent); 将 PHP 变量 $aboutContent 的值,关联到模板中的 content 字段。
  4. $pv->Display(); 解析 about.htm 模板。
  5. 模板引擎在解析 {dede:field.content/} 时,发现它对应着 $aboutContent 的值,于是将其替换到模板中。
  6. 最终生成完整的 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 的各种二次开发了。

-- 展开阅读全文 --
头像
dede tag标签结果出错,原因何在?
« 上一篇 01-25
织梦审核的文章不能生成
下一篇 » 01-25

相关文章

取消
微信二维码
支付宝二维码

目录[+]