simple pagination for slim3
PHP 7.0 or higher
Slim 3.0
via composer:
composer require xandros15/slim-pagination
Create a object of pagination inside of controller callback, fetch it into string via renderer and pass it as variable:
<?php
use Xandros15\SlimPagination\Pagination;
$app->get('/users', function (Request $request, Response $response) {
$users = User::search($request);
$pagination = new Pagination($request, $this->get('router'),[
Pagination::OPT_TOTAL => count($users), //number of items
]);
$paginationString = $this-view->fetch('pagination', ['pagination' => $pagination]);
return $this->view->render('user.index', ['pagination' => $paginationString]);
})->name('user.index');
Them render if via template manager.
<nav class="text-center col-xs-12">
<ul class="pagination">
<?php /** @var $pagination Xandros15\SlimPagination\Pagination */ ?>
<?php if ($pagination->previous()['isCurrent']): ?>
<li class="disabled">
<span><?= $pagination->previous()['pageName'] ?></span>
</li>
<?php else: ?>
<li>
<a aria-label="previous" href="<?= $pagination->previous()['pathFor'] ?>">
<span aria-hidden="true"><?= $pagination->previous()['pageName'] ?></span>
</a>
</li>
<?php endif ?>
<?php foreach ($pagination as $page): ?>
<?php if ($page['isSlider']): ?>
<li class="disabled">
<span><?= $page['pageName'] ?></span>
</li>
<?php elseif ($page['isCurrent']): ?>
<li class="active">
<span><?= $page['pageName'] ?></span>
</li>
<?php else: ?>
<li>
<a href="<?= $page['pathFor'] ?>"><?= $page['pageName'] ?></a>
</li>
<?php endif; ?>
<?php endforeach; ?>
<?php if ($pagination->next()['isCurrent']): ?>
<li class="disabled">
<span><?= $pagination->next()['pageName'] ?></span>
</li>
<?php else: ?>
<li>
<a aria-label="next" href="<?= $pagination->next()['pathFor'] ?>">
<span aria-hidden="true"><?= $pagination->next()['pageName'] ?></span>
</a>
</li>
<?php endif ?>
</ul>
</nav>
{% if pagination.canCreate %}
<nav class="text-center col-xs-12">
<ul class="pagination">
{% if pagination.previous.isCurrent %}
<li class="disabled">
<span>{{ pagination.previous.pageName | raw }}</span>
</li>
{% else %}
<li>
<a aria-label="previous" href="{{ pagination.previous.pathFor }}">
<span aria-hidden="true">{{ pagination.previous.pageName | raw }}</span>
</a>
</li>
{% endif %}
{% for page in pagination %}
{% if page.isSlider %}
<li class="disabled"><span>{{ page.pageName }}</span></li>
{% elseif page.isCurrent %}
<li class="active"><span>{{ page.pageName }}</span></li>
{% else %}
<li><a href="{{ page.pathFor}}">{{ page.pageName }}</a></li>
{% endif %}
{% endfor %}
{% if pagination.next.isCurrent %}
<li class="disabled">
<span aria-hidden="true">{{ pagination.next.pageName | raw }}</span>
</li>
{% else %}
<li>
<a aria-label="next" href="{{ pagination.next.pathFor }}">
<span aria-hidden="true">{{ pagination.next.pageName | raw }}</span>
</a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
Name | Info | Default | More |
---|---|---|---|
Pagination::OPT_TOTAL |
set to total of items | (int) 1 | - |
Pagination::OPT_PARAM_NAME |
set param name | (string) page |
?page=2 or route /[{page:\d+}] has param name: page |
Pagination::OPT_PARAM_TYPE |
set param type (e.g via query or attribute) | PageList::PAGE_QUERY |
PageList::PAGE_QUERY for: ?page=2 PageList::PAGE_ATTRIBUTE for: /page/2 |
Pagination::OPT_PER_PAGE |
set how many items should be show on one page | (int) 10 | - |
Pagination::OPT_SIDE_LENGTH |
set how many buttons should be show before slider | (int) 3 | - |
Pagination::OPT_LIST_TYPE |
set type of list | PageList::NORMAL |
available:PageList::NORMAL ;PageList::MINI PageList::NONE |
PageList::NORMAL
is normal pagination with slider:
PageList::MINI
is minimalistic pagination:
can be created by simple code:
{% for page in pagination %}
{% if page.isCurrent %}
<li class="disabled"><span>{{ page.pageName }}</span></li>
{% else %}
<li><a href="{{ page.pathFor }}">{{ page.pageName }}</a></li>
{% endif %}
{% endfor %}
<?php foreach ($pagination as $page): ?>
<?php if ($page['isCurrent']): ?>
<li class="disabled">
<span><?= $page['pageName'] ?></span>
</li>
<?php else: ?>
<li>
<a href="<?= $page['pathFor'] ?>"><?= $page['pageName'] ?></a>
</li>
<?php endif; ?>
<?php endforeach; ?>
PageList::NONE
turns off pagination
pathFor
- returning path for this page
isCurrent
- check if this page is current
pageName
- returning page name (e.g. number)
isSlider
- check if this page is slider
previous()
- getting previous page, if doesn't exist returning current
next()
- getting next page, if doesn't exist returning current
first()
- getting first page
last()
- getting last page
canCreate()
- checking if pagination can be create
toArray()
- returning array of defined params:
- per_page: how many items on one page
- current_page: number of current page
- next_page_url: path for next page
- prev_page_url: path for previous page
- from: number of first item
- to: number of last item
toJson()
- same as toArray(), just compile to json string