Потихоньку допиливаю сайт по фотообоям — на этот раз опишу процесс внедрения постраничной навигации в свою компоненту.
На сайт в некоторых категориях более тысячи изображений для фотообоев — без пагинации тут не обойтись.
Сразу покажу что получилось, а потом немного подробностей
Какие задачи ставились для пагинации
1. ЧПУ ссылки вида https://dekorimage.ru/3D-foto-oboi/stereoskopicheskie/page5/ без стандартного битриксовского ?PAGEN_1=5
2. AJAX обновление пагинации — при нажатии «показать ещё» страничка в пагинации так же должна перескакивать на следующую страничку
Первое реализуется с помощью буферизации вывода компонента bitrix:system.pagenavigation (за основу взял шаблон round) и замены ссылок формата PAGEN_1 на нужные нам ЧПУ ссылки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Сформируем html для вывода постранички $navResult = »; $total = $arResult[«CNT»]; $per_page = $arParams[«COUNT»]; $page = $arParams[«PAGE»]; if ($total > 0) { $dbResult = new CDBResult(); $dbResult->NavPageCount = ceil($total / $per_page); $dbResult->NavPageNomer = $page; $dbResult->NavNum = 1; $dbResult->NavPageSize = $per_page; $dbResult->NavRecordCount = $total; ob_start(); $APPLICATION->IncludeComponent(‘bitrix:system.pagenavigation’, ‘foto-oboi’, array( ‘NAV_RESULT’ => $dbResult, )); $navResult = @ob_get_clean(); } //уберём /page2/ -> / $navResult = str_replace(‘/page’.$page.‘/’, ‘/’, $navResult); //меняем /?PAGEN_1=3 на /page3/ if(preg_match_all(‘!PAGEN_1=(\d+)»!’, $navResult, $match)) { foreach($match[1] as $curpage) { $search = ‘/?PAGEN_1=’.$curpage.‘»‘; $replace = ‘/page’.$curpage.‘/»‘; $navResult = str_replace($search, $replace, $navResult); } } |
Для реализации второго — параметры $total $per_page и $page передаются в такой же скрипт но уже AJAX запросом.
Для обработки AJAX запроса в компонент я добавил полную очистку буфера вывода
1 2 3 4 |
<? if($_POST[«ajax»]==«Y») { $GLOBALS[‘APPLICATION’]->RestartBuffer(); .... |
В принципе из интересного всё — остальное дело техники.
И ещё момент — чтобы AJAX скрипт формировал правильный адрес, в компонент я передаю BASE_LINK
1 2 3 4 |
$APPLICATION->IncludeComponent(‘bitrix:system.pagenavigation’, ‘foto-oboi’, array( ‘NAV_RESULT’ => $dbResult, ‘BASE_LINK’ => $_SERVER[«SCRIPT_URL»] )); |