Реализация с помощью компонента news.line
Чтобы не городить лишний компонент с нуля, просто воспользуемся штатным компонентом news.line. Он уже умеет выводить все нужные данные, нам остается только передать в него ID нужных элементов.
Описываю на примере компонента новостей, но ровно точно так же можно воспроизвести в компоненте каталога.
Открываем на редактирование файл element.php (как раз и отвечает за вывод детального просмотра новости) в шаблоне компонента news и добавляем в него вызов news.line:
$ElementID = $APPLICATION->IncludeComponent(
'bitrix:news.detail',
'new_detail',
Array(
// Параметры компонента news.detail
),
$component
);
$APPLICATION->IncludeComponent(
"mibazarow:news.line",
"prev_next",
[
"ELEMENT_ID" => $ElementID,
"IBLOCK_TYPE" => $arParams["IBLOCK_TYPE"],
"IBLOCKS" => [
0 => $arParams["IBLOCK_ID"],
],
"NEWS_COUNT" => "2",
"FIELD_CODE" => [
0 => "NAME",
1 => "PREVIEW_TEXT",
2 => "PREVIEW_PICTURE",
3 => "",
],
"SORT_BY1" => "ACTIVE_FROM",
"SORT_ORDER1" => "DESC",
// Остальные настройки news.line
],
$component
);
Обратите внимание, это не совсем штатный компонент, а вынесенный в свое пространство имен. Нам нужно модифицировать его работу, чтобы решить задачу.
Самое главное, в параметры этого компонента мы передаем ID текущего элемента из $ElementID, так как для
него нужно будет искать соседей
$ElementID также есть в компоненте каталога. Если в вашем шаблоне не доступен, реализуйте через
получение $arResult компонента детального просмотра. Подсмотреть как это сделать можно тут, в последнем примере
Фильтр на последнем
уровне
Свой компонент из штатного
Копируем штатный компонент news.line в свое пространство имен вида /local/components/mibazarow.
И закидываем туда компонент из этого архива:
news.line
Все модификации компонента прокомментировал в файле component.php.
Компонент выполняет запросы с использованием LIMIT 1 относительно элемента переданного в $arParams['ELEMENT_ID']
по переданной сортировке из параметров компонента (учитывает только SORT_BY1 и SORT_ORDER1):
- Получение текущего элемента - извлекаем значение поля сортировки (например, ACTIVE_FROM)
- При DESC сортировке: ищем элементы с большим значением поля, сортируем по ASC и берем первый
- При ASC сортировке: ищем элементы с меньшим значением, сортируем по DESC и берем первый
- При DESC: элементы с меньшим значением поля сортировки
- При ASC: элементы с большим значением поля сортировки