vueodophp/paginator

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

2.1.1 2015-07-22 06:14 UTC

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