Задача:
В CMS битрикс для текущего товара получить ссылки на предыдущий и следующий элемент (по id
).
Решение:
Можно воспользоваться параметром arNavStartParams
метода CIBlockElement::GetList
. Т.е. в четвёртый аргумент CIBlockElement::GetList
передаём в параметр nElementID
id
элемента, для которого нужно найти соседей. Чтобы он нашел только одного соседа сверху и снизу ограничиваем выборку параметром nPageSize
.
При этом нужно выполнить следующие указания, чтобы метод сработал:
- 3-ий аргумент(
arGroupBy
) методаGetList
должен быть равенfalse
. - Последний аргумент(
arSelectFields
) методаGetList
должен содержатьID
. - Должна быть задана сортировка по
ID
.
Нюансы результата выборки:
- Если
ID
, для которого ищутся соседи, последний, то сосед сверху будет отсутствовать. - Сортировка по
"catalog_*"
учитываться не будет. - В результате метода добавится поле
RANK
(порядковый номер элемента в «полной» выборке).
Реализация:
<?php // id инфоблока $IBLOCK_ID = 1; // id элемента для которого ищем соседей $ID = 31; $query = CIBlockElement::GetList(array('ID' => 'ASC'), array( 'IBLOCK_ID' => $IBLOCK_ID, 'ACTIVE' => 'Y', 'SECTION_GLOBAL_ACTIVE' => 'Y'), false, array('nPageSize' => 1, 'nElementID' => $ID), array('ID', 'DETAIL_PAGE_URL') ); while($elem = $query->GetNextElement()){ $arFields = $elem->GetFields(); var_dump($arFields['RANK']); var_dump($arFields['ID']); var_dump($arFields['DETAIL_PAGE_URL']); } ?>
Результат:
Если использовать данный код в шаблоне детальной страницы в комплексном компоненте, то вместо $ID
нужно передавать $arResult['ID']
и поместить весь код в файл result_modifier.php
рабочего шаблона детальной страницы.
Для чего это может понадобиться: данный приём можно использовать для SEO оптимизации сайта, как вариант для внутренней перелинковки.
Спасибо за статью, а что вернет код, если это последний id?
Думала как раз внедрить такую линковку в карточке товара.
Если текущий элемент крайний снизу или сверху, возвращается два элемента: соответственно, один элемент — текущий и еще один соседний, либо справа, либо слева. Для последнего сначала вернется предыдущий, потом текущий.
Недавно думал, как эти две ситуации можно изящно обработать, все равно получилась куча условий.