基本参数
Show($count, $pageSize, $page, $url, $pageShowCount = 10) 负责把「记录数 / 每页条数 / 当前页」渲染成页码链接。它只管渲染、不管取数——取数用 page() 或 Model::paginate()。
参数说明:
$countint 数据总条数$pageSizeint 每页数据条数$pageint 当前页数(从 1 开始)$urlstring 页码链接模板,用{page}占位,如/article/index/{page}$pageShowCountint 可选,数字页码显示数量,默认 10。开启省略号后含义变成「当前页附近显示几个页码」(省略号不占这个名额)
设置分页样式
三种方式,优先级从低到高:配置文件 → 构造参数 → 直接赋值属性。
方式一:配置文件 config/pagination.php
//分页配置
return [
'theme' => '%header% %first% %prev% %link% %next% %last%',//分页样式
//分页头部:%count% = 记录总数,%page% = 当前页,%pageCount% = 总页数
'header' => '共 %count% 条记录 第 %page% / %pageCount% 页',
'first' => '首页',//首页
'last' => '末页',//末页
'prev' => '上一页',//上一页
'next' => '下一页',//下一页
'currentClass' => 'is-current',//当前页码类
'ellipsis' => '',//省略号HTML,留空=关闭(页码连续排列,与旧版本一致)
'edgeCount' => 2,//省略号开启时,首尾各锚定几页(填 0 则不要首尾锚点)
];方式二:构造参数,只覆盖要改的键,其余仍取配置文件的值
$pagination = new \startmvc\core\Pagination([
'currentClass' => 'active',
'prev' => '前页',
]);方式三:直接给属性赋值
$pagination = new \startmvc\core\Pagination;
$pagination->theme = '%header% %first% %prev% %link% %next% %last%'; //可选,设置页码格式,%……%对应的是下面的各属性,%link%为数字页码
$pagination->header = '共 %count% 条记录 第 %page% / %pageCount% 页'; //可选,%count%为数据总数,%page%为当前页,%pageCount%为总页数
$pagination->first = '首页'; //可选,首页链接字符
$pagination->last = '末页'; //可选,末页链接字符
$pagination->prev = '上一页'; //可选,上一页链接字符
$pagination->next = '下一页'; //可选,下一页链接字符
$pagination->currentClass = 'current'; //可选,当前页的数字页码链接CSS类
$pagination->ellipsis = ''; //可选,省略号HTML,留空=关闭(页码连续排列)
$pagination->edgeCount = 2; //可选,省略号开启时首尾各锚定几页配置文件整个删掉也能跑:每一项都有内置默认值兜底,不会报错。
页码太多时用省略号
默认页码是连续排列的,页数一多就会挤成一大排,而且看不到首尾。把 ellipsis 填上省略号的 HTML,页码区就切换成「首尾锚点 + 当前页邻域」的形态。具体长什么样由参数决定,不是固定的:
// config/pagination.php
'ellipsis' => '<span class="dots">…</span>', // 留空 = 关闭(默认);填任意 HTML 即开启
'edgeCount' => 2, // 首尾各锚定几页,填 0 则不要首尾锚点开启后 $pageShowCount 的含义变成「当前页附近显示几个页码」,省略号不占这个名额。以 79 页、每页 10 条为例,几种搭配的实际输出:
pageShowCount = 5, edgeCount = 2(较常用):第 3 页1 2 3 4 5 … 78 79,第 7 页1 2 … 5 6 7 8 9 … 78 79,第 76 页1 2 … 74 75 76 77 78 79pageShowCount = 3, edgeCount = 1(更紧凑):第 7 页1 … 6 7 8 … 79pageShowCount = 9, edgeCount = 3(更宽松):第 7 页1 2 3 4 5 6 7 8 9 10 11 … 77 78 79pageShowCount = 5, edgeCount = 0(不要首尾锚点):第 7 页5 6 7 8 9,等同于关闭省略号
几个细节:
ellipsis是开关,edgeCount是它的参数——ellipsis留空时edgeCount不起作用。- 页数少、首尾锚点和邻域挨得上时不会出现省略号:比如 11 页时直接全列
1 2 3 4 5 6 7 8 9 10 11。 - 省略号里填什么由你决定,
…、...或带样式的<span>都可以。 - 默认留空,所以升级框架不会改变已有项目的分页外观。
分页实例
namespace app\home\controller;
use app\common\BaseController;
use startmvc\core\Pagination;
class ArticleController extends BaseController
{
public function indexAction(int $page = 1)
{
$page = $page ?: 1;
$perPage = 10;
// 取当页数据:page($perPage, $page) 生成 LIMIT 10 OFFSET 10
$articleModel = $this->model('Article');
$data['article_list'] = $articleModel->where('status', 1)->page($perPage, $page)->get();
// 取总数,用于渲染页码
$total = $articleModel->where('status', 1)->count();
$pagination = new Pagination;
$data['pageShow'] = $pagination->Show($total, $perPage, $page, '/article/index/{page}', 5);
$this->assign($data);
$this->display();
}
}用 Model::paginate() 更省事:一次返回数据 + 分页信息,总数已经算好,不用自己 count()。
$result = $this->model('Article')->paginate($perPage, $page, ['status' => 1]);
$data['article_list'] = $result['data'];
// $result['pagination'] = [
// 'total' => 100, // 总记录数
// 'per_page' => 10, // 每页条数
// 'current_page' => 3, // 当前页(越界会被夹到 [1, total_pages])
// 'total_pages' => 10, // 总页数
// 'has_more' => true, // 是否还有下一页
// ];
$pagination = new Pagination;
$data['pageShow'] = $pagination->Show(
$result['pagination']['total'], $perPage, $page, '/article/index/{page}', 5
);注意 paginate() 是 Model 的方法,查询条件作为第 3 个参数传数组,不能写成 $model->where('status', 1)->paginate(...)——where() 返回的是查询构建器,它上面没有 paginate()。
视图代码
<ul>
{foreach $article_list as $v}
<li><a href="/article/detail/{$v.id}">{$v.title}</a></li>
{/foreach}
</ul>
<div class="pages">
{$pageShow}
</div>边界行为
$page超出范围会被夹到[1, 总页数]:总数 25、每页 10 时传 99 会渲染成第 3 页(末页),传 0 或负数会渲染成第 1 页。- 总记录数为 0 时不渲染任何数字页码,「首页 / 末页」都指向第 1 页,不会生成
?page=0这类死链。 - 页码窗口用
$pageShowCount控制,传奇数(如 5)不会产生小数页码。 $pageSize传 0 会被当成 1 处理,不会除零报错。- 开启省略号后,页码区最多显示
edgeCount × 2 + $pageShowCount + 2个元素(含两个省略号),如2 × 2 + 5 + 2 = 11个;页数不够时自动收敛,不会重复或越界。
效果图

上图是默认的连续页码形态。开启省略号后页码区会变成 1 2 … 5 6 7 8 9 … 78 79 这种样子,具体外观由你自己的 CSS 决定(框架只输出 <a> 和省略号的 <span>)。
相关:模型(paginate() 与查询构建器)、数据查询(page() / chunk(),以及深翻页为什么别用 OFFSET)。