StartMVC开发手册

可以快速上手的开发文档

手册目录

分页类

基本参数

Show($count, $pageSize, $page, $url, $pageShowCount = 10) 负责把「记录数 / 每页条数 / 当前页」渲染成页码链接。它只管渲染、不管取数——取数用 page() 或 Model::paginate()。

参数说明:

  • $count int 数据总条数
  • $pageSize int 每页数据条数
  • $page int 当前页数(从 1 开始)
  • $url string 页码链接模板,用 {page} 占位,如 /article/index/{page}
  • $pageShowCount int 可选,数字页码显示数量,默认 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 79
  • pageShowCount = 3, edgeCount = 1(更紧凑):第 7 页 1 … 6 7 8 … 79
  • pageShowCount = 9, edgeCount = 3(更宽松):第 7 页 1 2 3 4 5 6 7 8 9 10 11 … 77 78 79
  • pageShowCount = 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 个;页数不够时自动收敛,不会重复或越界。

效果图

page.png

上图是默认的连续页码形态。开启省略号后页码区会变成 1 2 … 5 6 7 8 9 … 78 79 这种样子,具体外观由你自己的 CSS 决定(框架只输出 <a> 和省略号的 <span>)。

相关:模型(paginate() 与查询构建器)、数据查询(page() / chunk(),以及深翻页为什么别用 OFFSET)。