Всем привет! На днях взялся за новый проект, где обязательным условием является его написание с нуля. Ввиду того, что обычно работаю на фреймворках и привык использовать готовые решения, отправился в гугл для поиска нормального класса-пагинатора, но устраивающий меня так и не нашел. Свой быдлокласс который я выкладывал сюда в начале этого года, меня так же не устроил
Некоторые наработки у меня уже были, но нормального пагинатора под рукой не было. Поэтому решил написать сам, чем я и собираюсь с Вами поделиться.
Может в дальнейшем ещё великами поделюсь, если будет настроение. Этот самый простой, поэтому без особого выноса мозга смогу объяснить с чем его едят.
Итак, приступим. Собственно сам код загорает в спойлере.
ЗЫ: тут беда с форматированием кода, в файле который в приложении норм.
Спойлер (Отобразить)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;
}
}
1. setCurrentPage - для установления номера текущей страницы
2. setRecordsCount - для установления общего количества записей
3. setMaxPageCount - для установления максимального количества страниц пагинатора
4. setPerPageLimit - для установления количества выводимых записей на одну страницу
5. getPages - для получения массива данных о страницах