Как переделать пагинацию на ЧПУ
Например с /?PAGEN_1=3 на /page-3/. Казалось бы добавил правило в urlrewrite, поменял компонент system.pagenavigation и готово, но нет.
Этот пост призван отговорить вас от этой идеи. Я тоже сначала думал, что это просто, но вот уже 3-й час сижу переделываю код блога (а он очень маленький).
Отвалились SEF пути комплексных компонентов (шаблон же уже не подходит), вообще любой код завязанный на ЧПУ путь перестанет работать, так же проблема на страницах где есть вторая пагинация PAGEN_2 и т.д., там много разных мелочей, которые нужно будет поменять. А т.к. мне необходимо сделать всё без костылей, без кастома ядра, то задачка становится практически невыполнима.
В интернете можно найти способ через подмену REQUEST_URI, но, как по мне, это очень костыльный способ, который в будущем может привести к проблемам.
Если знаете красивый способ решить эту задачу, напишите в комментариях.
Есть вопросы или нашли ошибку? Напишите комментарий (можно без регистрации), отвечать стараюсь быстро.
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;
В .htaccessRewriteCond %{QUERY_STRING} ^(.*&)?PAGEN_1=([^&]*)(&.*)?$ [NC] RewriteRule ^ %{REQUEST_URI}?%1page=%2%3 [R=302,L,NE]