Битрикс выводить случайный элемент, кроме текущего
Иногда в 1С-Битрикс нужно вывести случайные элементы через компонент
bitrix:news.list, но исключить из выборки текущий элемент.
Например, на детальной странице можно показать блок:
- похожие материалы;
- другие сотрудники;
- партнеры;
- случайные товары;
- элементы из этого же инфоблока.
При этом текущий элемент в списке выводить не нужно.
Создаем глобальный фильтр
Перед вызовом компонента создаем глобальный фильтр:
$GLOBALS["myFilter"] = array(
"!ID" => $arResult["ID"]
);
Здесь:
!ID— исключить элемент по ID;$arResult["ID"]— ID текущего элемента.
Подключаем фильтр в компоненте
В параметрах компонента указываем:
"FILTER_NAME" => "myFilter",
После этого bitrix:news.list
будет использовать наш фильтр
и исключит текущий элемент из выборки.
Случайная сортировка элементов
Для вывода случайных элементов используем сортировку:
"SORT_BY1" => "RAND",
"SORT_ORDER1" => "RAND",
В результате компонент будет выбирать элементы в случайном порядке.
Полный пример вызова компонента
<?
$GLOBALS["myFilter"] = array(
"!ID" => $arResult["ID"]
);
$APPLICATION->IncludeComponent(
"bitrix:news.list",
"partners-detail",
array(
"ACTIVE_DATE_FORMAT" => "d.m.Y",
"ADD_SECTIONS_CHAIN" => "N",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "Y",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"CHECK_DATES" => "Y",
"DETAIL_URL" => "",
"DISPLAY_BOTTOM_PAGER" => "N",
"DISPLAY_DATE" => "N",
"DISPLAY_NAME" => "Y",
"DISPLAY_PICTURE" => "Y",
"DISPLAY_PREVIEW_TEXT" => "N",
"DISPLAY_TOP_PAGER" => "N",
"FIELD_CODE" => array(
0 => "",
1 => "",
),
"FILTER_NAME" => "myFilter",
"HIDE_LINK_WHEN_NO_DETAIL" => "N",
"IBLOCK_ID" => "11",
"IBLOCK_TYPE" => "partners",
"INCLUDE_IBLOCK_INTO_CHAIN" => "N",
"INCLUDE_SUBSECTIONS" => "Y",
"MESSAGE_404" => "",
"NEWS_COUNT" => "4",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => ".default",
"PAGER_TITLE" => "Новости",
"PARENT_SECTION" => "",
"PARENT_SECTION_CODE" => "",
"PREVIEW_TRUNCATE_LEN" => "",
"PROPERTY_CODE" => array(
0 => "",
1 => "",
),
"SET_BROWSER_TITLE" => "N",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "N",
"SET_META_KEYWORDS" => "N",
"SET_STATUS_404" => "N",
"SET_TITLE" => "N",
"SHOW_404" => "N",
"SORT_BY1" => "RAND",
"SORT_BY2" => "SORT",
"SORT_ORDER1" => "RAND",
"SORT_ORDER2" => "ASC",
"STRICT_SECTION_CHECK" => "N",
"COMPONENT_TEMPLATE" => "sotrudniki_detail"
),
false
);
?>
Где использовать такой код
Такой подход удобно использовать:
- на детальной странице новости;
- в карточке товара;
- на странице сотрудника;
- в блоке «Похожие материалы»;
- в блоке «Другие элементы»;
- в блоке «Читайте также».
Важный момент про кеширование
При использовании случайной сортировки нужно учитывать кеш компонента.
Если кеш включен, случайные элементы могут обновляться только после очистки кеша или истечения времени кеширования.
Поэтому для действительно случайной выборки можно:
- уменьшить время кеширования;
- отключить кеш для блока;
- или использовать дополнительную логику обновления кеша.
Итог
Чтобы вывести случайные элементы
в bitrix:news.list
и исключить текущий элемент,
достаточно создать глобальный фильтр:
$GLOBALS["myFilter"] = array(
"!ID" => $arResult["ID"]
);
И передать его в компонент:
"FILTER_NAME" => "myFilter",
Комментарии