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

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

349
28.01.2018

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

Необходимо внести правки в результирующем массиве шаблона компонента, выводящего список элементов (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"]++;
}


Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

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

Добавить комментарий

captcha

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