一个后台控制文件和一个模板文件。

(图片来源网络,侵删)
核心文件概览
-
后台控制文件:
/dede/index_makehtml.php- 作用: 这是用户在后台点击“生成首页”按钮时,实际被调用的PHP脚本,它负责处理用户的请求,并调用核心的生成函数。
- 位置: 位于织梦后台目录
dede/下。
-
模板文件:
/templets/default/index.htm- 作用: 这是首页的“蓝图”或“设计稿”,PHP引擎会读取这个文件,并将其中的特定标签(如
{dede:arclist})替换成从数据库中查询出的实际内容,最终生成HTML。 - 位置: 位于网站根目录的
templets/目录下,default是默认的模板文件夹名。
- 作用: 这是首页的“蓝图”或“设计稿”,PHP引擎会读取这个文件,并将其中的特定标签(如
-
核心生成函数:
MakeOneHtml()- 作用: 这是执行生成任务的核心函数,它定义在
include/arc.partview.class.php文件中。index_makehtml.php会实例化这个类并调用这个方法来生成首页。
- 作用: 这是执行生成任务的核心函数,它定义在
后台控制文件:/dede/index_makehtml.php
当你登录织梦后台,进入“生成” -> “主页HTML生成”页面,并点击“生成主页HTML”按钮时,浏览器会向 index_makehtml.php 发送一个请求(通常是POST请求)。

(图片来源网络,侵删)
这个文件的主要逻辑如下:
<?php
require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC."/arc.partview.class.php");
// 检查用户权限
CheckPurview('a_Check,a_MakeHtml');
// 获取模板目录
$templet = empty($templet) ? '' : trim($templet);
// 如果没有指定模板,则使用默认的首页模板
if ($templet == '') {
$templet = $cfg_basedir.$cfg_templets_dir."/default/index.htm";
}
// 实例化核心生成类
$pv = new PartView();
// 设置模板文件
$pv->SetTemplet($templet);
// 生成HTML并保存
$pv->SaveToHtml($cfg_basedir.$cfg_indexname);
// 显示成功信息
ShowMsg("成功生成首页文件!", "index_makehtml.php");
exit();
?>
代码解读:
require_once "config.php": 加载网站的核心配置文件,获取数据库连接信息、网站路径等。require_once "arc.partview.class.php": 加载首页生成的核心类文件PartView。CheckPurview(...): 检查当前登录用户是否有生成HTML的权限。$templet = ...: 确定要使用的首页模板文件路径,如果后台没有指定,就默认使用templets/default/index.htm。$pv = new PartView();: 最关键的一步,创建一个PartView类的实例对象$pv。$pv->SetTemplet($templet);: 调用$pv对象的方法,告诉它要使用哪个模板文件。$pv->SaveToHtml($cfg_basedir.$cfg_indexname);: 执行生成操作,这个方法会:- 读取
SetTemplet指定的模板文件内容。 - 解析模板中的所有织梦标签。
- 从数据库获取标签对应的数据。
- 将数据填充到模板中,生成最终的HTML代码。
- 将生成的HTML代码写入到
$cfg_indexname指定的文件中(通常是/index.html)。
- 读取
ShowMsg(...): 生成成功后,在后台显示一个提示信息,并跳转回生成页面。
模板文件:/templets/default/index.htm
这个文件是纯HTML和织梦标签的混合体,织梦引擎在生成时会解析其中的标签。
一个典型的 index.htm 结构示例:

