soup / paginator
分页器是一个简单的类,允许您创建分页。它不需要任何数据库连接。它与Twitter的Bootstrap框架兼容,使用了附加的CSS类pagination。
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-14 11:59:53 UTC
README
一个简单易用的分页器
名称: Paginator
许可证: MIT
作者: Mardix
版本: 2.x.x
要求: PHP >= 5.4
关于Paginator
Paginator是一个简单的类,允许您为您的应用程序创建分页。它不需要任何数据库连接。它只要求找到的项目总数,然后根据此创建可以导出为HTML或数组的分页。它也与Twitter的Bootstrap框架兼容。
安装Paginator
您可以直接下载Paginator,或者使用Composer。
要使用Composer安装,请将以下内容添加到您的composer.json文件中的require键
"voodoophp/paginator": "2.*"
composer.json
{
"name": "voodoophp/myapp",
"description": "My awesome Voodoo App",
"require": {
"voodoophp/paginator": "2.*"
}
}
创建分页
Paginator使创建分页变得简单。它只需要包含页面模式编号的URL、总项目数和每页的项目数。
http://site.com/search?q=flower&page=15
或
http://site.com/genres/pop/page/15
Paginator将自动匹配页码与上面的URL,并根据提供的项目总数和每页的项目数创建其余页面的分页。
捕获页码
Paginator需要在页码模式中包含关键字(:num)以匹配URL中的页码。
页码模式设置为以下格式
对于友好URL,它将捕获http://site.com/page/25
/page/(:num)
对于普通URL,它将捕获http://site.com/?page=25
page=(:num)
页码模式设置为
Voodoo\Paginator::setUrl($url, $pagePattern);
在这两个例子中,它将捕获页码[25],并从那里创建分页的开始和结束。
页码模式的任何变体都是可以的,只要它包含(:num)
一个简单的例子
<?php
include "src/Voodoo/Paginator.php";
// Pretending the the request url is:
// http://mysite.com.com/hip-hop/page/5
// to catch the page number pattern in the request url
$pagePattern = "/page/(:num)";
// Some pre-calculated number
$totalItems = 150;
// Total items to show per page
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator($pagePattern))
->setItems($totalItems, $totalPerPage);
?>
<html>
<head>
<link rel="stylesheet" href="./assets/paginator.css">
<title>Paginator Example</title>
</head>
<body>
<?= $paginator; ?>
</body>
</html>
将渲染如下内容
[First] [<< Prev] [1] [2] [3] [4] [5] [6] [Next >>] [Last]
链接看起来像这样
<a href='http://mysite.com/hip-hop/page/6'>6</a>
方法
####Voodoo\Paginator::__construct() <?php
include "src/Voodoo/Paginator.php";
$paginator = new Voodoo\Paginator;
####Voodoo\Paginator::setUrl() 设置URL和页码模式
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern);
自动设置URL的替代方法
如果未调用setUrl(),Paginator将自动根据请求URI设置URL。所有分页都将基于当前URL。
在下面的示例中,__construct()接受页码模式和从getUri()创建分页URL;
<?php
include "src/Voodoo/Paginator.php";
$pagePattern = "/page/(:num)";
$paginator = (new Voodoo\Paginator($pagePattern));
####Voodoo\Paginator::setItems() 设置项目、每页项目数和分页导航大小
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage);
####Voodoo\Paginator::setPage()
默认情况下,Paginator将从URL中捕获页码,但如果您想手动设置当前页,setPage将允许您这样做
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4);
####Voodoo\Paginator::setPrevNextTitle()
当分页很长时,设置上一页和下一页的标题。默认设置为上一页和下一页
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4)
->setPrevNextTitle("Prev", "Next");
####Voodoo\Paginator::setFirstLastTitle()
当分页很长时,设置第一页和最后一页的标题。默认设置为第一页和最后一页
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
####Array Voodoo\Paginator::toArray()
将返回一个数组,该数组用于创建分页。
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
$pagination = $paginator->toArray();
toArray() 将返回一个类似于以下格式的数组
[
[
"page_number" => 1,
"label" => "First",
"url" => "http://mysite.com/pop/page/1",
"is_current" => false,
"is_first" => true,
],
[
"page_number" => 1,
"label" => "Prev",
"url" => "http://mysite.com/pop/page/1",
"is_current" => false,
"is_prev" => true,
],
[
"page_number" => 1,
"label" => 1,
"url" => "http://mysite.com/pop/page/1",
"is_current" => true
],
[
"page_number" => 2,
"label" => 2,
"url" => "http://mysite.com/pop/page/2",
"is_current" => false
],
...
[
"page_number" => "10",
"label" => "Next",
"url" => "http://mysite.com/pop/page/10",
"is_current" => false,
"is_next" => true,
],
[
"page_number" => 15,
"label" => "Last",
"url" => "http://mysite.com/pop/page/15",
"is_current" => false,
"is_last" => true,
]
]
使用 toArray() 手动创建分页
<ul>
<?php foreach($paginator->toArray() as $page) : ?>
<li class='<?= ($page["is_current"]) ? "active" : ""; ?>'>
<a href='<?= $page["url"]; ?>'><?= $page["label"]; ?></a>
</li>
<?php endforeach; ?>
</ul>
####String Voodoo\Paginator::toHtml()
将返回一个格式化的 HTML,兼容 Bootstrap 框架
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
$cssClassName = "pagination";
echo $paginator->toHtml($cssClassName);
####String Voodoo\Paginator::__toString()
与 toHtml() 相同,只是在有人输出分页对象时使用
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPage(4)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator;
获取器
####Voodoo\Paginator::getUri()
返回请求的 URI(地址栏中的 URL)。它可以用来根据请求 URI 自动设置 URL。
在下面的示例中,__construct()接受页码模式和从getUri()创建分页URL;
<?php
include "src/Voodoo/Paginator.php";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator);
$uri = $paginator->getUri();
####Voodoo\Paginator::getPage()
获取当前页码
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getPage(); // -> 4
####Voodoo\Paginator::count()
获取总页数
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->count(); // 15
####Voodoo\Paginator::getPerPage()
获取每页的总项数
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getPerPage(); // 10
####Voodoo\Paginator::getStart()
获取分页设置的计数起始值
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getStart(); // 30
####Voodoo\Paginator::getEnd()
获取分页设置的计数结束值
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getEnd(); // 39
####Voodoo\Paginator::getPageUrl()
根据提供的 URL 返回页面 URL
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getPageUrl(); // http://mysite.com/pop/page/4
它还可以用来获取其他页面的 URL
$page6 = $paginator->getPageUrl(6); // http://mysite.com/pop/page/6
####Voodoo\Paginator::getNextPageUrl()
返回下一页的 URL
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getNextPageUrl(); // http://mysite.com/pop/page/5
####Voodoo\Paginator::getPrevPageUrl()
返回上一页的 URL
<?php
include "src/Voodoo/Paginator.php";
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$totalItems = 150;
$totalPerPage = 10;
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage)
->setPrevNextTitle("Prev", "Next")
->setFirstLastTitle("First", "Last");
echo $paginator->getPrevPageUrl(); // http://mysite.com/pop/page/3
使用分页器与 SQL 查询结合使用
<?php
/**
* Using Paginator with SQL query
*
* We will execute two queries, one to count all entries,
* the second one to get all the data with LIMIT and OFFSET
*/
include(dirname(__DIR__)."/src/Voodoo/Paginator.php");
$pdo = new PDO ("mysql:host=$hostname;dbname=$dbname", "$username", "$pw");
$tableName = "myTable";
/**
* To count all the entries based on the criteria provided
*/
$sth = $pdo->query("SELECT COUNT(id) AS count FROM {$tableName}");
$countResult = $sth->fetch(PDO::FETCH_ASSOC);
$totalItems = $countResult["count"];
$totalPerPage = 10;
/**
* Paginator will allow us to get the LIMIT and OFFSET for the query
*/
$url = "http://mysite.com/pop/page/4";
$pagePattern = "/page/(:num)";
$paginator = (new Voodoo\Paginator)
->setUrl($url, $pagePattern)
->setItems($totalItems, $totalPerPage);
$limit = $paginator->getPerPage();
$offset = $paginator->getStart();
$results = $pdo->query("SELECT * FROM {$tableName} LIMIT {$limit} OFFSET {$offset}");
?>
<html>
<head>
<link rel="stylesheet" href="./assets/paginator.css">
<title>Paginator SQL Example</title>
</head>
<body>
<?= $paginator; ?>
</body>
</html>
请参考示例目录中的示例
(c) 本年 Mardix :)