soup/paginator

分页器是一个简单的类,允许您创建分页。它不需要任何数据库连接。它与Twitter的Bootstrap框架兼容,使用了附加的CSS类pagination。

2.1.1 2015-07-22 06:14 UTC

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 :)