REQUEST_URI без номера страницы пагинации

Вероломство

PHP:
  1. foreach (explode(«https://php.ru/», ltrim($_SERVER[‘REQUEST_URI’], «https://php.ru/»)) as $item) {
  2.  
  3.     if (!is_numeric($item)) {
  4.         $this->uri .= «https://php.ru/» . $item;
  5.     }
  6. }

из /test/page/2 получаем /test/page

может быть есть изящнее способы?

 

Sail

@Вероломство, substr() по координатам от strrpos(),?
— Добавлено —
Или регуляркой отсечь хвост из слеша и числа.

 

Вероломство

/test/page/2/2

:)

хоть у меня роутер и не пропустит такого рода адрес в 404 выкинет, но всё-равно косяк вылазит теоретически

 

MouseZver

PHP:
  1. <?php
  2.  
  3. echo rtrim ( ‘/test/page/20/2’, ‘0..9/’ );
  4. # result: /test/page
 

Sail

Регуляркой отсечь весь хвост, начинающийся со слеша и цифры

 

Вероломство

чувак ты крут, я даже не подозревал, что trim так умеет, благодарю: красота :)

 

miketomlin

То что триму можно передавать доп. набор удаляемых символов, это, правда, вкусная плюшка. Но сомневаюсь, что это прям красота для вашего случая. Не идите на поводу у WP и прочей лабуды, передавайте номер страницы пагинации в GET-параметре ;)

 

Вероломство

у меня нету GET я на уровне роутера ловлю параметры, примерно так

PHP:
  1. Router::addRoute(‘{controller:unit}/{action:ground}/{page:[1-9]d*}’);

раньше использовал что-то вроде &page=2, но сейчас полностью отказался

 

miketomlin

Это пофиг. Роуты могут быть и с GET, просто с GET больше шансов использовать один роут вместо двух похожих.

Адреса для ссылок обычно делаются не путем секвестрирования текущего, а путем их полной постройки. Хотя часто бывает трудно отказаться от соблазна для создания нового адреса что-нибудь отчикать от текущего, понимаю :)

 

Вероломство

PHP:
  1. <?php
  2.  
  3.  
  4. namespace core;
  5.  
  6.  
  7. use Error;
  8.  
  9. class Pagination
  10. {
  11.     public $uri;
  12.     public $per_page;
  13.     public $total;
  14.     public $count_pages;
  15.     public $current_page;
  16.  
  17.     public function __construct($per_page, $current_page, $total)
  18.     {
  19.         $this->uri = rtrim($_SERVER[‘REQUEST_URI’], ‘0..9/’); // ВОТ СУТЬ 🙂
  20.         $this->per_page = $per_page;
  21.         $this->total = $total;
  22.         $this->count_pages = $this->getCountPages();
  23.         $this->current_page = $this->getCurrentPage($current_page);
  24.     }
  25.  
  26.     public function getCountPages()
  27.     {
  28.         return ceil($this->total / $this->per_page) ?: 1;
  29.     }
  30.  
  31.     public function getCurrentPage($current_page)
  32.     {
  33.         if (filter_var($current_page, FILTER_VALIDATE_INT, [
  34.             ‘options’ => [
  35.                 ‘min_range’ => 1,
  36.                 ‘max_range’ => $this->count_pages
  37.             ]
  38.         ])) {
  39.             return $current_page;
  40.         }
  41.         throw new Error(‘Страница не найдена’, 404);
  42.     }
  43.  
  44.     public function getStart()
  45.     {
  46.         return ($this->current_page 1) * $this->per_page;
  47.     }
  48.  
  49.     public function __toString()
  50.     {
  51.         return $this->getHtml();
  52.     }
  53.  
  54.     public function getHtml()
  55.     {
  56.         $start_page = $back = $page2left = $page1left = $page1right = $page2right = $forward = $end_page = null;
  57.  
  58.         if ($this->current_page > 3) {
  59.             $start_page = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}/1″>&laquo;</a></li>»;
  60.         }
  61.  
  62.         if ($this->current_page > 1) {
  63.             $back = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page 1) . «»>&#8249;</a></li>»;
  64.         }
  65.  
  66.         if ($this->current_page 2 > 0) {
  67.             $page2left = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page 2) . «»>» . ($this->current_page 2) . «</a></li>»;
  68.         }
  69.  
  70.         if ($this->current_page 1 > 0) {
  71.             $page1left = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page 1) . «»>» . ($this->current_page 1) . «</a></li>»;
  72.         }
  73.  
  74.         if ($this->current_page + 1 <= $this->count_pages) {
  75.             $page1right = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page + 1) . «»>» . ($this->current_page + 1) . «</a></li>»;
  76.         }
  77.  
  78.         if ($this->current_page + 2 <= $this->count_pages) {
  79.             $page2right = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page + 2) . «»>» . ($this->current_page + 2) . «</a></li>»;
  80.         }
  81.  
  82.         if ($this->current_page < $this->count_pages) {
  83.             $forward = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}. ($this->current_page + 1) . «»>&#8250;</a></li>»;
  84.         }
  85.  
  86.         if ($this->current_page < ($this->count_pages 2)) {
  87.             $end_page = «<li class=»page-item»><a class=»page-link» href=»https://php.ru/forum/threads/request_uri-bez-nomera-stranicy-paginacii.91223/{$this->uri}/{$this->count_pages}«>&raquo;</a></li>»;
  88.         }
  89.  
  90.         return ‘<nav class=»mt-1″><ul class=»pagination pagination-sm justify-content-center m-0″>’ . $start_page . $back . $page2left . $page1left . ‘<li class=»page-item active»><a class=»page-link»>’ . $this->current_page . ‘</a></li>’ . $page1right . $page2right . $forward . $end_page . ‘</ul></nav>’;
  91.     }
  92. }
 