(图片来源网络,侵删)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">{dede:global.cfg_webname/}</title>
<meta name="keywords" content="{dede:global.cfg_keywords/}" />
<meta name="description" content="{dede:global.cfg_description/}" />
</head>
<body>
<header>
<!-- 网站Logo -->
<h1><a href="{dede:global.cfg_basehost/}">{dede:global.cfg_webname/}</a></h1>
</header>
<nav>
<!-- 调用顶级栏目列表 -->
{dede:channel type='top' row='8'}
<a href="[field:typelink/]">[field:typename/]</a>
{/dede:channel}
</nav>
<main>
<section class="focus">
<!-- 调用首页焦点图 -->
{dede:arclist row='5' typeid='2' channelid='1'}
<a href="[field:arcurl/]"><img src="[field:picname/]" alt="[field:title/]"></a>
{/dede:arclist}
</section>
<section class="news-list">
<h2>最新资讯</h2>
<!-- 调用文章列表,显示10条 -->
{dede:arclist row='10' titlelen='30'}
<li>
<span class="date">[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
<a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a>
</li>
{/dede:arclist}
</section>
</main>
<footer>
<p>Powered by <a href="https://www.dedecms.com/">DedeCMS</a></p>
</footer>
</body>
</html>
常见标签说明:
{dede:global.cfg_webname/}: 网站名称,从后台配置中读取。{dede:channel type='top'}: 调用栏目。type='top'表示只调用顶级栏目。{dede:arclist ...}: 最常用的标签,用于调用文章列表。row='10': 显示10条记录。typeid='2': 只调用ID为2的栏目下的文章。titlelen='30': 标题长度限制为30个字符。[field:arcurl/]: 文章链接。[field:title/]: 文章标题。[field:pubdate/]: 发布日期,常配合function进行格式化。
核心生成类:/include/arc.partview.class.php
这个文件是整个生成过程的“发动机”。PartView 类负责将模板和数据库结合起来。
MakeOneHtml() (或 SaveToHtml()) 方法的大致流程:
- 读取模板: 使用
file_get_contents()函数将模板文件(如index.htm)的全部内容读入一个字符串变量中。 - 解析标签: 遍历这个字符串,使用正则表达式查找所有
{dede:xxx}格式的标签。 - 执行标签: 对于找到的每一个标签,会调用对应的处理函数(如
lib_arclist.class.php处理arclist标签),这些处理函数会连接数据库,执行SQL查询,获取数据。 - : 将获取到的数据格式化后,替换掉模板中的原始标签。
{dede:arclist row='3'}会被替换成3条文章列表的HTML代码。 - 处理全局变量: 替换
{dede:global}等全局标签。 - 写入文件: 将最终生成的、不含任何织梦标签的纯HTML字符串,通过
file_put_contents()函数写入到指定的静态HTML文件(如/index.html)中。
总结与常见问题
生成首页HTML的完整链路是:
用户操作 (后台点击) -> /dede/index_makehtml.php -> 实例化 PartView 类 -> 加载 /templets/default/index.htm 模板 -> PartView 解析模板标签并从数据库获取数据 -> 生成最终HTML -> 写入 /index.html。
常见问题排查:
-
生成失败或空白页:
- 权限问题: 确保Web服务器(如Apache/Nginx)对
index.html文件所在的目录(通常是网站根目录)有写入权限。 - 模板路径错误: 检查
index_makehtml.php中$templet变量指向的模板文件是否存在。 - PHP错误: 检查PHP错误日志,可能是模板中有语法错误或PHP代码执行出错。
- 权限问题: 确保Web服务器(如Apache/Nginx)对
-
生成的HTML内容不正确或过时:
- 标签错误: 检查模板中的织梦标签(如
{dede:arclist})的参数是否正确。 - 缓存问题: 织梦有缓存机制,尝试在后台清空所有缓存后重新生成。
- 数据问题: 确保数据库中有对应的数据。
typeid指定的栏目下是否有文章。
- 标签错误: 检查模板中的织梦标签(如
-
如何自定义首页模板?
- 在
templets目录下新建一个文件夹(如mytemplate)。 - 将
default/index.htm复制到mytemplate目录下,并进行修改。 - 在后台“生成” -> “主页HTML生成”页面,选择你新建的模板,然后点击生成。
- 在
理解这三个核心文件及其交互关系,就能掌握织梦CMS首页静态化的精髓,并能从容地解决大部分生成相关的问题。
