帝国CMS列表分页完全教程
列表分页是网站内容展示的核心功能之一,它不仅能将大量内容分批加载,提升页面加载速度和用户体验,还能对搜索引擎(SEO)更加友好。

(图片来源网络,侵删)
本教程将分为以下几个部分:
- 分页原理简介
- 调用(
listvar) - 分页代码调用(
pagelist) - 分页样式美化
- 常见问题与解决方案
分页原理简介
在帝国CMS中,列表页通常由两个核心部分组成:
- (
listvar):用于循环调用并显示当前页的数据,比如文章标题、简介、发布时间等。 - 分页导航 (
pagelist):用于显示页码、上一页、下一页、首页、尾页等链接,让用户可以跳转到其他页面。
这两个部分通过系统变量(如$page)和函数(如sys_ShowListMorePage())协同工作,实现完整的分页功能。
调用 (listvar)
的主体,通常放在列表模板(如 e/class/t_functions.php 中的 list 函数)或自定义列表页面中。

(图片来源网络,侵删)
基本结构
调用通常使用 GetSql() 函数获取数据,然后用 while 循环遍历输出。
<?php
// 1. 获取SQL条件(根据栏目、模型、排序等)
$tbname = "news"; // 数据表名,例如新闻表
$classid = 0; // 栏目ID,0表示全站
$limit = 20; // 每页显示条数
$sql = GetSql($tbname, $classid, '', '', '', '', '', 'newstime DESC'); // 按发布时间倒序
// 2. 执行查询并分页
$query = $empire->query($sql);
while($r=$empire->fetch($query)) {
// 3. 循环输出每条信息
?>
<div class="list-item">
<h2><a href="<?=$r['titleurl']?>" target="_blank"><?=$r['title']?></a></h2>
<p class="intro"><?=esub($r['smalltext'], 200)?></p>
<span class="date"><?=date('Y-m-d', $r['newstime'])?></span>
</div>
<?php
}
?>
代码解释:
GetSql(): 根据参数生成查询SQL语句的核心函数。$empire->query(): 执行SQL查询。$empire->fetch(): 从结果集中获取一行数据。$r: 一个数组,包含了当前记录的所有字段(如title,smalltext,titleurl等)。esub($r['smalltext'], 200): 截取字符串函数,用于显示文章简介,最多200个字符。
分页代码调用 (pagelist)
输出完毕后,需要插入分页导航代码。
最简单的分页调用
在 while 循环结束后,直接使用以下代码:
<?php
// ... listvar 循环代码 ...
// 分页导航代码
echo sys_ShowListMorePage('共[total]条记录', '', '条', '', 'index.php', '', 'bgnum', '', '1', '0', '', '0');
?>
sys_ShowListMorePage() 函数参数详解:
| 参数 | 作用 | 示例 |
|---|---|---|
| 共[total]条记录 | 分页导航的头部文字,[total]是系统变量,会被替换为总记录数。 |
共[total]条记录 |
| (空) | 分页样式名称,通常留空使用默认样式。 | |
| 条 | 分页导航的单位。 | 条 |
| (空) | 首页链接的文字,留空则不显示。 | |
| index.php | 首页链接地址。 | 'index.php' |
| (空) | 末页链接的文字,留空则不显示。 | |
| bgnum | 关键参数,用于传递分页信息给后台。通常直接使用这个值。 | 'bgnum' |
| (空) | 页码样式名称,通常留空。 | |
| 1 | 是否显示跳转页码(1是,0否)。 | 1 |
| 0 | 是否显示下拉跳转(1是,0否)。 | 0 |
| (空) | 自定义附加参数。 | |
| 0 | 是否使用JS分页(1是,0否),通常设为0。 | 0 |
常用的分页调用方式
在实际开发中,我们通常使用更简洁的写法,并指定列表页的地址。
假设你的列表页是 e/news/list/index.php,你可以这样调用:
<?php
// ... listvar 循环代码 ...
// 指定列表页地址的分页调用
echo sys_ShowListMorePage('共[total]条', '', '条', '首页', 'e/news/list/index.php', '尾页', 'bgnum', '', '1', '0', '', '0');
?>
分页样式美化
默认的分页样式比较朴素,通常需要通过CSS来美化,以匹配网站的整体设计。
分析默认分页HTML结构
默认分页生成的HTML代码大致如下:
<div class="listpage">
<span class="listpagea">首页</span>
<span class="listpagea">上一页</span>
<span class="listpageon">1</span>
<a href="index.php?page=2" class="listpagea">2</a>
<a href="index.php?page=3" class="listpagea">3</a>
<span>...</span>
<a href="index.php?page=10" class="listpagea">10</a>
<a href="index.php?page=2" class="listpagea">下一页</a>
<a href="index.php?page=10" class="listpagea">尾页</a>
<span>共10条</span>
</div>
编写CSS进行美化
根据上面的HTML结构,我们可以编写CSS来改变分页的样式。
/* 假设分页容器名为 .pagination */
.pagination {
display: flex;
justify-content: center;
align-items: center;
list-style: none;
padding: 20px 0;
gap: 5px; /* 页码之间的间距 */
}
/* 默认链接样式 */
.pagination a {
display: block;
padding: 8px 12px;
text-decoration: none;
color: #333;
border: 1px solid #ddd;
border-radius: 4px;
transition: all 0.3s ease;
}
/* 鼠标悬停效果 */
.pagination a:hover {
background-color: #f0f0f0;
color: #007bff;
}
/* 当前页样式(根据 class="listpageon") */
.pagination .listpageon {
display: block;
padding: 8px 12px;
background-color: #007bff;
color: white;
border: 1px solid #007bff;
border-radius: 4px;
cursor: default; /* 当前页不可点击 */
}
/* 禁用状态(如首页/上一页在第一页时) */
.pagination .listpagea.disabled {
color: #ccc;
border-color: #eee;
cursor: not-allowed;
}
/* 省略号样式 */
.pagination span {
color: #999;
}
/* "共X条" 文字样式 */
.pagination .total {
color: #666;
margin-left: 10px;
}
如何应用CSS?
将上述CSS代码放入你的网站主样式文件(如 style.css)中即可。
常见问题与解决方案
问题1:列表页不显示分页,所有内容都挤在一页。
原因分析:
最常见的原因是列表模板文件(如 list.php)中没有正确调用分页代码 sys_ShowListMorePage()。
解决方案:
- 打开你的列表模板文件(通常在
e/YourSkin/目录下,如e/data/template/或e/class/t_functions.php中的list函数)。 - 确保在
while循环结束后,有echo sys_ShowMorePage(...);这行代码。 - 检查后台“系统设置”->“系统参数”->“列表设置”中,是否开启了列表分页功能。
问题2:分页链接是 index.php?page=2,但我想让它变成 /news/page/2/ 这样的伪静态URL。
解决方案: 这需要配置伪静态规则。
- 开启伪静态:在后台“系统设置”->“伪静态设置”中,为列表页开启伪静态。
- 配置服务器伪静态规则:
- Apache (
.htaccess):RewriteRule ^([a-z]+)/([0-9]+)/$ index.php?classid=$1&page=$2
或者更通用的列表页规则:
RewriteRule ^e/news/list/([0-9]+)/$ index.php?classid=你的新闻栏目ID&page=$1
- Nginx (
nginx.conf):rewrite ^/e/news/list/([0-9]+)/$ /index.php?classid=你的新闻栏目ID&page=$1 last;
- Apache (
- 修改分页函数:默认的分页函数可能不适用于复杂的伪静态,你可能需要自定义一个分页函数,或者使用更灵活的标签。
问题3:如何实现“加载更多”的分页方式,而不是传统的页码?
解决方案: 这通常结合了 Ajax 和 JavaScript。
- 列表页结构用一个容器(如
<div id="news-list">)包裹,分页按钮是一个<button id="load-more">加载更多</button>。 - JavaScript 逻辑:
- 初始化一个变量
page = 1。 - 为“加载更多”按钮绑定点击事件。
- 点击时,
page++。 - 使用
$.ajax向后端发送一个请求,参数为page。
- 初始化一个变量
- 后端处理:
- 创建一个专门处理Ajax请求的PHP文件(如
e/ajax/getnews.php)。 - 在这个文件里,接收
page参数,然后用GetSql()和limit(($page-1)*20, 20) 来获取当前页的数据。 - 遍历数据,并只返回HTML片段(不包含
<html>,<head>等标签)。
- 创建一个专门处理Ajax请求的PHP文件(如
- 前端渲染:
- JavaScript 接收后端返回的HTML片段。
- 使用
$('#news-list').append(html);将新内容追加到列表容器中。 - 如果返回的数据为空,则隐藏“加载更多”按钮。
这种方式能提供更流畅的用户体验,是现代网站非常流行的做法。
- 核心:列表分页 =
listvar(内容循环) +pagelist(分页导航)。 - 关键函数:
GetSql()获取数据,sys_ShowMorePage()生成导航。 - 美化:通过分析默认HTML结构,用CSS自定义样式。
- 进阶:伪静态和Ajax“加载更多”是提升用户体验的高级技巧。
希望这份详细的教程能帮助你完全掌握帝国CMS的列表分页功能!如果在操作中遇到任何问题,可以随时提问。
