Как то велосипедировал на досуге писал свой фреймворк *

Сегодня вот нашёл. Класс очень гибок не зависим от скрипта и впиливается запросто хоть куда ну и работает не только с MySQL. Он лишь высчитыает данные и возвршает их.

И решил поделится классов с вами. Код прокомментирован в конце кода приведён пример.

                        
<?php
namespace VendorApp;

interface PaginationInterface
{
/*
@Parameter of type array or object
[
'page' => (int) 'текущая страница',
'limit' => (int) 'значений на страницу'
'items' => (int) 'кол-во записей, общее'
]
*/
function __construct ($settings = []);
/*
A synonym for the constructor of the class
*/
function initialize ($settings = []);
/*
The returned object
[
limit => Лимит вывода на 1 страницу
pages => Всего страниц
pageNext => номер следущей страницы
pageAgo => Номер предыдущей страницы
lastPage => Номер последней страницы
currentPage => Текущая страница
firstPage => Номер первой страницы
offset => Смещение (например для выборки из бд для подставлени я LIMIT)
]
*/
function getPaginate ();

}

class Pagination implements PaginationInterface
{
private $settings = [];

public function __construct ($settings = [])
{
$this->initialize($settings);
}

public function initialize ($settings = [])
{
if (!is_array($settings))
{
show_error('Ошибка работы пагинации, не верные параметры');
}

$this->settings = (object) $settings;
}

public function getPaginate ()
{
$pages = ceil($this->settings->items / $this->settings->limit);
$this->settings->page = $this->settings->page > $pages ? 1 : $this->settings->page;
$pageNext = ($this->settings->page + 1 > $pages) ? $pages : $this->settings->page + 1;
$pageAgo = ($this->settings->page - 1 < $pages) ? $pages : $this->settings->page - 1;
$currentPage = $this->settings->page;
$lastPage = $pages;
$firstPage = 1;
$offset = $this->settings->page * $this->settings->limit - $this->settings->limit;

return (object) [
'limit' => $this->settings->limit,
'pages' => $pages,
'pageNext' => $pageNext,
'pageAgo' => $pageAgo,
'currentPage' => $currentPage,
'lastPage' => $lastPage,
'firstPage' => $firstPage,
'offset' => $offset
];
}
}


/*
Example use library:

$pagination = new VendorAppPagination([
'page' => isset($_GET['page']) ? (int) $_GET['page'] : 1,
'limit' => 10,
'items' => $db->query('SELECT `id` FROM `users`')->num_rows()
]);

$pagination = $pagination->getPaginate();

$items = $db->query('SELECT * FROM `users` LIMIT '.$pagination->offset.', '.$pagination->limit)->fetchAll();

foreach ($items as $item)
{
...
}

---------- View Linkss ---------

<a href="?page=<?php echo $pagination->firstPage ?>">Начало</a>
<a href="?page=<?php echo $pagination->pageAgo ?>">Назад</a>

Текущая страница <?php $pagination->currentPage ?> из <?php echo $pagination->pages ?>

<a href="?page=<?php echo $pagination->nextPage ?>">Вперёд</a>
<a href="?page=<?php echo $pagination->pages ?>">Конец</a>

*/
0 20 0
Без комментариев...