Всем привет! На днях взялся за новый проект, где обязательным условием является его написание с нуля. Ввиду того, что обычно работаю на фреймворках и привык использовать готовые решения, отправился в гугл для поиска нормального класса-пагинатора, но устраивающий меня так и не нашел. Свой быдлокласс который я выкладывал сюда в начале этого года, меня так же не устроил
Некоторые наработки у меня уже были, но нормального пагинатора под рукой не было. Поэтому решил написать сам, чем я и собираюсь с Вами поделиться.
Может в дальнейшем ещё великами поделюсь, если будет настроение. Этот самый простой, поэтому без особого выноса мозга смогу объяснить с чем его едят.
Итак, приступим. Собственно сам код загорает в спойлере.
ЗЫ: тут беда с форматированием кода, в файле который в приложении норм.
Спойлер (Отобразить)PHP:
скопировать код в буфер обмена
class Paginator { private $currentPage; private $recordsCount; private $perPageLimit; private $maxPagesCount; private $pagesCount; public function setCurrentPage($page) { $this->currentPage = $page; return $this; } public function setRecordsCount($recordsCount) { $this->recordsCount = $recordsCount; return $this; } public function setPerPageLimit($perPageLimit) { $this->perPageLimit = $perPageLimit; return $this; } public function setMaxPageCount($maxPagesCount) { $this->maxPagesCount = $maxPagesCount; return $this; } private function getPageRange() { $this->pagesCount = ceil($this->recordsCount / $this->perPageLimit); $firstPageInRange = $this->currentPage - (int)($this->maxPagesCount / 2); $firstPageInRange = $this->pagesCount - $firstPageInRange < $this->maxPagesCount ? $this->pagesCount - $this->maxPagesCount + 1 : $firstPageInRange; $firstPageInRange = $firstPageInRange < 1 ? 1 : $firstPageInRange; $lastPageInRange = $firstPageInRange + ($this->maxPagesCount - 1); $lastPageInRange = $lastPageInRange > $this->pagesCount ? $this->pagesCount : $lastPageInRange; $lastPageInRange = $lastPageInRange <= 0 ? 1 : $lastPageInRange; return range($firstPageInRange, $lastPageInRange); } public function getPages() { $pages = [ 'current' => $this->currentPage, 'pages' => $this->getPageRange(), ]; $prevPage = $this->currentPage != 1 ? $this->currentPage - 1 : null; $nextPage = $this->currentPage < $this->pagesCount ? $this->currentPage + 1 : null; $lastPage = $nextPage ? $this->pagesCount : null; !$prevPage ?: $pages['prev'] = $prevPage; !$nextPage ?: $pages['next'] = $nextPage; !$lastPage ?: $pages['last'] = $lastPage; return $pages; } }
У класса всего 6 методов, 5 из которых предназначены для клиентского кода.
Описание методов:
1. setCurrentPage - для установления номера текущей страницы
2. setRecordsCount - для установления общего количества записей
3. setMaxPageCount - для установления максимального количества страниц пагинатора
4. setPerPageLimit - для установления количества выводимых записей на одну страницу
5. getPages - для получения массива данных о страницах
Пример использования:
PHP:
скопировать код в буфер обмена
$page = isset($_GET['page']) ? (int )$_GET['page'] : 1; $paginator = new Paginator(); $pages = $paginator->setCurrentPage($page) ->setRecordsCount(200) ->setPerPageLimit(10) ->setMaxPageCount(5) ->getPages();
Если Вы все сделали правильно, то в $pages будет приблизительно такой массив:
Если к примеру Вы переключитесь на вторую страничку, то в массиве появится дополнительный ключ 'prev' и значение(число) предыдущей странички.
Так же если нет страничек(высчитывается на основе переданных данных) "вперед", то ключа next в массиве так же не будет.
Ну и наконец пример вывода.
Спойлер (Отобразить)PHP:
скопировать код в буфер обмена
if(isset($pages['prev'])){ echo '<a href="?page=1"><<</a> <a href="?page='.$pages['prev'].'"><</a> '; } foreach($pages['pages'] as $page){ $currentPageClass = $page == $pages['current'] ? 'class="cur_page"' : ''; echo '<a href="?page='.$page.'" '.$currentPageClass .' >'.$page.'</a> '; } if(isset($pages['next'])){ echo '<a href="?page='.$pages['next'].'">></a> <a href="?page='.$pages['last'].'">>></a> '; }
Думаю ничего не забыл, файл с классом в приложении.
(Отредактировано автором: 28 Февраля, 2015 - 21:41:39)
|