Pagination
Ice\Pagination provide the multi-page pagination component.
You can simply paginate on array or Ice\Arr object (which is used during finding models). In the controller:
namespace App\Modules\Frontend\Controllers;
use App\Models\Posts;
use Ice\Pagination;
class PostController extends IndexController
{
public function indexAction()
{
$pagination = new Pagination([
"data" => Posts::find(),
// Set the current page from _GET
"page" => $this->request->getQuery('page', 'int', 1, true)
]);
$this->view->setVars([
'pagination' => $pagination->calculate()
]);
}
}
In the view:
{# Loop over current page items #}
{% foreach pagination.items as post %}
{{ post.title }}
{% endforeach %}
{# Display pagination links, eg. Previous 1 [2] 3 4 5 6 Next #}
{{ pagination.minimal() }}
Using routes
You can use route /2 instead of query ?page=2 and set the limit items per page:
$pagination = new Pagination([
"data" => Posts::find(),
"limit" => 20,
"page" => $this->dispatcher->getParam('page', 'int', 1, true),
"query" => false
]);
But you need to specify routes in the bootstrap file:
di->set('router', function () {
$router = new Ice\Mvc\Router();
$router->setRoutes([
['GET', '/{controller:post}/{page:\d+}'],
// ...
]);
return $router;
});
Templates
In the views you can display different templates:
{{ pagination.minimal() }}
{# Previous 1 [2] 3 4 5 6 Next #}
{{ pagination.basic() }}
{# First Previous 1 [2] 3 4 5 6 Next Last #}
{{ pagination.floating() }}
{# First Previous 1 2 3 ... 23 24 25 26 [27] 28 29 30 31 ... 48 49 50 Next Last#}
If you have the
i18nservice in the di, it'll be used to translate Previous, Next, etc. words.
Pagination properties
You can access to first, previous, current, next, last, pages, total, items properties and display own pagination info:
{{ _t('Page: %d/%d (%d items)', [pagination.current, pagination.pages, pagination.total]) }}
{# Page: 2/6 (54 items) #}