在 DedeCMS 中,实现分页主要有两种方式:

(图片来源网络,侵删)
- 使用内置的
arclist:这是最简单、最直接的方式,适用于大多数常规列表。 - 使用
dede:sql:当需要执行复杂的自定义 SQL 查询时,使用此标签,分页处理会稍微复杂一些,但更灵活。
下面我们分别对这两种方式进行详细说明。
使用 arclist 标签分页 (推荐)
arclist 是 DedeCMS 的核心列表标签,它本身就支持分页功能,使用起来非常方便。
基本语法
arclist 标签的基本结构如下:
{dede:arclist
typeid='0'
row='10' len='30'
orderby='pubdate'
orderway='desc'
pagesize='10'
}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
</li>
{/dede:arclist}
<!-- 分页导航代码 -->
<div class="dede_pages">
<ul class="pagelist">
{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}
</ul>
</div>
关键属性解释
typeid: 指定要获取的栏目ID。typeid='0'表示获取所有栏目的内容。row: 每页显示的文章数量。orderby: 排序方式,如pubdate(发布时间)、click(点击量)、id(文章ID) 等。orderway: 排序方向,desc(降序) 或asc(升序)。pagesize: 【分页关键属性】 每页显示的文章数量,这个属性会覆盖row属性在分页中的作用。强烈建议使用pagesize而不是row来控制分页数量,这样逻辑更清晰。
分页标签 {dede:pagelist}
这个标签专门用来生成分页导航链接。

(图片来源网络,侵删)
listitem: 定义要显示的分页元素,常用值包括:index: 首页pre: 上一页next: 下一页end: 末页pageno: 页码info: 页面信息 (如 "共X页,当前第Y页")
listsize: 显示的页码数量,listsize='5'表示当前页码左右各显示2个页码。
完整示例
假设我们要创建一个“最新文章”列表页面,每页显示10篇文章。
模板文件 article_list.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">最新文章列表</title>
</head>
<body>
<h1>最新文章列表</h1>
<!-- 使用 arclist 标签调用文章列表 -->
{dede:arclist typeid='0' pagesize='10' orderby='pubdate' orderway='desc'}
<div class="article-item">
<h2><a href="[field:arcurl/]" title="[field:title/]">[field:title/]</a></h2>
<p class="info">发布时间:[field:pubdate function="MyDate('Y-m-d H:i:s', @me)"]</p>
<p class="summary">[field:description/]...</p>
</div>
{/dede:arclist}
<!-- 分页导航 -->
<div class="dede_pages">
<ul class="pagelist">
{dede:pagelist listitem="index,pre,next,end,pageno" listsize="5"/}
</ul>
</div>
</body>
</html>
创建栏目
- 在 DedeCMS 后台,创建一个新栏目(最新文章”)。
- 在“高级选项”中,选择“列表模板”,并选择你刚刚创建的
article_list.htm模板。 - 生成这个栏目的列表页面即可看到效果。
使用 dede:sql 标签分页
当 arclist 无法满足需求时(需要从多个表关联查询数据),就必须使用 dede:sql。dede:sql 的分页需要手动处理。

(图片来源网络,侵删)
基本思路
- 获取分页参数:通过
GetPageList()函数获取分页的 SQL 语句和总记录数。 - 执行查询:将分页 SQL 语句嵌入到
dede:sql标签中,获取当前页的数据。 - 显示数据:循环输出
dede:sql中的字段。 - 生成分页导航:使用
{dede:pagelist}标签,但需要额外配置。
完整示例
假设我们要查询 dede_archives 表中,某个特定分类(比如ID为1的分类)下的所有文章,并分页显示。
模板文件 custom_list.htm
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">自定义SQL分页列表</title>
</head>
<body>
<h1>自定义SQL分页列表</h1>
<!-- 第一步:获取分页参数和SQL -->
{dede:getsql sql="SELECT arc.id, arc.title, arc.pubdate, tp.typedir
FROM dede_archives AS arc
LEFT JOIN dede_arctype AS tp ON arc.typeid = tp.id
WHERE arc.typeid IN (1, 2) AND arc.arcrank > -1"
totalnum="totalcount"}
{/dede:getsql}
<!-- 第二步:使用获取到的分页SQL查询当前页数据 -->
{dede:sql sql='[field:sql/]'}
<div class="article-item">
<h2><a href="/plus/view.php?aid=[field:id/]" title="[field:title/]">[field:title/]</a></h2>
<p class="info">发布时间:[field:pubdate function="MyDate('Y-m-d H:i:s', @me)"]</p>
<p>分类目录:[field:typedir/]</p>
</div>
{/dede:sql}
<!-- 第三步:生成分页导航 -->
<div class="dede_pages">
<ul class="pagelist">
{dede:pagelist listitem="index,pre,next,end,pageno" listsize="5"/}
</ul>
</div>
</body>
</html>
代码详解
-
{dede:getsql}:sql: 这里写你的完整查询语句。注意,这个查询语句不能包含LIMIT分页语句,GetPageList函数会自动处理。totalnum: 将查询到的总记录数赋值给一个名为totalcount的变量,这个变量是生成{dede:pagelist}的基础。[field:sql/]: 这个变量会包含GetPageList函数处理好的、带上了LIMIT的 SQL 语句,用于dede:sql标签的实际查询。
-
{dede:sql}:sql: 这里引用[field:sql/]变量,它就是当前页应该执行的 SQL 查询。- 循环体内的
[field:字段名/]用于输出查询结果中的对应字段。
-
{dede:pagelist}:- 在使用了
{dede:getsql}之后,{dede:pagelist}就能自动获取到总记录数、每页数量等信息,从而正确生成分页链接。
- 在使用了
总结与对比
| 特性 | arclist 标签分页 |
dede:sql 标签分页 |
|---|---|---|
| 易用性 | 非常简单,开箱即用,只需设置 pagesize。 |
相对复杂,需要使用 {dede:getsql} 预处理,再嵌套 dede:sql。 |
| 灵活性 | 较低,主要用于调用 DedeCMS 已有的数据结构。 | 非常高,可以执行任意复杂的 SQL 查询,支持多表关联。 |
| 适用场景 | 常规的文章列表、产品列表等。 | 自定义的数据统计、跨表查询、特殊筛选条件等。 |
| 性能 | 优化的底层查询,性能较好。 | 性能取决于 SQL 语句的复杂度和数据库索引情况。 |
推荐做法:
- 优先使用
arclist:对于 90% 的列表页面需求,arclist足够且高效。 - 仅在必要时使用
dede:sql:当arclist无法满足你的业务逻辑时,再考虑使用dede:sql来实现更灵活的自定义分页。
希望这份详细的教程能帮助你完全掌握 DedeCMS 的扩展标签分页!
