Spec-Zone.ru › Phalcon 3

Пагинация

Процесс пагинации происходит, когда нам нужно постепенно отображать большие группы произвольных данных. Phalcon\Paginator предлагает быстрый и удобный способ разбить эти наборы данных на просматриваемые страницы.

Адаптеры данных

Этот компонент использует адаптеры для инкапсуляции различных источников данных:

Адаптер Описание
Phalcon\Paginator\Adapter\NativeArray Использует массив PHP в качестве исходных данных
Phalcon\Paginator\Adapter\Model Использует объект Phalcon\Mvc\Model\Resultset в качестве исходных данных. Поскольку PDO не поддерживает прокручиваемые курсоры, этот адаптер не следует использовать для пагинации большого числа записей
Phalcon\Paginator\Adapter\QueryBuilder Использует объект Phalcon\Mvc\Model\Query\Builder в качестве исходных данных

Примеры

В примере ниже пагинатор будет использовать результат запроса из модели в качестве исходных данных и ограничит отображаемые данные 10 записями на страницу:

use Phalcon\Paginator\Adapter\Model as PaginatorModel;

// Current page to show
// In a controller/component this can be:
// $this->request->getQuery("page", "int"); // GET
// $this->request->getPost("page", "int"); // POST
$currentPage = (int) $_GET["page"];

// The data set to paginate
$robots = Robots::find();

// Create a Model paginator, show 10 rows by page starting from $currentPage
$paginator = new PaginatorModel(
    [
        "data"  => $robots,
        "limit" => 10,
        "page"  => $currentPage,
    ]
);

// Get the paginated results
$page = $paginator->getPaginate();

Переменная $currentPage управляет отображаемой страницей. $paginator->getPaginate() возвращает объект $page, содержащий отформатированные данные. Его можно использовать для генерации пагинации:

<table>
    <tr>
        <th>Id</th>
        <th>Name</th>
        <th>Type</th>
    </tr>
    <?php foreach ($page->items as $item) { ?>
    <tr>
        <td><?php echo $item->id; ?></td>
        <td><?php echo $item->name; ?></td>
        <td><?php echo $item->type; ?></td>
    </tr>
    <?php } ?>
</table>

Объект $page также содержит данные навигации:

<a href="/robots/search">First</a>
<a href="/robots/search?page=<?= $page->before; ?>">Previous</a>
<a href="/robots/search?page=<?= $page->next; ?>">Next</a>
<a href="/robots/search?page=<?= $page->last; ?>">Last</a>

<?php echo "You are in page ", $page->current, " of ", $page->total_pages; ?>

Использование адаптеров

Пример исходных данных, которые должны использоваться для каждого адаптера:

use Phalcon\Paginator\Adapter\Model as PaginatorModel;
use Phalcon\Paginator\Adapter\NativeArray as PaginatorArray;
use Phalcon\Paginator\Adapter\QueryBuilder as PaginatorQueryBuilder;

// Passing a resultset as data
$paginator = new PaginatorModel(
    [
        "data"  => Products::find(),
        "limit" => 10,
        "page"  => $currentPage,
    ]
);

// Passing an array as data
$paginator = new PaginatorArray(
    [
        "data"  => [
            ["id" => 1, "name" => "Artichoke"],
            ["id" => 2, "name" => "Carrots"],
            ["id" => 3, "name" => "Beet"],
            ["id" => 4, "name" => "Lettuce"],
            ["id" => 5, "name" => ""],
        ],
        "limit" => 2,
        "page"  => $currentPage,
    ]
);

// Passing a QueryBuilder as data

$builder = $this->modelsManager->createBuilder()
    ->columns("id, name")
    ->from("Robots")
    ->orderBy("name");

$paginator = new PaginatorQueryBuilder(
    [
        "builder" => $builder,
        "limit"   => 20,
        "page"    => 1,
    ]
);

Атрибуты страницы

Объект $page имеет следующие атрибуты:

Атрибут Описание
items Набор записей, которые будут отображаться на текущей странице
current Текущая страница
before Предыдущая страница по отношению к текущей
next Следующая страница по отношению к текущей
last Последняя страница в наборе записей
total_pages Количество страниц
total_items Количество элементов в исходных данных

Реализация собственных адаптеров

Для создания собственных адаптеров пагинации или расширения существующих необходимо реализовать интерфейс Phalcon\Paginator\AdapterInterface:

use Phalcon\Paginator\AdapterInterface as PaginatorInterface;

class MyPaginator implements PaginatorInterface
{
    /**
     * Adapter constructor
     *
     * @param array $config
     */
    public function __construct($config);

    /**
     * Set the current page number
     *
     * @param int $page
     */
    public function setCurrentPage($page);

    /**
     * Returns a slice of the resultset to show in the pagination
     *
     * @return stdClass
     */
    public function getPaginate();
}

© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/pagination.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API