nitra / pagerfanta
PHP 5.3 的分页
Requires
- php: >=5.3.0
Requires (Dev)
- doctrine/mongodb-odm: *
- doctrine/orm: 2.*
- mandango/mandango: *
- propel/propel1: ~1.6
- solarium/solarium: dev-develop
Suggests
- doctrine/mongodb-odm: To use the DoctrineODMMongoDBAdapter.
- doctrine/orm: To use the DoctrineORMAdapter.
- mandango/mandango: To use the MandangoAdapter.
- propel/propel1: To use the PropelAdapter
- solarium/solarium: To use the SolariumAdapter.
This package is not auto-updated.
Last update: 2018-05-06 19:21:01 UTC
README
PHP 5.3 的分页
用法
<?php
use Pagerfanta\Adapter\ArrayAdapter;
use Pagerfanta\Pagerfanta;
$adapter = new ArrayAdapter($array);
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($maxPerPage); // 10 by default
$maxPerPage = $pagerfanta->getMaxPerPage();
$pagerfanta->setCurrentPage($currentPage); // 1 by default
$currentPage = $pagerfanta->getCurrentPage();
$nbResults = $pagerfanta->getNbResults();
$currentPageResults = $pagerfanta->getCurrentPageResults();
$pagerfanta->getNbPages();
$pagerfanta->haveToPaginate(); // whether the number of results if higher than the max per page
$pagerfanta->hasPreviousPage();
$pagerfanta->getPreviousPage();
$pagerfanta->hasNextPage();
$pagerfanta->getNextPage();
->setMaxPerPage()
和 ->setCurrentPage()
方法实现了流畅的接口
<?php
$pagerfanta
->setMaxPerPage($maxPerPage)
->setCurrentPage($currentPage);
如果每页最大值无效,->setMaxPerPage()
方法将抛出异常
Pagerfanta\Exception\NotIntegerMaxPerPageException
Pagerfanta\Exception\LessThan1MaxPerPageException
两者都扩展自 Pagerfanta\Exception\NotValidMaxPerPageException
.
如果页面无效,->setCurrentPage()
方法将抛出异常
Pagerfanta\Exception\NotIntegerCurrentPageException
Pagerfanta\Exception\LessThan1CurrentPageException
Pagerfanta\Exception\OutOfRangeCurrentPageException
所有这些都扩展自 Pagerfanta\Exception\NotValidCurrentPageException
.
->setCurrentPage()
根据每页最大值抛出越界异常,因此如果您要修改每页最大值,应在设置当前页面之前进行。
适配器
适配器的概念非常简单。适配器只是返回结果数量和一个用于偏移和长度的切片。这样,您可以通过创建适配器将 pagerfanta 适配到任何类型的分页。
适配器必须实现 Pagerfanta\Adapter\AdapterInterface
接口,该接口具有以下两个方法
<?php
/**
* Returns the number of results.
*
* @return integer The number of results.
*/
function getNbResults();
/**
* Returns an slice of the results.
*
* @param integer $offset The offset.
* @param integer $length The length.
*
* @return array|\Iterator|\IteratorAggregate The slice.
*/
function getSlice($offset, $length);
Pagerfanta 提供以下适配器
ArrayAdapter
用于分页数组。
<?php
use Pagerfanta\Adapter\ArrayAdapter;
$adapter = new ArrayAdapter($array);
MongoAdapter
用于分页 Mongo 游标。
<?php
use Pagerfanta\Adapter\MongoAdapter;
$cursor = $collection->find();
$adapter = new MongoAdapter($cursor);
MandangoAdapter
用于分页 Mandango 查询。
<?php
use Pagerfanta\Adapter\MandangoAdapter;
$query = $mandango->getRepository('Model\Article')->createQuery();
$adapter = new MandangoAdapter($query);
DoctrineDbalAdapter
用于分页 DoctrineDbal 查询构建器。
<?php
use Pagerfanta\Adapter\DoctrineDbalAdapter;
use Doctrine\DBAL\Query\QueryBuilder;
$queryBuilder = new QueryBuilder($conn);
$queryBuilder->select('p.*')->from('posts', 'p');
$countQueryBuilderModifier = function ($queryBuilder) {
$queryBuilder->select('COUNT(DISTINCT p.id) AS total_results')
->setMaxResults(1);
};
$adapter = new DoctrineDbalAdapter($queryBuilder, $countQueryBuilderModifier);
DoctrineDbalSingleTableAdapter
简化单表 DoctrineDbal 查询构建器的分页。
此适配器仅分页单表查询构建器,不包含连接。
<?php
use Pagerfanta\Adapter\DoctrineDbalSingleTableAdapter;
use Doctrine\DBAL\Query\QueryBuilder;
$queryBuilder = new QueryBuilder($conn);
$queryBuilder->select('p.*')->from('posts', 'p');
$countField = 'p.id';
$adapter = new DoctrineDbalSingleTableAdapter($queryBuilder, $countField);
DoctrineORMAdapter
用于分页 DoctrineORM 查询对象。
<?php
use Pagerfanta\Adapter\DoctrineORMAdapter;
$queryBuilder = $entityManager->createQueryBuilder()
->select('u')
->from('Model\Article', 'u');
$adapter = new DoctrineORMAdapter($queryBuilder);
DoctrineODMMongoDBAdapter
用于分页 DoctrineODMMongoDB 查询构建器。
<?php
use Pagerfanta\Adapter\DoctrineODMMongoDBAdapter;
$queryBuilder = $documentManager->createQueryBuilder('Model\Article');
$adapter = new DoctrineODMMongoDBAdapter($queryBuilder);
DoctrineODMPhpcrAdapter
用于分页 Doctrine PHPCR-ODM 查询构建器。
<?php
use Pagerfanta\Adapter\DoctrineODMPhpcrAdapter;
$queryBuilder = $documentManager->createQueryBuilder();
$queryBuilder->from('Model\Article');
$adapter = new DoctrineODMPhpcrAdapter($queryBuilder);
DoctrineCollectionAdapter
要分页一个 Doctrine\Common\Collection\Collections
接口,可以使用 DoctrineCollectionAdapter
。它代理到 Collections 接口上的 count() 和 slice() 方法进行分页。如果您正在使用 Doctrine ORMs Extra Lazy 关联功能,则此操作很有意义
<?php
use Pagerfanta\Adapter\DoctrineCollectionAdapter;
$user = $em->find("Pagerfanta\Tests\Adapter\DoctrineORM\User", 1);
$adapter = new DoctrineCollectionAdapter($user->getGroups());
DoctrineSelectableAdapter
要分页一个 Doctrine\Common\Collection\Selectable
接口,可以使用 DoctrineSelectableAdapter
。它使用 Selectable 接口上的匹配()方法进行分页。当使用 Doctrine Criteria 对象过滤 PersistentCollection 时特别有用
<?php
use Pagerfanta\Adapter\DoctrineSelectableAdapter;
use Doctrine\Common\Collections\Criteria;
$user = $em->find("Pagerfanta\Tests\Adapter\DoctrineORM\User", 1);
$comments = $user->getComments();
$criteria = Criteria::create()->andWhere(Criteria::expr()->in('id', array(1,2,3));
$adapter = new DoctrineSelectableAdapter($comments, $criteria);
注意,您不应该使用此适配器与未设置为使用 EXTRA_LAZY 提取模式的 PersistentCollection。
当使用 count()
方法时请小心,目前 Doctrine2 需要获取所有记录来计算元素数量。
PropelAdapter
用于分页 propel 查询
<?php
use Pagerfanta\Adapter\PropelAdapter;
$adapter = new PropelAdapter($query);
SolariumAdapter
用于分页 solarium 查询
<?php
use Pagerfanta\Adapter\SolariumAdapter;
$query = $solarium->createSelect();
$query->setQuery('search term');
$adapter = new SolariumAdapter($solarium, $query);
FixedAdapter
最好在您需要执行自定义分页解决方案且不想为一次性使用情况实现完整适配器时使用。
无论您查询哪一页,它总是返回相同的数据
<?php
use Pagerfanta\Adapter\FixedAdapter;
$nbResults = 5;
$results = array(/* ... */);
$adapter = new FixedAdapter($nbResults, $results);
视图
视图用于渲染分页组件(pagerfantas),这样您可以在多个项目中重用分页组件的HTML,分享它们并使用其他开发者提供的分页组件。
视图实现了 Pagerfanta\View\ViewInterface
接口,该接口包含两个方法
<?php
/**
* Renders a pagerfanta.
*
* The route generator is any callable to generate the routes receiving the page number
* as first and unique argument.
*
* @param PagerfantaInterface $pagerfanta A pagerfanta.
* @param mixed $routeGenerator A callable to generate the routes.
* @param array $options An array of options (optional).
*/
function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array());
/**
* Returns the canonical name.
*
* @return string The canonical name.
*/
function getName();
路由生成器示例
<?php
$routeGenerator = function($page) {
return '/path?page='.$page;
}
Pagerfanta提供了三种视图,默认视图,Twitter Bootstrap视图以及一个可选的特别视图。
默认视图
这是默认视图。
<?php
use Pagerfanta\View\DefaultView;
$view = new DefaultView();
$options = array('proximity' => 3);
$html = $view->render($pagerfanta, $routeGenerator, $options);
选项(默认)
- 邻近(3)
- 上一页提示(上一页)
- 下一页提示(下一页)
- 禁用CSS类(disabled)
- 点状CSS类(dots)
- 当前页CSS类(current)
- 点状文本(...)
- 容器模板(%pages%)
- 页面模板(%text%)
- 标签模板(%text%)
CSS样式
.pagerfanta {
}
.pagerfanta a,
.pagerfanta span {
display: inline-block;
border: 1px solid blue;
color: blue;
margin-right: .2em;
padding: .25em .35em;
}
.pagerfanta a {
text-decoration: none;
}
.pagerfanta a:hover {
background: #ccf;
}
.pagerfanta .dots {
border-width: 0;
}
.pagerfanta .current {
background: #ccf;
font-weight: bold;
}
.pagerfanta .disabled {
border-color: #ccf;
color: #ccf;
}
COLORS:
.pagerfanta a,
.pagerfanta span {
border-color: blue;
color: blue;
}
.pagerfanta a:hover {
background: #ccf;
}
.pagerfanta .current {
background: #ccf;
}
.pagerfanta .disabled {
border-color: #ccf;
color: #cf;
}
TwitterBootstrapView
此视图为 Twitter Bootstrap 生成分页。
<?php
use Pagerfanta\View\TwitterBootstrapView;
$view = new TwitterBootstrapView();
$options = array('proximity' => 3);
$html = $view->render($pagerfanta, $routeGenerator, $options);
选项(默认)
- 邻近(3)
- 上一页提示(← 上一页)
- 上一页禁用链接()
- 下一页提示(下一页 →)
- 下一页禁用链接()
- 点状提示(…)
- 点状链接()
- 容器CSS类(pagination)
- 上一页CSS类(prev)
- 下一页CSS类(next)
- 禁用CSS类(disabled)
- 点状CSS类(disabled)
- 活动CSS类(active)
可选视图
此视图用于在不同的视图中重用选项。
<?php
use Pagerfanta\DefaultView;
use Pagerfanta\OptionableView;
$defaultView = new DefaultView();
// view and default options
$myView1 = new OptionableView($defaultView, array('proximity' => 3));
$myView2 = new OptionableView($defaultView, array('previous_message' => 'Anterior', 'next_message' => 'Siguiente'));
// using in a normal way
$pagerfantaHtml = $myView2->render($pagerfanta, $routeGenerator);
// overwriting default options
$pagerfantaHtml = $myView2->render($pagerfanta, $routeGenerator, array('next_message' => 'Siguiente!!'));
待办事项
作者
帕布洛·迪埃兹 - pablodip@gmail.com
许可证
Pagerfanta采用MIT许可证。有关详细信息,请参阅LICENSE文件。
赞助商
致谢
Pagerfanta受到 Zend Paginator 的启发。