image

Всем привет! Сегодня поговорим про то, как получить ссылку на следующий и предыдущий элемент в битриксе. Это достаточно частая задача и используется для перелинковки на сайте (SEO), а также для удобства пользователя. Можно ли получить эти ссылки с помощью стандартного api? Ответ — можно, но не совсем.

1. Используем стандартный способ от битрикса

Например, воспользоваться параметром arNavStartParams метода GetList класса CIBlockElement. То есть четвертым аргументом в CIBlockElement::GetList передать параметр nElementID - id элемента, для которого нужно найти соседей. Чтобы найти только одного соседа сверху или снизу ограничиваем выборку параметром nPageSize.
При этом нужно выполнить следующие указания, чтобы метод сработал:

  • 3-ий аргумент(arGroupBy) метода GetList должен быть равен false.
  • Последний аргумент(arSelectFields) метода GetList должен содержать ID.
  • Сортировку задаем по ID, либо по тому полю, по которому хотим получить соседей.

Нюансы результата выборки:

  • Если элемент,  для которого ищутся соседи, последний, то сосед сверху будет отсутствовать, а если первый, то сосед снизу будет отсутствовать.
  • Сортировка по "catalog_*" учитываться не будет.
  • В результате метода добавится поле RANK(порядковый номер элемента в «полной» выборке).

Реализация:

2. Функция нахождения ссылок на следующий и предыдущий элемент

Если честно мне этот способ не очень нравится, так как хотелось бы иметь круговой механизм ссылок. То есть если элемент первый в выборке, то слева от него должен быть последний, а если он последний то справа должен быть первый.

Поэтому я написал небольшую функцию решающую данную проблему. Возможно она не очень изящная с точки зрения программирования, но главное, что работает. Привожу код:

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