Пейджинг
Процесс пейджирования происходит, когда нам нужно постепенно представлять большие группы произвольных данных. Phalcon\Paginator предлагает быстрый и удобный способ разделения этих наборов данных на просматриваемые страницы.
Адаптеры данных
Этот компонент использует адаптеры для инкапсуляции различных источников данных:
| Адаптер | Описание |
|---|---|
| NativeArray | Использование массива PHP в качестве исходных данных |
| Model | Использование объекта Phalcon\Mvc\Model\Resultset в качестве исходных данных. Поскольку PDO не поддерживает прокручиваемые курсоры, этот адаптер не следует использовать для пейджирования большого числа записей |
| QueryBuilder | Использование объекта Phalcon\Mvc\Model\Query\Builder в качестве исходных данных |
Примеры
В приведенном ниже примере пагинатор будет использовать в качестве исходных данных результат запроса из модели и ограничивать отображаемые данные 10 записями на страницу:
// Current page to show
// In a controller 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 \Phalcon\Paginator\Adapter\Model(
array(
"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; ?>
Использование адаптеров
Пример исходных данных, которые должны использоваться для каждого адаптера:
//Passing a resultset as data
$paginator = new \Phalcon\Paginator\Adapter\Model(
array(
"data" => Products::find(),
"limit" => 10,
"page" => $currentPage
)
);
//Passing an array as data
$paginator = new \Phalcon\Paginator\Adapter\NativeArray(
array(
"data" => array(
array('id' => 1, 'name' => 'Artichoke'),
array('id' => 2, 'name' => 'Carrots'),
array('id' => 3, 'name' => 'Beet'),
array('id' => 4, 'name' => 'Lettuce'),
array('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 Phalcon\Paginator\Adapter\QueryBuilder(array(
"builder" => $builder,
"limit"=> 20,
"page" => 1
));
Атрибуты страницы
Объект $page имеет следующие атрибуты:
| Атрибут | Описание |
|---|---|
| items | Набор записей, которые должны быть отображены на текущей странице |
| current | Текущая страница |
| before | Предыдущая страница по отношению к текущей |
| next | Следующая страница по отношению к текущей |
| last | Последняя страница в наборе записей |
| total_pages | Количество страниц |
| total_items | Количество элементов в исходных данных |
Реализация собственных адаптеров
Для создания собственных адаптеров пагинатора или расширения существующих необходимо реализовать интерфейс Phalcon\Paginator\AdapterInterface:
class MyPaginator implements Phalcon\Paginator\AdapterInterface
{
/**
* 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–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/pagination.html