/
Malenych
/
techart_test
Обзор
Документация
Войти
/
Malenych
/
techart_test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
engine/Paginator.php
124 строки
4 KB
Andrey Malenko
Исправление условий выбора стриницы паджинатором
25 янв 2026, 18:08
25 янв 2026, 18:08
cbcb39d
Код
Авторство
О чём код?
<?php namespace Engine; use Engine\Config; class Paginator { private int $per_page; private int $count; private int $page_count; private int $page; private $order_row = null; private $order_type = 'DESC'; public function __construct(private string $class_name, int|null $per_page = null) { if ($per_page) { $this->per_page = $per_page; } else { $this->per_page = Config::get('news.per_page'); } $this->count = $this->class_name::count(); $this->setPageCount(); } /** * Устанавливает текущую страницу * @param int $page * @return Paginator */ public function setPage(int $page): static { if ($page >= 1 && $page <=$this->page_count) { $this->page = $page; } else { $this->page = 1; } return $this; } /** * Summary of setOrder * @param string|null $order_row * @param string $order_type * @return Paginator */ public function setOrder(string|null $order_row = null, string $order_type = 'DESC'): static { $this->order_row = $order_row; $this->order_type = $order_type; return $this; } /** * Получить записи из базы данных для текущего пагинатора * @return array */ public function recordings(): array { $from_rec = $this->page * $this->per_page - $this->per_page; return $this->class_name::all($from_rec, $this->per_page, $this->order_row, $this->order_type); } public function HTML(string $link = '', string $html_class_name = ''): string { $html_pages = ""; // Добавить стрелку, если страница не первая if ($this->page !== 1) { $prev_li_class = $this->getHTMLClass($html_class_name, "__prev-page", $html_class_name . "__page"); $prev_a_class = $this->getHTMLClass($html_class_name, "__prev-link"); $html_pages .= "\t<li" . $prev_li_class . ">\n\t\t<a href=\"" . $link . "?page=" . $this->page - 1 . "\"" . $prev_a_class . "></a>\n\t</li>\n"; } for ($i = 1; $i <= $this->page_count; $i++) { if ($i === $this->page) { $li_class = $this->getHTMLClass($html_class_name, "__current-page"); $p_class = $this->getHTMLClass($html_class_name, "__current-page-number"); $html_pages .= "\t<li" . $li_class . ">\n\t\t<p" . $p_class . ">" . $i . "</p>\n\t</li>\n"; } else { $li_class = $this->getHTMLClass($html_class_name, "__page"); $a_class = $this->getHTMLClass($html_class_name, "__link"); $html_pages .= "\t<li" . $li_class . ">\n\t\t<a href=\"" . $link . "?page=" . $i . "\"" . ($a_class? $a_class : "") . ">" . $i . "</a>\n\t</li>\n"; } } // Добавить стрелку, если страница не последняя if ($this->page !== $this->page_count) { $last_li_class = $this->getHTMLClass($html_class_name, "__next-page", $html_class_name . "__page"); $last_a_class = $this->getHTMLClass($html_class_name, "__next-link"); $html_pages .= "\t<li" . $last_li_class . ">\n\t\t<a href=\"" . $link . "?page=" . $this->page + 1 . "\"" . $last_a_class . "></a>\n\t</li>\n"; } $ul_class = $html_class_name? " class=\"" . $html_class_name . "\"" : ""; return "<ul" . $ul_class . ">\n" . $html_pages . "</ul>\n"; } /** * Установить количество страниц * @return void */ private function setPageCount(): void { $this->page_count = (int)ceil($this->count / $this->per_page); } /** * Устанавливает класс для HTML-элементов * @param string $html_class_name * @param string $postfix * @param string $main_class * @return string */ private function getHTMLClass(string $html_class_name = '', string $postfix = '', string $main_class = ''): string { if ($main_class) { $main_class .= " "; } return $html_class_name? " class=\"" . $main_class . $html_class_name . $postfix . "\"" : ""; } }