datalist 是一个非常灵活的标签,它本身不具备分页能力,但它可以完美地与 DedeCMS 的核心分页标签 pagelist 结合使用,实现强大的自定义列表分页。

(图片来源网络,侵删)
核心原理
实现分页的关键在于两个部分:
{dede:datalist}: 负责从数据库中获取指定数量的数据,并根据当前页码 (page) 返回对应的数据段,它的分页功能由底层文件arc.listview.class.php自动处理。{dede:pagelist}: 负责根据datalist获取到的总数据量,生成分页的导航链接(如:首页、上一页、1 2 3 4 5、下一页、末页)。
这两个标签必须配合使用,datalist 的查询条件需要确保能够获取到所有符合条件的记录总数,pagelist 才能正确生成分页。
实现步骤
假设我们要在一个自定义页面中,调用 "文章模型" (article) 下某个栏目 (ID=1) 的文章,并实现分页,每页显示10条。
第 1 步:准备 PHP 文件
- 创建模板文件: 在你的模板目录 (通常是
/templets/default/) 下创建一个 HTML 文件,my_list.html。 - 创建 PHP 处理文件: 在网站根目录下创建一个 PHP 文件,
my_list.php,这个文件负责接收页面参数,并调用模板。
my_list.php 文件内容:

(图片来源网络,侵删)
<?php require_once (dirname(__FILE__) . "/include/common.inc.php"); require_once DEDEINC."/arc.listview.class.php"; // --- 关键配置 --- // 1. 设置模板文件路径 $tplfile = DEDETEMPLATE.'/default/my_list.html'; // 2. 设置要查询的内容条件 // 这里我们查询栏目ID为1的所有文章 // 注意:这个条件必须能筛选出所有记录,以保证分页总数正确 $query = " WHERE typeid=1 AND arcrank > -1 "; // 3. 实例化列表类 $lv = new ListView($query,$tplfile); // 4. 显示页面 $lv->Display(); ?>
代码解释:
require_once "include/common.inc.php";: 引入 DedeCMS 的核心文件,获取所有全局变量和函数。require_once DEDEINC."/arc.listview.class.php";: 引入分页处理的核心类文件。$tplfile: 指定要使用的模板文件。$query: 这是最关键的一步,这里是datalist的 SQLWHERE子句,它定义了你要获取哪些数据。typeid=1: 只获取栏目ID为1的文章。arcrank > -1: 只获取已审核通过的文章,这是一个好习惯,避免草稿被显示出来。- 注意:这里不要写
LIMIT,分页的LIMIT会被ListView类自动处理。
new ListView($query, $tplfile): 创建一个ListView对象,并把查询条件和模板文件传递给它。$lv->Display(): 执行查询,解析模板,并最终将HTML内容输出到浏览器。
第 2 步:编写模板文件
我们来编写 my_list.html 模板文件,这个文件的结构是固定的,datalist 和 pagelist 的位置是固定的。
my_list.html 文件内容:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">我的自定义列表</title>
</head>
<body>
<h1>文章列表</h1>
<!--
{dede:datalist} 是循环输出数据的部分
它会被 ListView 类自动解析
-->
{dede:datalist}
<div class="post-item">
<h2><a href="[field:arcurl/]">[field:title/]</a></h2>
<p class="meta">发布时间:[field:pubdate function="MyDate('Y-m-d H:i',@me)"/] | 作者:[field:writer/]</p>
<div class="summary">
[field:description function="cn_substr(@me, 200)"/]...
</div>
</div>
{/dede:datalist}
<hr>
<!--
{dede:pagelist} 是生成分页导航的部分
它必须放在 {dede:datalist} 的后面
-->
<div class="pagination">
<ul>
{dede:pagelist listsize="2" listitem="index,pre,next,end,pageno"}
</ul>
</div>
</body>
</html>
模板标签解释:

(图片来源网络,侵删)
-
{dede:datalist} ... {/dede:datalist}:- 这是一个循环标签,
ListView类会自动在其中循环输出当前页的数据。 [field:arcurl/]: 文章的链接。[field:title/]: 文章标题。[field:pubdate/]: 发布时间,这里用function进行了格式化。[field:description/]: 这里用function截取了200个字符。
- 这是一个循环标签,
-
{dede:pagelist}:- 这个标签用来生成分页链接。
listsize="2": 显示2个“...”省略号,当页数很多时,会显示.5 6 [7] 8 9..20这样的效果。listitem="index,pre,next,end,pageno": 定义要显示的分页项。index: 首页pre: 上一页next: 下一页end: 末页pageno: 页码,1 2 3 4
- 你可以根据需要组合这些
listitem,listitem="pre,next,end"只显示上一页、下一页和末页。
第 3 步:访问页面
你可以通过浏览器访问 my_list.php 这个文件了。
http://www.yourdomain.com/my_list.php
你应该能看到栏目ID为1的文章列表,并且底部有分页导航,点击页码,就可以跳转到对应的页面了。
常见问题与注意事项
-
分页总数不准确
- 原因: 最常见的原因是
$query中的查询条件过于复杂,使用了子查询或者JOIN,导致ListView类无法正确获取总记录数 (TotalResult)。 - 解决方法:
- 确保
$query是一个简单的WHERE子句。 - 如果查询逻辑复杂,可以考虑在
my_list.php中手动执行COUNT(*)查询来获取总数,然后手动赋值给$lv->TotalResult。
- 确保
- 原因: 最常见的原因是
-
URL 中
?page=的问题- 默认情况下,分页链接是
my_list.php?page=2这样的形式,如果你希望美化 URL,可以结合 DedeCMS 的 "栏目目录默认页" 功能。 - 在后台 -> 栏目管理 -> 选择你的栏目 -> 修改,找到 “栏目列表选项”,设置 “列表命名规则”,
list_{page}.html。 - 你需要修改
my_list.php中的分页逻辑,使其能解析list_2.html这样的URL,这通常需要重写ListView类的部分方法,或者使用更高级的伪静态方案,相对复杂一些。
- 默认情况下,分页链接是
-
datalist和arclist的区别arclist: 用于在任意页面调用固定数量的文章(如首页调用最新文章、推荐文章),它不支持分页。datalist: 专门用于生成列表页,它必须配合 PHP 文件和ListView类才能工作,并且支持分页。- 简单记:需要分页的列表,用
datalist;不需要分页的少量内容,用arclist。
| 步骤 | 操作 | 关键点 |
|---|---|---|
| PHP 文件 | 创建 my_list.php,引入核心类,实例化 ListView。 |
$query 条件要准确,能获取所有记录。 |
| 模板文件 | 创建 my_list.html,使用 {dede:datalist} 循环数据,{dede:pagelist} 生成分页。 |
datalist 和 pagelist 的位置和写法要正确。 |
| 访问 | 通过浏览器访问 my_list.php。 |
URL 是 .php 文件,不是 .html 模板。 |
通过以上步骤,你就可以在 DedeCMS 中灵活地使用 datalist 标签实现任何你想要的列表分页效果了。
