这个文件是 DedeCMS 的列表页入口文件,它的主要作用是接收用户请求,解析各种参数,然后调用相应的模板引擎,最终生成并显示一个内容列表页面,比如文章列表、产品列表等。

下面我将从几个方面对它进行详细拆解:
文件的核心功能与作用
想象一下一个网站的“新闻中心”页面,这个页面会显示所有新闻的标题、日期、摘要等,当你点击“分页”按钮,或者选择某个“分类”时,页面内容会随之改变。
plus/list.php 就是处理这一切逻辑的幕后英雄,它负责:
- 接收请求:获取 URL 中的参数,比如分类ID (
typeid)、页码 (page)、关键词 (keyword) 等。 - 数据查询:根据接收到的参数,构建数据库查询语句,从
dede_archives(文章表) 等表中筛选出符合条件的记录。 - 分页处理:如果数据量很大,它会计算出总页数,并生成分页导航条(如“首页 上一页 1 2 3 4 5 下一页 末尾”)。
- 模板渲染:将查询到的数据填充到指定的列表模板(通常是
/templets/default/list_article.htm)中。 - 输出生成:将渲染好的 HTML 内容发送到浏览器,展示给用户。
文件执行流程解析
list.php 的代码执行流程非常经典,我们可以一步步来看:

初始化与安全检查
require_once(dirname(__FILE__)."/../include/common.inc.php");
这是文件的第一行,也是最重要的,它引入了 DedeCMS 的核心公共文件 common.inc.php,这个文件做了很多事情:
- 加载全局配置 (
config_base.php)。 - 建立数据库连接。
- 定义一些常用函数和常量。
- 进行基本的安全检查和初始化工作。
获取并处理参数
文件接下来会从 $_GET 或 $_POST 超全局变量中获取各种参数。
// 获取栏目ID $tid = isset($typeid) && is_numeric($typeid) ? $typeid : 0; // 获取页码 $PageNo = isset($PageNo) ? intval($PageNo) : 1; // 获取关键字 $keyword = isset($keyword) ? trim(HtmlReplace($keyword, -1)) : ''; // 获取排序方式 $orderby = isset($orderby) ? trim($orderby) : '';
这里对参数进行了基本的过滤和类型转换,is_numeric() 和 intval(),目的是防止 SQL 注入等安全问题。
核心逻辑:获取列表数据
这是 list.php 的核心部分,它通过 GetList() 函数(在 arc.listview.class.php 中定义)来获取数据。

// 实例化列表类 $lv = new ListView($tid, $PageNo); // 获取列表数据 $lv->GetList($keyword, $orderby, $IsMake, $channelid, $limitstart, $row, $GetMorePage, $gtype); // 将数据传递给模板 $list = $lv->Fields['list']; // 文章列表数组 $pagelist = $lv->GetPageList(); // 分页HTML代码
ListView 类非常强大,它内部完成了:
- 根据
$tid(栏目ID) 获取栏目的相关信息(如名称、模板路径等)。 - 构建复杂的 SQL 查询语句,考虑了栏目属性、会员权限、关键字、排序等多种因素。
- 执行查询,获取当前页的数据。
- 计算总记录数,用于生成分页。
调用并解析模板
获取到数据和分页代码后,下一步就是显示它们。
// 获取栏目信息
$tpid = $lv->TypeInfos['id'];
$typename = $lv->TypeInfos['typename'];
// 准备模板变量
$dtp = new DedeTagParse();
$dtp->LoadTemplate($lv->TypeInfos['tempindex']);
$dtp->SetVar('typename', $typename);
$dtp->SetVar('position', GetPositionLink($tpid)); // 生成当前位置导航
$dtp->SetVar('list', $list);
$dtp->SetVar('page', $pagelist);
// 执行模板解析并输出
$dtp->Display();
这里的关键点是 $lv->TypeInfos['tempindex'],它决定了使用哪个模板文件,这个值通常在后台的“栏目管理”中设置,如果没设置,则使用默认的模板。
DedeTagParse 是 DedeCMS 的模板解析引擎,它会解析模板中的特定标签(如 {dede:list}、{dede:pagelist}),并将我们设置的变量($list, $page)替换进去,最终生成完整的 HTML。
结束
脚本执行完毕,将处理后的 HTML 输出到浏览器。
URL 参数详解
list.php 的功能是通过 URL 参数来驱动的,常见的参数有:
| 参数名 | 作用 | 示例 |
|---|---|---|
typeid |
核心参数,指定要显示哪个栏目的列表。 | plus/list.php?typeid=6 (显示ID为6的栏目列表) |
PageNo |
指定页码。 | plus/list.php?typeid=6&PageNo=3 (显示第3页) |
keyword |
搜索关键字,用于在当前栏目下搜索。 | plus/list.php?typeid=6&keyword=织梦 |
orderby |
排序方式,常见值有 hot (按点击)、pubdate (按发布日期)、score (按评分) 等。 |
plus/list.php?typeid=6&orderby=hot |
totalresult |
总记录数,通常用于AJAX请求。 | plus/list.php?typeid=6&totalresult=100 |
如何自定义列表页行为?
开发者经常需要修改 list.php 来满足特定需求。
修改默认排序
如果你想改变列表的默认排序方式(比如默认按点击排序而不是按发布日期),可以修改 GetList() 函数的调用部分,或者直接修改 arc.listview.class.php 中的默认值。
添加自定义查询条件
如果你想在列表页额外显示某个自定义字段,或者根据某个自定义字段进行筛选,你需要:
- 修改 SQL 查询:在
arc.listview.class.php的GetListSql()方法中,向SELECT语句和WHERE条件中添加你的字段。 - 修改模板:在列表模板中,使用
{dede:field.自定义字段名 /}来显示该字段。
修改分页逻辑
如果默认的分页逻辑(如每页显示条数)不满足需求,可以修改 ListView 类的初始化参数,或者在 GetList() 函数中传入 $row (每页显示条数) 参数。
plus/list.php 是 DedeCMS 中一个功能明确、结构清晰的文件,它扮演着“数据展示层”和“业务逻辑层”之间的桥梁角色。
- 对于使用者:你只需要理解它的 URL 参数,就能通过修改模板和后台设置来构建出各种列表页面。
- 对于开发者:深入理解它的执行流程和与
ListView类的交互,是进行二次开发、修改默认行为和添加复杂功能的基础。
掌握了 list.php,你就掌握了 DedeCMS 动态内容列表生成的核心钥匙。
