aferrandini/pagerfanta

为 PHP 5.3 设计的分页

dev-master 2013-05-29 15:10 UTC

This package is auto-updated.

Last update: 2024-09-20 17:40:57 UTC


README

Build Status

为 PHP 5.3 设计的分页

用法

<?php

use Pagerfanta\Pagerfanta;
use Pagerfanta\Adapter\ArrayAdapter;

$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.

适配器

适配器的概念非常简单。适配器仅返回结果数量和切片,以偏移量和长度。这样,您可以通过创建适配器来轻松地将 pagerfanta 适配到任何类型的分页。

适配器必须实现 Pagerfanta\Adapter\AdapterInterface 接口,它具有这两个方法

<?php

/**
 * Returns the number of results.
 *
 * @return integer The number of results.
 *
 * @api
 */
function getNbResults();

/**
 * Returns an slice of the results.
 *
 * @param integer $offset The offset.
 * @param integer $length The length.
 *
 * @return array|\Iterator|\IteratorAggregate The slice.
 *
 * @api
 */
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 = \Model\Article::getRepository()->createQuery();
$adapter = new MandangoAdapter($query);

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

DoctrineCollectionAdapter

要分页一个 Doctrine\Common\Collection\Collections 接口,您可以使用 DoctrineCollectionAdapter。它代理到 Collections 接口上的 count() 和 slice() 方法进行分页。如果您正在使用 Doctrine ORMs 的额外懒加载关联功能,则这很有意义。

<?php

use Pagerfanta\Adapter\DoctrineCollectionAdapter;

$user = $em->find("Pagerfanta\Tests\Adapter\DoctrineORM\User", 1);

$adapter = new DoctrineCollectionAdapter($user->getGroups());

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

视图

视图用于渲染 pagerfantas,这样您就可以在不同的项目中重用 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).
 *
 * @api
 */
function render(PagerfantaInterface $pagerfanta, $routeGenerator, array $options = array());

/**
 * Returns the canonical name.
 *
 * @return string The canonical name.
 *
 * @api
 */
function getName();

路由生成器示例

<?php

$routeGenerator = function($page) {
    return '/path?page='.$page;
}

Pagerfanta 随附三个视图,默认视图,一个用于 Twitter Bootstrap,以及一个特殊可选视图。

DefaultView

这是默认视图。

<?php

use Pagerfanta\View\DefaultView;

$view = new DefaultView();
$html = $view->render($pagerfanta, $routeGenerator, array(
    'proximity' => 3,
));

选项(默认)

  • proximity (3)
  • previous_message (Previous)
  • next_message (Next)
  • css_disabled_class (disabled)
  • css_dots_class (dots)
  • css_current_class (current)

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();
$html = $view->render($pagerfanta, $routeGenerator, array(
    'proximity' => 3,
));

选项(默认)

  • proximity (3)
  • prev_message (← Previous)
  • prev_disabled_href ()
  • next_message (Next)
  • next_disabled_href ()
  • dots_message (…)
  • dots_href ()
  • css_disabled_class (pagination)
  • css_previous_class (prev)
  • css_next_class (next)
  • css_disabled_class (disabled)
  • css_dots_class (disabled)
  • css_active_class (active)

OptionableView

此视图用于在不同视图中重用选项。

<?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!!'));

待办事项

作者

Pablo Díez - pablodip@gmail.com

许可协议

Pagerfanta 在 MIT 许可协议下授权。有关详细信息,请参阅 LICENSE 文件。

赞助商

WhiteOctober

致谢

Pagerfanta 受 Zend Paginator 的启发。