Как переделать пагинацию на ЧПУ

1k
Алексей,
Как переделать пагинацию на ЧПУ
Как переделать пагинацию на ЧПУ

Например с /?PAGEN_1=3 на /page-3/. Казалось бы добавил правило в urlrewrite, поменял компонент system.pagenavigation и готово, но нет.

Например с /?PAGEN_1=3 на /page-3/. Казалось бы добавил правило в urlrewrite, поменял компонент system.pagenavigation и готово, но нет.

Этот пост призван отговорить вас от этой идеи. Я тоже сначала думал, что это просто, но вот уже 3-й час сижу переделываю код блога (а он очень маленький).

Отвалились SEF пути комплексных компонентов (шаблон же уже не подходит), вообще любой код завязанный на ЧПУ путь перестанет работать, так же проблема на страницах где есть вторая пагинация PAGEN_2 и т.д., там много разных мелочей, которые нужно будет поменять. А т.к. мне необходимо сделать всё без костылей, без кастома ядра, то задачка становится практически невыполнима.

В интернете можно найти способ через подмену REQUEST_URI, но, как по мне, это очень костыльный способ, который в будущем может привести к проблемам.

Если знаете красивый способ решить эту задачу, напишите в комментариях.

Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.

Опубликовано 21 октября 2021
костыли, разработчику, пагинация
Поделиться
Похожие статьи
Как спарсить сайт, PhantomJS
Нужно загрузить большое количество страниц с чужого сайта, но при этом обычными серверными запросами...
Читать дальше » 0
Алексей,
Как добавить отчество в компонент регистрации system.auth.registration
Стандартно это сделать невозможно, т.к. компонент системный и его параметрами мы управлять не можем....
Читать дальше » 0
Алексей,
Комментарии
❮…❯
Авторизуйтесь чтобы получать уведомления об ответе
Алексей
6 дек 2022
Алексей, в urlrewrite можно добавить в CONDITION регулярку, игнорировать слово page как #ELEMENT_CODE# dev.1c-bitrix.ru/api_help/main/general/urlrewrite.php Но тогда надо запретить для элемента инфоблока символьный код с значением любого вхождения *page*. Или будет конфликт.
Алексей
6 дек 2022
В итоге будет ссылка вида: example.com/lala/blabla/?page=5
Алексей
6 дек 2022
Алексей, как вариант, да. Но хотелось бы без использования get параметров.
Алексей
6 дек 2022
Алексей, не вижу сложности потом переделать с гет запроса на вида /page-5/ через urlrewrite или .htaccess. Логика будет работать через гет, а на выходе будет то, что Вам нужно. А вот насчет PAGEN_2 - тут вопросы. Но ни на одном проекте не видел его использование.
Алексей
6 дек 2022
Алексей, будет проблема с чпу комплексных компонентов, которые ожидают данные по определённому шаблону: /catalog/#SECTION_CODE#/#ELEMENT_CODE#/. В данном примере в код элемента будет определён как page-5. Надо будет перенастраивать компоненты.
Алексей
6 дек 2022
init.php: AddEventHandler('main', 'OnPageStart', 'OnPageStartHandler'); function OnPageStartHandler() { if(isset($_GET['page']) && (int)$_GET['page'] > 0) { $GLOBALS['PAGEN_1'] = (int)$_GET['page']; } } system.pagenavigation в template.php: После пролога: ob_start(); После вывода шаблона (в конце файла): $paging = ob_get_contents(); $paging = preg_replace_callback('/href="([^"]+)"/is', function($matches) { $url = $matches[1]; $newUrl = ''; if ($arUrl = parse_url($url)) { $newUrl .= $arUrl['path']; if (substr($newUrl, -1) != '/') { $newUrl .= '/'; } $newUrl = preg_replace('#(page=[\d]+/)#is', '', $newUrl); parse_str(htmlspecialcharsback($arUrl['query']), $arQuery); foreach ($arQuery as $k => $v) { if (in_array($k, ['SECTION_CODE'])) { unset($arQuery[$k]); } elseif (substr($k, 0, 5) == 'PAGEN') { $arQuery['page'] = intval($v); unset($arQuery[$k]); } } $buildQuery = http_build_query(array_filter($arQuery)); if ($buildQuery) { $newUrl .= '?' . $buildQuery; } } return 'href="'.$newUrl.'"'; }, $paging); ob_end_clean(); echo $paging; В .htaccess RewriteCond %{QUERY_STRING} ^(.*&)?PAGEN_1=([^&]*)(&.*)?$ [NC] RewriteRule ^ %{REQUEST_URI}?%1page=%2%3 [R=302,L,NE]
Например с /?PAGEN_1=3 на /page-3/. Казалось бы добавил правило в urlrewrite, поменял компонент system.pagenavigation и готово, но нет.