帝国CMS列表分页完全教程

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

帝国cms列表分页教程
(图片来源网络,侵删)

本教程将分为以下几个部分:

  1. 分页原理简介
  2. 调用(listvar
  3. 分页代码调用(pagelist
  4. 分页样式美化
  5. 常见问题与解决方案

分页原理简介

在帝国CMS中,列表页通常由两个核心部分组成:

  • (listvar):用于循环调用并显示当前页的数据,比如文章标题、简介、发布时间等。
  • 分页导航 (pagelist):用于显示页码、上一页、下一页、首页、尾页等链接,让用户可以跳转到其他页面。

这两个部分通过系统变量(如$page)和函数(如sys_ShowListMorePage())协同工作,实现完整的分页功能。


调用 (listvar)

的主体,通常放在列表模板(如 e/class/t_functions.php 中的 list 函数)或自定义列表页面中。

帝国cms列表分页教程
(图片来源网络,侵删)

基本结构

调用通常使用 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()

解决方案:

  1. 打开你的列表模板文件(通常在 e/YourSkin/ 目录下,如 e/data/template/e/class/t_functions.php 中的 list 函数)。
  2. 确保在 while 循环结束后,有 echo sys_ShowMorePage(...); 这行代码。
  3. 检查后台“系统设置”->“系统参数”->“列表设置”中,是否开启了列表分页功能。

问题2:分页链接是 index.php?page=2,但我想让它变成 /news/page/2/ 这样的伪静态URL。

解决方案: 这需要配置伪静态规则。

  1. 开启伪静态:在后台“系统设置”->“伪静态设置”中,为列表页开启伪静态。
  2. 配置服务器伪静态规则
    • 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;
  3. 修改分页函数:默认的分页函数可能不适用于复杂的伪静态,你可能需要自定义一个分页函数,或者使用更灵活的标签。

问题3:如何实现“加载更多”的分页方式,而不是传统的页码?

解决方案: 这通常结合了 AjaxJavaScript

  1. 列表页结构用一个容器(如 <div id="news-list">)包裹,分页按钮是一个 <button id="load-more">加载更多</button>
  2. JavaScript 逻辑
    • 初始化一个变量 page = 1
    • 为“加载更多”按钮绑定点击事件。
    • 点击时,page++
    • 使用 $.ajax 向后端发送一个请求,参数为 page
  3. 后端处理
    • 创建一个专门处理Ajax请求的PHP文件(如 e/ajax/getnews.php)。
    • 在这个文件里,接收 page 参数,然后用 GetSql()limit (($page-1)*20, 20) 来获取当前页的数据。
    • 遍历数据,并只返回HTML片段(不包含 <html>, <head> 等标签)。
  4. 前端渲染
    • JavaScript 接收后端返回的HTML片段。
    • 使用 $('#news-list').append(html); 将新内容追加到列表容器中。
    • 如果返回的数据为空,则隐藏“加载更多”按钮。

这种方式能提供更流畅的用户体验,是现代网站非常流行的做法。


  • 核心:列表分页 = listvar (内容循环) + pagelist (分页导航)。
  • 关键函数GetSql() 获取数据,sys_ShowMorePage() 生成导航。
  • 美化:通过分析默认HTML结构,用CSS自定义样式。
  • 进阶:伪静态和Ajax“加载更多”是提升用户体验的高级技巧。

希望这份详细的教程能帮助你完全掌握帝国CMS的列表分页功能!如果在操作中遇到任何问题,可以随时提问。