Разные шаблоны пагинации для одного списка элементов

Иногда бывает необходимость показать над списком элементов и под списком элементов абсолютно разных шаблонов постраничной нумерации. В настройках компонента списка элементов можно передать только один шаблон, но это не проблема. Всегда можно передать второй (и более) шаблон в компонент.

Необходимо внести правки в результирующем массиве шаблона компонента, выводящего список элементов (catalog.section или news.list). Для этого открываем файл result_modifier.php и в нем пишем:

$arResult['NAV_STRING_TOP'] = $arResult['NAV_RESULT']->GetPageNavStringEx(
	$navComponentObject,
	$arParams['PAGER_TITLE'],
	"catalog_pagenavigation_top",
	$arParams['PAGER_SHOW_ALWAYS'],
	$this->__component,
	$arResult['NAV_PARAM']
);

Таким образом, добавляем в результирующий массив ключ для хранения верхней навигационной панели, с нужным нам шаблоном пагинации (catalog_pagenavigation_top, в данном случае). Передаем в компонент заданный в настройках заголовок для пагинации, нужный шаблон, параметры и привязку к родительскому компоненту.

Остается только проработать шаблоны пагинации и можно радоваться!

P.S. Если хотите сделать пагинацию вида /page-#/ вместо стандартного убожества в виде ?PAGEN_1=#, нужно настроить корректный отлов полученной страницы.

Самая простая часть - это в шаблоне компонента пагинации настроить вывод url в нужном формате. Вот так, к примеру, получаются ссылки на предыдущую и следующую страницы:

$curPage = $arResult['NavPageNomer'];
$arResult['sUrlPath'] = str_replace('/page='.$curPage,'',$arResult['sUrlPath']); // удаляем параметр со страницей, если он уже есть
$arResult['NavQueryString'] = str_replace('filter=Y','',$arResult['NavQueryString']); // тут, если нужно, убираем неугодные параметры

// строим ссылки на предыдущую и следующую страницы:
if($curPage==1){
	$arResult['PREV_PAGE_NUM'] = false;
	$arResult['PREV_PAGE_URL'] = false;
} elseif ($curPage==2){
	$arResult['PREV_PAGE_NUM'] = 1;
	$arResult['PREV_PAGE_URL'] = $arResult["sUrlPath"];
} else {
	$arResult['PREV_PAGE_NUM'] = $curPage - 1;
	$arResult['PREV_PAGE_URL'] = $arResult["sUrlPath"].'page='.$arResult["PREV_PAGE_NUM"].'/';
}

if($curPage>=$arResult['NavPageCount']){
	$arResult['NEXT_PAGE_NUM'] = false;
	$arResult['NEXT_PAGE_URL'] = false;
} else {
	$arResult['NEXT_PAGE_NUM'] = $curPage + 1;
	$arResult['NEXT_PAGE_URL'] = $arResult["sUrlPath"].'page='.$arResult["NEXT_PAGE_NUM"].'/';
}

if(strlen($arResult['NavQueryString'])>0){
	if($arResult['PREV_PAGE_URL'])
		$arResult['PREV_PAGE_URL'] .= '?'.$arResult['NavQueryString'];
	else
		if($arResult['NEXT_PAGE_URL'])
			$arResult['NEXT_PAGE_URL'] .= '?'.$arResult['NavQueryString'];
}

Сложнее дело обстоит с определением того, какая сейчас страница перед выводом списка элементов. Вся сложность связана с тем, что параметр, в котором хранится текущий номер страницы может быть PAGEN_1, PAGEN_2 ... и так до бесконечности - сколько компонентов со списком выведено на странице уже, столько и будет. Для того, чтобы определить, в какой переменной хранится текущий номер пагинации, можно воспользоваться следующим кодом:

global $NavNum; // номер пагинации предыдущего списка элементов
$NextNavNum = (int)$NavNum + 1; // это номер пагинации следующего списка (нашего)
$NavName = 'PAGEN_'.$NextNavNum;
global ${$NavName}; // глобальная переменная, в которую нужно положить номер страницы
${$NavName} = (int)$pageNum;

Таким образом, мы передадим в компоненты значение номера пагинации, хранящегося в переменной $pageNum (считывание данного значения из url оставлю вам на самостоятельный разбор - универсального варианта пока не придумал).

P.P.S. Если на странице выводятся две выборки, например, по инфоблокам (3 компонента) и при этом постраничный контент для каждого блока загружается отдельно Аяксом, то возникает проблема с переменной PAGEN_(N), где (N) - номер постраничной навигации на общей странице. В первом случае это, ну скажем, - 3 (третий компонент на странице), а в частном случае - это 1 (первый и единственный компонент на отдельной странице).

Для решения этой задачи можно модифицировать глобальную переменную $GLOBALS["NavNum"]. Как один из вариантов, при условии что AJAX подгружается методом POST и на странице 2 компонента, в файле с вызовом второго компонента пишем:

if ($_SERVER['REQUEST_METHOD'] == "POST") {
   $GLOBALS["NavNum"]++;
}
Количество показов: 5976
28.01.2018

Возврат к списку

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

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