nitra / pagerfanta

此包已被放弃,不再维护。未建议替代包。

PHP 5.3 的分页

v1.0.1 2013-09-23 10:06 UTC

README

Build Status Scrutinizer Quality Score Code Coverage SensioLabsInsight Latest Stable Version Total Downloads

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%

Pagerfanta DefaultView

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文件。

赞助商

WhiteOctober

致谢

Pagerfanta受到 Zend Paginator 的启发。