DedeTemplate 类是什么?
DedeTemplate 类是织梦CMS的模板引擎,它的主要作用是:

(图片来源网络,侵删)
- 加载模板文件:从服务器上读取
.htm后缀的模板文件内容。 - 解析模板标签:识别模板文件中的织梦特定标签,如
{dede:arclist}、{dede:field.title}、{dede:include filename='head.htm' /}等。 - 编译模板:将解析后的模板标签转换成PHP代码。
- 缓存处理:将编译后的PHP代码保存到一个缓存文件中(通常是
.php文件),以避免每次访问页面时都重新解析,从而提升性能。 - 执行并生成HTML:包含并执行这个编译后的PHP缓存文件,最终生成用户看到的静态HTML内容。
DedeTemplate 是连接内容数据和模板界面的桥梁。
核心工作流程
DedeTemplate 的工作流程非常清晰,这也是它高效的关键所在。
- 请求发起:用户访问一个动态页面,
plus/list.php?tid=1。 - 初始化模板引擎:PHP脚本(如
list.php)会创建一个DedeTemplate对象实例。$dtp = new DedeTemplate();
- 设置模板目录和缓存目录:指定从哪里读取模板文件,以及将编译后的文件存放到哪里。
$dtp->SetTemplateDir(DEDETEMPLATEPATH); // 通常为 /templets/default/ $dtp->SetCacheDir(DEDEDATA.'/cache'); // 通常为 /data/cache/
- 加载模板文件:调用
LoadTemplate()方法,传入模板文件名(如list_article.htm)。$dtp->LoadTemplate('list_article.htm'); - 检查缓存:
LoadTemplate内部会首先检查是否存在对应的缓存文件(如list_article.php),并且缓存文件是否比模板文件新,如果缓存有效,则直接跳到第8步。 - 解析与编译:如果缓存无效或不存在,
DedeTemplate会:- 读取
list_article.htm的内容。 - ,识别所有织梦标签。
- 将这些标签替换成对应的PHP代码片段。
- 将编译后的PHP代码写入到缓存文件
list_article.php中。
- 读取
- 执行模板:调用
Display()方法。$dtp->Display();
- 生成并输出HTML:
Display()方法会include并执行缓存文件中的PHP代码,PHP代码会访问数据库获取数据(通过织梦的标签函数),将数据填充到模板中,最终生成完整的HTML并输出给浏览器。
常用方法详解
以下是 DedeTemplate 类中最常用的一些方法及其说明。
构造函数 __construct()
DedeTemplate::__construct()
创建一个 DedeTemplate 对象实例。

(图片来源网络,侵删)
LoadTemplate($filename)
DedeTemplate::LoadTemplate($filename)
这是最核心的方法之一,用于加载并编译模板。
$filename: 模板文件的相对路径,相对于之前设置的模板目录。- 功能:
- 检查并加载缓存文件。
- 如果缓存无效,则解析源模板文件并生成新的缓存文件。
- 返回值: 成功时返回
true,失败时返回false。
Display()
DedeTemplate::Display()
显示最终的HTML内容。
- 功能:
- 包含并执行编译后的缓存PHP文件。
- 将生成的HTML直接输出到浏览器。
- 注意: 此方法通常在
LoadTemplate()之后调用。
SaveTo($filename)
DedeTemplate::SaveTo($filename)
将编译后的模板代码保存到一个指定的文件中,而不是默认的缓存目录。
$filename: 要保存的完整文件路径。- 用途: 常用于生成静态HTML文件,在生成栏目页时,可以将编译后的内容保存为一个
.html文件。
SetTemplateDir($dirname)
DedeTemplate::SetTemplateDir($dirname)
设置模板文件的根目录。

(图片来源网络,侵删)
$dirname: 模板目录的绝对路径。- 示例:
$dtp->SetTemplateDir(DEDETEMPLATEPATH);
SetCacheDir($dirname)
DedeTemplate::SetCacheDir($dirname)
设置编译后缓存文件的存放目录。
$dirname: 缓存目录的绝对路径。- 示例:
$dtp->SetCacheDir(DEDEDATA.'/cache');
Assign($key, $value)
DedeTemplate::Assign($key, $value)
向模板分配一个变量,类似于PHP的 assign() 方法,虽然织梦更常用标签,但在某些复杂场景下,此方法也很有用。
$key: 变量名。$value: 变量值。- 在模板中使用:
{dede:var.name key='your_key' /}或直接在PHP代码中操作编译后的缓存文件。
GetResult()
DedeTemplate::GetResult()
获取编译后的PHP代码内容,但不执行。
- 功能: 返回一个包含所有编译后PHP代码的字符串。
- 用途: 通常与
SaveTo()结合使用,先获取代码,再保存到文件,在生成静态页面的流程中。
实战示例:手动使用 DedeTemplate 类
假设我们要手动解析并显示一个简单的模板文件 test.htm。
创建模板文件 /templets/default/test.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">{dede:global.cfg_webname/}</title>
</head>
<body>
<h1>欢迎来到织梦CMS!</h1>
<p>当前时间:{dede:global.cfg_webname/}</p>
<ul>
{dede:arclist row='5' titlelen='30'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>- [field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
</ul>
</body>
</html>
创建PHP脚本 /test_template.php
<?php
require_once (dirname(__FILE__) . "/include/common.inc.php");
require_once DEDEINC."/dedetemplate.class.php";
// 1. 实例化模板引擎
$dtp = new DedeTemplate();
// 2. 设置模板和缓存目录 (通常在配置文件中定义,这里手动设置)
$dtp->SetTemplateDir(DEDETEMPLATEPATH);
$dtp->SetCacheDir(DEDEDATA.'/cache');
// 3. 加载并编译模板文件
// 假设 test.htm 在 /templets/default/ 目录下
$loadResult = $dtp->LoadTemplate('default/test.htm');
if ($loadResult) {
echo "模板加载并编译成功!<br><hr>";
// 4. 显示模板内容
// 这一步会执行编译后的PHP代码,并输出HTML
$dtp->Display();
} else {
echo "模板加载失败!";
}
?>
访问脚本
当你通过浏览器访问 /test_template.php 时,它会输出 test.htm 解析后的完整HTML页面。/data/cache/ 目录下会自动生成一个对应的编译缓存文件(test.php 或类似名称的文件)。
总结与注意事项
- 核心价值:
DedeTemplate通过“编译缓存”机制,将耗时的模板解析工作从运行时转移到首次访问时,极大地提升了网站的访问速度。 - 缓存机制:理解缓存机制很重要,当你修改了模板文件后,由于缓存文件比模板文件新,所以页面不会立即更新,你需要清空缓存目录(
/data/cache/)或等待服务器自动覆盖缓存,才能看到修改后的效果。 - 二次开发:在进行深度二次开发时,你可能需要直接继承或修改
DedeTemplate类,以实现自定义的标签或优化编译逻辑。 - 调试:如果模板不显示或显示异常,首先应该检查:
- 模板文件路径是否正确。
- 缓存目录是否有写入权限。
- 查看缓存文件内容,检查编译后的PHP代码是否有语法错误。
- 查看服务器错误日志。
掌握 DedeTemplate 类,就等于掌握了织梦CMS的“渲染引擎”,对于任何织梦开发者来说都是一项必备技能。
