DedeCMS 的分页机制是固定的,通过一个特定的函数 GetPageList() 来实现,我们的任务就是确保在会员列表页面,这个函数能被正确调用并传入正确的参数。

核心思路
- 模板文件:在
memberlist.htm模板中,使用{dede:memberlist}标签来循环输出会员列表,并在列表下方放置分页代码{dede:pagelist}。 - PHP 控制文件:修改
member_list.php文件,让它接收并处理分页参数(如page),然后调用GetPageList()函数,并将分页数据传递给模板。
详细步骤
第一步:修改会员列表模板文件 (memberlist.htm)
这个文件通常位于你的模板目录下,路径类似 /templets/default/member/memberlist.htm。
-
定位分页代码: 打开
memberlist.htm文件,找到你想要放置分页链接的位置,通常在会员列表循环{dede:memberlist}的后面。 -
添加或修改分页标签: 使用 DedeCMS 的内置分页标签
{dede:pagelist},这个标签会自动渲染出分页链接(首页、上一页、1, 2, 3...、下一页、末页)。完整的
memberlist.htm示例结构:
(图片来源网络,侵删)<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>会员列表 - {dede:global.cfg_webname/}</title> <link rel="stylesheet" href="/templets/default/css/style.css"> </head> <body> <div class="main"> <h2>会员列表</h2> <!-- 会员列表循环开始 --> <ul class="userlist"> {dede:memberlist} <li> <a href="[field:spaceurl/]" target="_blank"> <img src="[field:face/]" alt="[field:uname/]"> <span>[field:uname/]</span> </a> </li> {/dede:memberlist} </ul> <!-- 会员列表循环结束 --> <!-- 关键部分:分页代码 --> <div class="dede_pages"> <ul> <li><span class="pageinfo">共 <strong>{dede:pagelist listsize='0'/}</strong> 页</span></li> {dede:pagelist listsize='5' listitem='index,pre,next,end,pageno'} </ul> </div> <!-- 分页代码结束 --> </div> </body> </html>分页标签参数说明:
{dede:pagelist}:核心分页标签。listsize='5':显示当前页码前后各 5 个页码,当前是第 8 页,就会显示3,4,5,6,7,[8],9,10,11,12,13。listitem='index,pre,next,end,pageno':定义要显示的分页项。index:首页pre:上一页next:下一页end:末页pageno:页码
{dede:pagelist listsize='0'/}:这个用法会直接输出总页数,常用于显示“共 X 页”的信息。
第二步:修改 PHP 控制文件 (member_list.php)
这个文件是处理会员列表逻辑的核心,它负责从数据库中读取数据并传递给模板,路径通常是 /member/member_list.php。
-
打开
member_list.php文件。 -
找到并修改关键代码: 在文件中,找到类似
$dlist = new MemberList();的代码,这行实例化了一个用于处理会员列表的类。
(图片来源网络,侵删) -
添加分页逻辑: 在实例化类之后,需要设置分页参数,DedeCMS 的分页通常通过
SetParameterQuery和SetSource来实现。修改后的
member_list.php关键代码示例:<?php require_once(dirname(__FILE__)."/config.php"); require_once(DEDEINC."/datalistcp.class.php"); // 获取当前页码,如果没有则默认为 1 $page = isset($page) && is_numeric($page) ? $page : 1; // 实例化数据列表类 $dlist = new DataListCP(); // --- 关键修改部分 --- // 1. 设置每页显示多少条记录 $dlist->pageSize = 20; // 每页显示 20 个会员 // 2. 设置 SQL 查询语句 // 这里可以根据你的需求修改,比如按注册时间倒序 $query = "SELECT * FROM `dede_member` ORDER BY `joinip` DESC"; // `dede_member` 是会员主表,请根据你的表前缀修改 // 3. 设置分页参数,将 page 参数传递给分页链接 // 这样点击分页链接时,page 参数才会被正确传递 $dlist->SetParameterQuery('page', $page); // 4. 调用获取分页数据的函数 // 这个函数会执行查询,并获取总记录数,用于计算总页数 $dlist->SetSource($query); $dlist->dsql->SetQuery($query); $dlist->dsql->Execute('al'); $totalRow = $dlist->dsql->GetTotalRow('al'); // 获取总记录数 $dlist->totalPage = ceil($totalRow / $dlist->pageSize); // 计算总页数 $dlist->SetPage($page); // 绑定模板变量 // 将分页数据传递给模板中的 {dede:pagelist} 标签 $dlist->tpl->SetVar('pageList', $dlist->GetPageList()); // --- 关键修改部分结束 --- // 调用模板 include(DEDEMEMBER."/templets/memberlist.htm"); ?>代码逻辑解释:
$page = isset($page) ? $page : 1;:获取 URL 传递过来的page参数,如果不存在则默认为第 1 页。new DataListCP();:DedeCMS 专门用于处理带分页列表的类。$dlist->pageSize = 20;:设置每页显示的会员数量,你可以根据需要调整。$query = "SELECT * FROMdede_member:定义从数据库查询会员的 SQL 语句。dede_member是默认的会员主表名,如果你的表前缀不是dede_,请务必修改。$dlist->SetParameterQuery('page', $page);:这是非常重要的一步! 它告诉分页系统,分页链接的 URL 中需要包含page这个参数,并且它的值是当前页码,没有它,点击分页链接后page参数会丢失,导致无法跳转。$dlist->SetSource($query);和后续代码:这部分是DataListCP类内部用来计算总记录数和总页数的。$dlist->tpl->SetVar('pageList', $dlist->GetPageList());:这是将生成分页 HTML 代码的核心步骤。$dlist->GetPageList()会生成类似.../member/member_list.php?page=2这样的链接,然后通过SetVar将其赋值给模板中的{dede:pagelist}
第三步:清空缓存并测试
-
清空系统缓存: 登录你的 DedeCMS 后台,进入【系统】->【系统基本参数】->【性能选项】,点击“清空所有缓存”。
-
访问会员列表页面: 访问你的会员列表页面,
http://你的域名/member/或http://你的域名/member/index.php?uid=-1(具体路径看你网站设置)。你现在应该能看到:
- 会员列表按照你设定的数量(如 20 个)显示。
- 在列表下方,会出现分页导航栏。
- 点击“下一页”、“2”、“3”等链接,页面会正确跳转到对应页,URL 中的
page参数会相应改变。
常见问题与解决方法
-
问题1:分页链接不生效,点击后还是第一页。
- 原因:最常见的原因是
member_list.php中缺少$dlist->SetParameterQuery('page', $page);这行代码,导致分页参数无法传递。 - 解决:检查并添加这行代码。
- 原因:最常见的原因是
-
问题2:
{dede:pagelist}标签没有输出任何内容。- 原因:PHP 文件中没有正确调用
$dlist->GetPageList()并将其传递给模板。 - 解决:确保
member_list.php中有$dlist->tpl->SetVar('pageList', $dlist->GetPageList());这行代码。
- 原因:PHP 文件中没有正确调用
-
问题3:样式错乱。
- 原因:分页链接的 HTML 结构没有被你的 CSS 样式正确渲染。
- 解决:检查
memberlist.htm中{dede:pagelist}外层的div和ul的 class 名称,并在你的 CSS 文件中添加对应的样式。.dede_pages ul { list-style: none; display: flex; gap: 5px; } .dede_pages a, .dede_pages span { padding: 5px 10px; border: 1px solid #ccc; text-decoration: none; } .dede_pages .thisclass { background-color: #007bff; color: white; border-color: #007bff; }
通过以上步骤,你就可以成功地为 DedeCMS 的会员列表添加功能完善的分页了。
