vueodophp / paginator
Paginator 是一个简单的类,允许您创建分页。它不需要任何数据库连接。它与 Twitter 的 Bootstrap 框架兼容,使用了附加的 pagination CSS 类。
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-14 12:07:21 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
Paginator 会自动设置 URL(如果未调用 setUrl()),所有分页都将基于当前 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()
将返回与 Bootstrap 框架兼容的格式化 HTML
<?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 :)