tuum / pagination
PSR-7的通用分页包。
2.0.0
2022-02-24 03:28 UTC
Requires
- ext-mbstring: *
- psr/http-message: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9
- psr/http-message: ~1.0
- zendframework/zend-diactoros: ^1.0
README
经典偏移/限制风格的通用分页包。
一些可能有趣的功能:
- 存储当前页面和表单输入到会话中,
- 可以使用PSR-7 ServerRequestInterface对象,
- 有一个灵活的分页HTML生成器。
简而言之,使用_page访问页面
http://example.come/pagination?_page
将恢复最后的分页结果。
PSR
PSR-1, PSR-2, PSR-4, 和 PSR-7。
许可
MIT许可
安装
请使用composer安装WScore/Pagination包。
$ composer require "tuum/pagination: ^1.0"
通过示例代码入门
页面键变量,_page是关键。
示例HTML表单
让我们从一个分页的HTML表单开始,例如;
<form action=""> <input type="text" name="type" /> <input type="integer" name="num" /> <input type="submit" /> </form>
请注意,不应该有_page变量。
分页查询
使用结合所有功能的Pagination类的最简单方法。
要实例化一个Pageinate对象,
use Tuum\Pagination\Inputs; use Tuum\Pagination\Pagination; $pager = new Pager(); $pager->withRequest($request); // PSR-7 server request. $inputs = $pager->getInputs(); $found = $pdo->prepare("SELECT * FROM tbl WHERE type=? and num>? OFFSET ? LIMIT ?") ->execute([ $inputs->get('type'), $inputs->get('num'), $inputs->getOffset(), $inputs->getLimit(), ]) ->fetchAll();
Inputs::get*方法应提供构建查询所需的信息。通过Inputs::setList方法设置找到的结果。
type和num的值
- 从表单输入中获取,然后在没有输入查询中存在
_page变量的情况下保存到会话中,或者 - 从会话数据中获取(如果存在
_page)。
带有页面编号的_page
仅使用_page请求将恢复会话中的查询值(类型和数量),并设置偏移值从页面编号。例如,
GET /find?_page=2
将设置偏移量(_page-1)*_limit,页面编号为2。
仅带有_page的查询
仅使用_page但没有页面编号的请求将恢复会话中的页面编号和其他参数。例如,
GET /find?_page
将设置偏移量为上次请求的页面编号。
生成分页HTML
分页类实现了__toString方法以输出分页HTML字符串。默认情况下,分页对象输出以下样式的分页HTML,用于Bootstrap ver3。
echo $inputs;
可以通过修改分页逻辑和HTML/CSS格式化器来更改分页和HTML/CSS样式,如下所示;
$pages = $inputs->getPagination(); $pages->numLinks = 7; $pagination = new ToBootstrap3($paginate) echo $pagination;
技术细节
设置总数
分页器不知道如何获取总数;请使用Inputs::setTotal方法在调用方法的闭包内提供总数。
$inputs->setTotal( $pdo->prepare("SELECT COUNT(*) FROM tbl WHERE type=? and num>? ") ->execute([ $inputs->get('type'), $inputs->get('num') ]) ->fetchColumn() );
安全
默认情况下,输入值经过验证,不包含空值以及有效的UTF-8字符串。
要更改验证,可以在Pager构造函数中传递它;
$pager->pager->useValidator(function(&$v) { $v = 'validate=' . $v; });
注意:这是默认的闭包。
function (&$v) { if (!is_string($v) && !is_numeric($v)) { $v = ''; } elseif (strpos($v, "\0") !== false) { $v = ''; } elseif (!mb_check_encoding($v, 'UTF-8')) { $v = ''; } };
