ЧПУ пагинации 1С Битрикс

  • Vadim Tsukanov
    Разработчик
  • Дата публикации
    15.02.2022
  • Категория
    1С-Битрикс
Задача:Сделать ЧПУ для пагинации на базе 1С-Битрикс

Сегодня поговорим о том, как привести ссылки пагинации вида ?PAGEN1_3 к виду /pagen3/

В интернете полно инструкция, однако я потратил пол дня, пока нашел решение, которое бы сработало у меня.

1.Правим шаблон пагиначки, чтобы получить необходимые ссылки

<? if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true)die();
 
if(!$arResult['NavShowAlways']) {
    if ($arResult['NavRecordCount'] == 0 || ($arResult['NavPageCount'] == 1 && $arResult['NavShowAll'] == false)) {
        return;
    }
}
 
$strNavQueryString = ($arResult['NavQueryString'] != '' ? $arResult['NavQueryString'].'&' : '');
$strNavQueryStringFull = ($arResult['NavQueryString'] != '' ? '?'.$arResult['NavQueryString'] : '');
ob_start();
?>
 
******** Ваш шаблон тут *******
 
<?php
$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('#(pagen[\d]+/)#is', '', $newUrl);
                                parse_str(htmlspecialcharsback($arUrl['query']), $arQuery);
                                foreach ($arQuery as $k => $v) {
                                    if (in_array($k, array('SECTION_CODE'))) {
                                        unset($arQuery[$k]);
                                    } elseif (substr($k, 0, 5)=='PAGEN') {
                                        $newUrl .= 'pagen'.intval($v).'/';
                                        unset($arQuery[$k]);
                                    }
                                }
                                $buildQuery = http_build_query($arQuery, '', '&');
                                if (strlen($buildQuery)) {
                                    $newUrl .= '?'.$buildQuery;
                                }
                            }
                            return 'href="'.$newUrl.'"';
                        }, $paging);
ob_end_clean();
echo $paging;

В данном случае, все ссылки приводим к виду pagenX

2. Создаем файл /bitrix/pagen.php вот такого содержания:

<?php
function __isPathTraversalUri($uri)
{
    if (($pos = strpos($uri, '?')) !== false) {
        $uri = substr($uri, 0, $pos);
    }
    $uri = trim($uri);
    return preg_match("#(?:/|2f|^|\\\\|5c)(?:(?:%0*(25)*2e)|\\.){2,}(?:/|%0*(25)*2f|\\\\|%0*(25)*5c|$)#i", $uri) ? true : false;
}
$newUri = preg_replace('#(pagen[\d]+/)#is', '', $_SERVER['REQUEST_URI']);
if (!__isPathTraversalUri($newUri)) {
    $_SERVER['REQUEST_URI'] = $newUri;
}

3. Настраиваем .htaccess

RewriteRule ^(.*)/pagen([\d]+)/ /$1/?PAGEN_1=$2 [L,QSA]
php_value auto_prepend_file "****/bitrix/pagen.php"
**** - ROOT_DIR

Обратите внимание! Установите свой PAGEN_ID, у меня он, например 3.

 

Еще нет коммментариев. Будь первым!

Оформить заказ в Devstages