В данной статье речь пойдет о том, как узнать динамические ссылки на следующую новость и предыдущую. Как вы поняли, мы будем работать на детальной странице компонента.
Как узнать ссылку на следующий или предыдущий элемент в 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; } }
У вас обе ссылки на следующую новость
Добрый день, можете указать где именно? Вроде бы код верный, проверял на одном сайте
Нет никаких причин хардкодить айдишник инфоблока. Он у вас уже есть в шаблоне: $arResult[“IBLOCK_ID”]
Полностью с вами согласен, так и нужно делать. Никакого хардкода
Вообще, на самом деле, GetList c параметром “nElementID” выводит отдает не один элемент, а три (предыдущий, текущий и следующий). И нет смысла писать целых два гетлиста для решения этой задачи.
У меня получилось что-то такое: https://gist.github.com/geff21st/7f95dff3e259fd547e77e94680751b4f
Самое сложное – это проверить граничные состояния (когда нет предыдущего, когда нет следующего). Я реализовал эту проверку через текущий элемент. Там в коде для сортировки используются параметры “sort_by1”, “sort_order1”. Они не предусмотрены у компонента детальной новости, но их можно определить. Либо можно их значения захардкодить.