miketomlin

ЭТО не СУТЬ, а самообман :) Причем с возможными трудно уловимыми багами.

В конце вообще жесть. Я про getHtml. Отчетливо ощущается душок поповщины. Был когда-то такой продвиженец г/кода в массы.

P.S. Но не буду наседать. Авось само со временем дойдет. Хотя лично мне многое вдалбливали :)
— Добавлено —

Немного раскрою, чтобы не выглядеть каким-нибудь трол-ло-ло. Часто в конце путей всплывают различные числовые идентификаторы. Ваша реализация это намертво убивает. Это только для затравки. Там много еще всякого Г может повсплывать.

 

Вероломство

в том-то и дело, что сейчас бага нет :), до этого проскакивало кое-что

поповщину видел только в интернете на картинках обложки книг, мне некогда их просто читать :)

говнокодю всё сам + вопросы в сообществах, во фреймворки заглядываю иногда, чтобы поржать и лишний раз убедиться, что всё гораздо проще, когда сам :)
— Добавлено —
@miketomlin что ещё за числовые идентификаторы? :) как они туда попали, я про них знаю, я задавал правила под них? :)

не очень понял

 

miketomlin

У вас как класс называется? Ему должны быть параллельны ваши правила ;)
— Добавлено —
Хотя вы даже умудрились разметку в него затащить :eek:

 

Вероломство

@miketomlin моим правилом туда прилетает current_page и меня устраивает разметка :)

ты видимо предлагаешь разметку в отдельный файл вынести и заинкудить в методе, так мне без разницы :p

https://my-files.su/opamcu

 

miketomlin

Это да, но там и сама разметка – жесть. Оно циклом делается. Что-то типа такого: https://gency.ru/comment/33

 

Вероломство

ну пока что так, будет время допилю что-то, там же разметка по условиЯМ, подумаю, ок

 

askanim

начать пользоваться любым framework и научится работать в нём с маршрутами и забыть про костыли на регулярках при парсинге урла.

 

MouseZver

Ты программист или просто конструкторщик ?

 

askanim

Не ну можешь дальше руками землю копать когда рядом экскаватор стоит !

 

Вероломство

PHP:
  1. $this->uri = rtrim($_SERVER[‘REQUEST_URI’], ‘0..9/’);

что тут не так сделано и неумолимым образом требует развернуть фреймворк на 50 мегабайт?

и зачем мне становиться пользователем фреймворка, если я сам могу его написать?

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *