这个文件是织梦模板系统中的一个核心文件,它不直接生成最终的HTML页面,而是定义了模板中 {dede:body} 这个标签所输出的内容。
index.html(或其他模板文件):是你网站首页的“骨架”,里面使用了{dede:body}标签来预留内容区域。body.php:是填充这个{dede:body}区域的“血肉”,它决定了具体要调用哪些数据并如何显示。
body.php 文件的位置
body.php 文件位于你的织梦模板目录下,路径通常是:
/templets/你的模板名称/body.php
如果你的模板文件夹是 default,那么路径就是 /templets/default/body.php。
body.php 文件的作用与工作原理
它的工作流程大致如下: 一个标准的 代码详解: 假设你有两个栏目: 你可以修改 如果你使用了自定义模型,并且需要为这些模型创建专门的列表页模板,你也可以通过修改 理解 body.php 的主要作用是根据当前页面的类型(如首页、列表页、文章页等),动态地加载并执行相应的模板文件,然后将生成的HTML代码返回给 {dede:body}
index.php)时,织梦系统会加载并解析 index.html 模板。{dede:body}:当解析器遇到 {dede:body} 标签时,它会调用 body.php 文件。body.php 内部会通过 PHP 代码判断当前是什么类型的页面,它通常会检查 GLOBALS['cfg_phpurl'] 等全局变量或 GET 参数。body.php 会决定去加载哪个具体的模板文件。
index.htm。list_article.htm。article_article.htm。body.php 会加载并执行这个具体的模板文件(这通常通过 include 或 require 实现),然后将这个模板文件最终生成的HTML内容,作为 {dede:body} 标签的输出值。index.html 中的 {dede:body} 被替换为实际的HTML内容,一个完整的页面就生成了。
body.php 文件的典型代码结构body.php 文件通常包含一个 switch 语句,用来处理不同页面类型,下面是一个最常见、最经典的 body.php 代码示例:<?php
if(!defined('DEDEINC')) exit('Request Error!');
// 根据不同的页面类型,加载对应的模板文件
// $this 通常指代当前的对象实例,包含了页面相关的所有信息
switch($this->TypeID)
{
// 首页
case '0':
// 如果是首页,加载 index.htm 模板
$file = 'index.htm';
break;
// 普通栏目列表页
default:
// 如果是栏目列表页,加载 list_栏目ID.htm 模板
// 栏目ID为 1 的列表页,会加载 list_1.htm
$file = 'list_'.$this->TypeID.'.htm';
break;
}
// 如果文件存在,则加载并输出
if( file_exists(DEDETEMPLATE.'/'.$this->templets.'/'.$file) )
{
include(DEDETEMPLATE.'/'.$this->templets.'/'.$file);
}
// 如果文件不存在,则加载一个默认的列表模板
else
{
include(DEDETEMPLATE.'/'.$this->templets.'/list_default.htm');
}
?>
if(!defined('DEDEINC')) exit('Request Error!');:这是标准的PHP安全检查,确保文件只能被织梦系统调用,防止直接访问。switch($this->TypeID):核心判断逻辑。$this->TypeID 是一个关键变量,它代表了当前页面的栏目ID。
case '0'::在织梦系统中,栏目ID为 0 通常代表首页,所以当访问首页时,会执行这里的代码,加载 index.htm。default::TypeID 不是 0(即不是首页),那么就认为是某个栏目的列表页,它会拼接出 list_栏目ID.htm 这样的文件名,list_5.htm 代表ID为5的栏目列表页。file_exists(...):在加载模板前,先检查文件是否存在,这是一个很好的编程习惯。include(...):这才是真正的加载文件。include 会执行被包含文件中的PHP代码(织梦标签),并将输出内容合并到当前页面。else:如果找不到对应的模板文件(比如你删除了 list_5.htm),系统会加载一个默认的 list_default.htm,避免页面报错。
如何自定义或修改
body.phpbody.php 是一个非常灵活的文件,你可以通过修改它来实现很多自定义功能。场景1:为不同栏目指定完全不同的模板
list_news.htm 模板。list_product.htm 模板。list_default.htm。body.php 如下:<?php
if(!defined('DEDEINC')) exit('Request Error!');
switch($this->TypeID)
{
// 首页
case '0':
$file = 'index.htm';
break;
// 新闻栏目 (ID=1)
case '1':
$file = 'list_news.htm'; // 指定新闻列表模板
break;
// 产品栏目 (ID=2)
case '2':
$file = 'list_product.htm'; // 指定产品列表模板
break;
// 其他所有栏目
default:
$file = 'list_default.htm'; // 使用一个更通用的默认模板
break;
}
if( file_exists(DEDETEMPLATE.'/'.$this->templets.'/'.$file) )
{
include(DEDETEMPLATE.'/'.$this->templets.'/'.$file);
}
else
{
// 可以在这里输出一个错误提示,或者加载一个404模板
echo "模板文件 {$file} 不存在!";
}
?>
场景2:增加自定义页面类型的支持
body.php 来实现,假设你的自定义模型列表页模板命名规则是 custom_model_模型ID.htm。<?php
if(!defined('DEDEINC')) exit('Request Error!');
// 假设 $this->ChannelType 可以用来区分是普通栏目还是自定义模型
if($this->ChannelType == '自定义模型类型')
{
// 加载自定义模型的列表模板
$file = 'custom_model_'.$this->ChannelID.'.htm';
}
else
{
// 原有的逻辑...
switch($this->TypeID)
{
case '0':
$file = 'index.htm';
break;
default:
$file = 'list_'.$this->TypeID.'.htm';
break;
}
}
// ... 后面的文件检查和加载逻辑不变
if( file_exists(DEDETEMPLATE.'/'.$this->templets.'/'.$file) )
{
include(DEDETEMPLATE.'/'.$this->templets.'/'.$file);
}
else
{
include(DEDETEMPLATE.'/'.$this->templets.'/list_default.htm');
}
?>
特性
描述
文件位置
/templets/你的模板名称/body.php
核心功能
定义
{dede:body} 标签的输出内容,实现模板的动态加载。
工作原理
通过
switch 语句判断当前页面类型(首页、列表页等),include 对应的模板文件(如 index.htm, list_x.htm)。
核心变量
$this->TypeID (栏目ID),$this->templets (模板目录名)。
自定义价值
非常高,可以用来实现不同栏目使用不同模板、为自定义模型创建模板、甚至改变整个页面的渲染逻辑。
修改注意事项
修改前务必备份原文件,错误的修改会导致网站页面无法正常显示。
body.php 是掌握织梦模板二次开发的关键一步,它连接了模板标签和具体的模板文件,是织梦模板引擎的“调度中心”。
