The process of pagination takes place when we need to present big groups of arbitrary data gradually. Phalcon\Paginator
offers a fast and convenient way to split these sets of data into browsable pages.
Data Adapters
This component makes use of adapters to encapsulate different sources of data:
Adapter | Description |
---|---|
Phalcon\Paginator\Adapter\NativeArray | Use a PHP array as source data |
Phalcon\Paginator\Adapter\Model | Use a Phalcon\Mvc\Model\Resultset object as source data. Since PDO doesn’t support scrollable cursors this adapter shouldn’t be used to paginate a large number of records |
Phalcon\Paginator\Adapter\QueryBuilder | Use a Phalcon\Mvc\Model\Query\Builder object as source data |
Examples
In the example below, the paginator will use the result of a query from a model as its source data, and limit the displayed data to 10 records per page:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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(); |
The $currentPage
variable controls the page to be displayed. The $paginator->getPaginate()
returns a $page
object that contains the paginated data. It can be used for generating the pagination:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < 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 > |
The $page
object also contains navigation data:
1 2 3 4 5 6 | < 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; ?> |
Adapters Usage
An example of the source data that must be used for each adapter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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 Attributes
The $page
object has the following attributes:
Attribute | Description |
---|---|
items | The set of records to be displayed at the current page |
current | The current page |
before | The previous page to the current one |
next | The next page to the current one |
last | The last page in the set of records |
total_pages | The number of pages |
total_items | The number of items in the source data |
Implementing your own adapters
The Phalcon\Paginator\AdapterInterface interface must be implemented in order to create your own paginator adapters or extend the existing ones:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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(); } |
Please login to continue.