Битрикс как сделать ссылку на следующую и предыдущую новость

В данной статье речь пойдет о том, как узнать динамические ссылки на следующую новость и предыдущую. Как вы поняли, мы будем работать на детальной странице компонента.

Как узнать ссылку на следующий или предыдущий элемент в 1С-Битрикс

Рассмотрим на примере компонента новостей — включите визуальный редактор и наведите на вашу новость на детальной странице и выберите пункт «Редактировать шаблон компонента». Лично я предпочитаю потом заходить в админку, копировать путь к файлу и работать непосредственно через FTP, а вы делайте как вам удобней, но наша цель добраться до самого конца кода.

После этого, замените в коде ниже ID вашего инфоблока (мой 45) — IBLOCK_ID:

<div class="bottom-navigation">
	<?
	$arFilter = Array("IBLOCK_ID" => 45, "ACTIVE" => "Y");
	$arSelect = Array("ID", "DETAIL_PAGE_URL");
	$ElementID = $arResult['ID'];

	$resPrev = CIBlockElement::GetList(
		Array("CREATED"=>"ASC"),
		$arFilter,
		false,
		Array('nPageSize' => 1, 'nElementID' => $ElementID),
		$arSelect
	);

	if ($ar_fields = $resPrev->GetNext()) {
		if($ElementID == $ar_fields['ID']) {
			echo "";
		} else {?>
			<a class="blogBox__link" href="<?=$ar_fields['DETAIL_PAGE_URL']?>">предыдущая запись</a>
		<?}
	}

	$resNext = CIBlockElement::GetList(
		Array("CREATED"=>"DESC"),
		$arFilter,
		false,
		Array('nPageSize' => 1, 'nElementID' => $ElementID),
		$arSelect
	);

	if ($ar_fields = $resNext->GetNext()) {
		if($ElementID == $ar_fields['ID']) {
			echo "";
		} else {?>
			<a class="blogBox__link blogBox__link_type_next" href="<?=$ar_fields['DETAIL_PAGE_URL']?>"> следующая запись</a>
		<?}
	}?>
</div>

Если вы все сделали правильно, то под новостью появятся ссылки на соседние материалы.


Важно! $ElementID = $arResult[‘ID’]; — в некоторых старых компонентах это не нужно писать, т.к. переменная $ElementID приравнивается к вызову компонента и таким образом мы получаем ID нашего элемента:

<?$ElementID = $APPLICATION->IncludeComponent("bitrix:news.detail", ... ?>

Давайте теперь не просто напишем следующая, а выведем имена этих новостей. Для этого добавим в наш массив выбранных параметров, а именно $arSelect — такой параметр как NAME:

$arSelect = Array("ID", "DETAIL_PAGE_URL", "NAME");

И наш полный код будет выглядеть следующим образом:

<div class="bottom-navigation">
	<?
	$arFilter = Array("IBLOCK_ID" => 45, "ACTIVE" => "Y");
	$arSelect = Array("ID", "DETAIL_PAGE_URL", "NAME");
	$ElementID = $arResult['ID'];

	$resPrev = CIBlockElement::GetList(
		Array("ID" => "ASC"),
		$arFilter,
		false,
		Array('nPageSize' => 1, 'nElementID' => $ElementID),
		$arSelect
	);

	if ($ar_fields_prev = $resPrev->GetNext()) {
		if($ElementID != $ar_fields_prev['ID']) {?>
			<a class="blogBox__link" href="<?=$ar_fields_prev['DETAIL_PAGE_URL']?>"><?=$ar_fields_prev['NAME']?></a>
		<?}
	}

	$resNext = CIBlockElement::GetList(
		Array("ID" => "DESC"),
		$arFilter,
		false,
		Array('nPageSize' => 1, 'nElementID' => $ElementID),
		$arSelect
	);

	if ($ar_fields_next = $resNext->GetNext()) {
		if($ElementID != $ar_fields_next['ID']) {?>
			<a class="blogBox__link blogBox__link_type_next" href="<?=$ar_fields_next['DETAIL_PAGE_URL']?>"><?=$ar_fields_next['NAME']?></a>
		<?}
	}?>
</div>

Пишите ваши комментарии или предложения о том, как можно улучшить данный код. Я не тестировал его с большим количеством рубрик, поэтому в кое-каких случаях могут быть неточности.

UPDATE: вариант, который предложил наш читатель 🙂

$arFilter = array("IBLOCK_ID" => $arResult["IBLOCK_ID"], "ACTIVE" => "Y");
if (!empty($arResult["IBLOCK_SECTION_ID"])) {
	$arFilter["IBLOCK_SECTION_ID"] = $arResult["IBLOCK_SECTION_ID"];
}
$resNav = CIBlockElement::GetList(
	array(
		$arParams['SORT_BY1'] => $arParams['SORT_ORDER1'],
		$arParams['SORT_BY2'] => $arParams['SORT_ORDER2'],
	),
	$arFilter,
	false,
	array("nPageSize" => 1, "nElementID" => $arResult["ID"]),
	array("ID", "DETAIL_PAGE_URL", "NAME")
);
$arNav = array();
while ($item = $resNav->GetNext()) {
	$arNav[] = $item;
}
if (count($arNav) > 2) {
	$arResult["NEXT"] = $arNav[0];
	$arResult["PREV"] = $arNav[2];
} else {
	if ($arNav[0]["ID"] == $arResult["ID"]) {
		$arResult["NEXT"] = false;
		$arResult["PREV"] = $arNav[1];
	} else {
		$arResult["NEXT"] = $arNav[0];
		$arResult["PREV"] = false;
	}
}

 

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

Какие услуги предоставляю:
- Создание сайтов, шаблонов и компонентов на 1С-Битрикс;
- Разработка функционала с нуля и доработка кода на уже созданных проектах;
- Адаптивная вёрстка макетов и натяжка на Битрикс;
- Парсинг файлов и выгрузка на сайт (форматы - CSV, XML, XLSX, JSON)
- Интеграции со сторонними сервисами по API;
- Многоязычные версии и многое другое.

Если у вас остались вопросы, свяжитесь со мной любым удобным для вас способом или оставьте комментарий внизу.
E-mail: dmitriyribka@gmail.com
Skype: cinemacreaterus

5 комментария

    1. Добрый день, можете указать где именно? Вроде бы код верный, проверял на одном сайте

  1. Нет никаких причин хардкодить айдишник инфоблока. Он у вас уже есть в шаблоне: $arResult[«IBLOCK_ID»]

  2. Вообще, на самом деле, GetList c параметром «nElementID» выводит отдает не один элемент, а три (предыдущий, текущий и следующий). И нет смысла писать целых два гетлиста для решения этой задачи.
    У меня получилось что-то такое: https://gist.github.com/geff21st/7f95dff3e259fd547e77e94680751b4f
    Самое сложное — это проверить граничные состояния (когда нет предыдущего, когда нет следующего). Я реализовал эту проверку через текущий элемент. Там в коде для сортировки используются параметры «sort_by1», «sort_order1». Они не предусмотрены у компонента детальной новости, но их можно определить. Либо можно их значения захардкодить.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *