Стандартный компонент bitrix:news.list по умолчанию показывает только активные элементы инфоблока. Однако в некоторых ситуациях необходимо отображать все записи, включая деактивированные — например, при предварительном просмотре, в административных разделах или для определённых групп пользователей. В этой статье рассмотрим два эффективных способа решения этой задачи.
Почему news.list не показывает неактивные элементы?
По умолчанию в компоненте установлен внутренний фильтр "ACTIVE" => "Y". Это сделано для того, чтобы на публичной части сайта случайно не отображались черновики, архивные или временно скрытые материалы. Однако эту настройку можно переопределить с помощью параметра FILTER_NAME.
Вариант 1: Отключение фильтрации по активности
Этот способ полностью отключает проверку активности элементов. В фильтре мы указываем пустое значение для поля ACTIVE, что означает "не фильтровать по этому полю".
Код для размещения перед вызовом компонента:
<?php
// Создаем глобальный фильтр
global $arrFilterAllElements;
$arrFilterAllElements = array(
"ACTIVE" => "", // Пустое значение отключает фильтрацию
);
?>
Настройки компонента:
<?php
$APPLICATION->IncludeComponent(
"bitrix:news.list",
"ваш_шаблон",
array(
"FILTER_NAME" => "arrFilterAllElements", // Указываем имя нашего фильтра
// остальные параметры компонента...
)
);
?>
Вариант 2: Явное указание всех статусов
Более явный способ — указать, что нас интересуют элементы со статусами и "Y" (активен), и "N" (не активен). Этот подход понятнее для других разработчиков и позволяет при необходимости легко модифицировать фильтр.
Код для размещения перед вызовом компонента:
<?php
global $arrFilterBothStatuses;
$arrFilterBothStatuses = array(
"ACTIVE" => array("Y", "N"), // Явно указываем оба статуса
);
?>
Настройки компонента:
<?php
$APPLICATION->IncludeComponent(
"bitrix:news.list",
"ваш_шаблон",
array(
"FILTER_NAME" => "arrFilterBothStatuses",
// остальные параметры...
)
);
?>
Важные технические нюансы
1. Производительность
Оба способа снимают ограничение по активности, что означает:
- Увеличение количества обрабатываемых записов — база данных будет выбирать больше строк
- Возможное замедление работы на инфоблоках с большим количеством элементов (десятки тысяч)
- Рекомендация: всегда используйте пагинацию (
"DISPLAY_TOP_PAGER" => "Y", "DISPLAY_BOTTOM_PAGER" => "Y") и ограничивайте количество элементов на странице ("NEWS_COUNT")
2. Дополнительные условия фильтра
Если у вас уже есть собственный фильтр, можно просто добавить к нему условие по активности:
<?php
global $arrFilterCustom;
$arrFilterCustom = array(
"PROPERTY_CATEGORY" => 25, // Ваше существующее условие
"ACTIVE" => array("Y", "N"), // Добавляем условие по активности
);
?>
3. Уникальные имена фильтров
Используйте уникальные имена для фильтров (как в примерах выше — $arrFilterAllElements, $arrFilterBothStatuses), чтобы избежать конфликтов с другими компонентами на странице.
4. Кеширование
При использовании такого фильтра компонент будет кешировать результат отдельно от стандартного вызова. Убедитесь, что параметр CACHE_TIME установлен адекватно вашим потребностям.
Когда использовать каждый из способов?
| Вариант |
Когда использовать |
Особенности |
| Вариант 1 (ACTIVE => "") |
Когда нужно полностью отключить фильтрацию по активности, не задумываясь о статусах |
Более универсальный, работает быстрее на очень больших выборках |
| Вариант 2 (ACTIVE => array("Y", "N")) |
Когда важно явно указать, какие статусы нас интересуют |
Прозрачнее для понимания, позволяет легче модифицировать в будущем |
Альтернативный подход
Если вам нужно показывать неактивные элементы только определённым группам пользователей (например, редакторам), можно добавить проверку прав:
<?php
global $arrFilter;
if ($USER->IsAuthorized() && $USER->IsAdmin()) {
$arrFilter = array("ACTIVE" => array("Y", "N"));
} else {
$arrFilter = array("ACTIVE" => "Y");
}
?>
Заключение и рекомендации
Оба представленных способа эффективно решают задачу отображения всех элементов инфоблока. Для большинства случаев достаточно Варианта 1 — он проще и быстрее. Вариант 2 стоит использовать, когда важна максимальная прозрачность кода или когда возможны дальнейшие модификации фильтра.
Важно: После применения этих методов обязательно проверьте, как работает пагинация, сортировка и дополнительные свойства элементов.
Для проектов, где регулярно требуется работа с большими объёмами данных и нестандартными выборками, важно иметь качественную инфраструктуру. Оптимальная работа компонентов Битрикс во многом зависит от производительности сервера и правильно настроенной базы данных. Например, при использовании FirstVDS с промокодом 6481180955 можно получить не только надежный хостинг, но и дополнительные ресурсы для обработки сложных запросов, что особенно актуально при работе с фильтрами, затрагивающими тысячи записей.
Стандартный компонент
bitrix:news.listпо умолчанию показывает только активные элементы инфоблока. Однако в некоторых ситуациях необходимо отображать все записи, включая деактивированные — например, при предварительном просмотре, в административных разделах или для определённых групп пользователей. В этой статье рассмотрим два эффективных способа решения этой задачи.Почему news.list не показывает неактивные элементы?
По умолчанию в компоненте установлен внутренний фильтр
"ACTIVE" => "Y". Это сделано для того, чтобы на публичной части сайта случайно не отображались черновики, архивные или временно скрытые материалы. Однако эту настройку можно переопределить с помощью параметраFILTER_NAME.Вариант 1: Отключение фильтрации по активности
Этот способ полностью отключает проверку активности элементов. В фильтре мы указываем пустое значение для поля
ACTIVE, что означает "не фильтровать по этому полю".Код для размещения перед вызовом компонента:
Настройки компонента:
Вариант 2: Явное указание всех статусов
Более явный способ — указать, что нас интересуют элементы со статусами и "Y" (активен), и "N" (не активен). Этот подход понятнее для других разработчиков и позволяет при необходимости легко модифицировать фильтр.
Код для размещения перед вызовом компонента:
Настройки компонента:
Важные технические нюансы
1. Производительность
Оба способа снимают ограничение по активности, что означает:
"DISPLAY_TOP_PAGER" => "Y","DISPLAY_BOTTOM_PAGER" => "Y") и ограничивайте количество элементов на странице ("NEWS_COUNT")2. Дополнительные условия фильтра
Если у вас уже есть собственный фильтр, можно просто добавить к нему условие по активности:
3. Уникальные имена фильтров
Используйте уникальные имена для фильтров (как в примерах выше —
$arrFilterAllElements,$arrFilterBothStatuses), чтобы избежать конфликтов с другими компонентами на странице.4. Кеширование
При использовании такого фильтра компонент будет кешировать результат отдельно от стандартного вызова. Убедитесь, что параметр
CACHE_TIMEустановлен адекватно вашим потребностям.Когда использовать каждый из способов?
Альтернативный подход
Если вам нужно показывать неактивные элементы только определённым группам пользователей (например, редакторам), можно добавить проверку прав:
Заключение и рекомендации
Оба представленных способа эффективно решают задачу отображения всех элементов инфоблока. Для большинства случаев достаточно Варианта 1 — он проще и быстрее. Вариант 2 стоит использовать, когда важна максимальная прозрачность кода или когда возможны дальнейшие модификации фильтра.
Важно: После применения этих методов обязательно проверьте, как работает пагинация, сортировка и дополнительные свойства элементов.
Для проектов, где регулярно требуется работа с большими объёмами данных и нестандартными выборками, важно иметь качественную инфраструктуру. Оптимальная работа компонентов Битрикс во многом зависит от производительности сервера и правильно настроенной базы данных. Например, при использовании FirstVDS с промокодом 6481180955 можно получить не только надежный хостинг, но и дополнительные ресурсы для обработки сложных запросов, что особенно актуально при работе с фильтрами, затрагивающими тысячи записей.