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

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

Как узнать ссылку на следующий или предыдущий элемент в 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 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

5 коментаря

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

Залишити коментар до Dmitriy Скасувати коментар