• МАКС: М.Базаров
  • Телеграм: М.Базаров
  • E-mail: mihail@bazarow.ru

Битрикс как сделать фильтр для bitrix:news.list и как использовать API префильтров

Вопрос задан: 31 мая 2026 в 09:00 | Просмотров: 27 Использованные MCP инструменты: searchDocs, liveApiListComponents, liveApiFindFunction, liveApiFindByReflection, liveApiFindByNamespace, liveApiGetClassCode, liveApiGetDocResource

Задайте свой вопрос — Работает AI в связке с MCP сервером. Перепроверяйте важную информацию.

Фильтр для компонента bitrix:news.list

У компонента bitrix:news.list есть параметр FILTER_NAME. В него передаётся имя переменной (строкой), которая содержит массив с дополнительными условиями фильтрации элементов.

Как это работает:

  1. Вы задаёте в параметрах компонента FILTER_NAME = 'myFilter'.
  2. Перед вызовом компонента создаёте глобальную переменную $GLOBALS['myFilter'] с массивом фильтра.
  3. Компонент автоматически применяет этот фильтр к выборке элементов через CIBlockElement::GetList.

Пример использования на странице:

<?php
// Задаём дополнительный фильтр: только активные, 
// с кодом раздела "news", сортировка по дате
$GLOBALS['myNewsFilter'] = [
    'ACTIVE'       => 'Y',
    'SECTION_CODE' => 'news',
];
?>
<?$APPLICATION->IncludeComponent(
    "bitrix:news.list",
    "",
    [
        "IBLOCK_ID"   => 2,
        "FILTER_NAME" => "myNewsFilter",
        "NEWS_COUNT"  => 10,
        "SORT_BY1"    => "ACTIVE_FROM",
        "SORT_ORDER1" => "DESC",
        "CACHE_TYPE"  => "A",
        "CACHE_TIME"  => 3600,
    ]
);?>

Доступные ключи фильтра — это поля элемента инфоблока (ACTIVE, NAME, CODE, ID, SECTION_ID, IBLOCK_SECTION_ID, ACTIVE_FROM и др.), а также свойства с префиксом PROPERTY_.

Пример фильтрации по свойству:

$GLOBALS['myNewsFilter'] = [
    '=PROPERTY_AUTHOR_VALUE' => 42,
];

Обратите внимание: для точного соответствия используйте оператор = (без него будет LIKE, что медленнее).

API префильтров (ActionFilter) в D7 Engine

Термин "префильтры" (prefilters) в Битрикс относится к ActionFilter — механизму контроллеров D7 Engine (пространство имён \Bitrix\Main\Engine\ActionFilter).

Префильтры выполняются до запуска действия контроллера и могут отменить его выполнение. Постфильтры (postfilters) выполняются после и могут изменить результат.

Основные встроенные префильтры:

  • \Bitrix\Main\Engine\ActionFilter\Authentication — проверка авторизации.
  • \Bitrix\Main\Engine\ActionFilter\HttpMethod — ограничение по HTTP-методу (GET/POST).
  • \Bitrix\Main\Engine\ActionFilter\Csrf — защита от CSRF.
  • \Bitrix\Main\Engine\ActionFilter\CloseSession — закрытие сессии до выполнения.
  • \Bitrix\Main\Engine\ActionFilter\Scope — ограничение по контексту (AJAX / REST).
  • \Bitrix\Main\Engine\ActionFilter\ContentType — проверка Content-Type.
  • \Bitrix\Main\Engine\ActionFilter\Cors — CORS-заголовки (обычно как постфильтр).

Как задать префильтры в контроллере:

<?php
namespace My\Module\Controller;

use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\ActionFilter;

class User extends Controller
{
    // Префильтры по умолчанию для ВСЕХ действий
    protected function getDefaultPreFilters(): array
    {
        return [
            new ActionFilter\Authentication(),
            new ActionFilter\HttpMethod([
                ActionFilter\HttpMethod::METHOD_POST,
            ]),
            new ActionFilter\Csrf(),
        ];
    }

    // Настройка фильтров для конкретных действий (дополнение/вычитание)
    public function configureActions(): array
    {
        return [
            'publicInfo' => [
                '-prefilters' => [
                    Authentication::class,  // убираем проверку авторизации
                ],
            ],
        ];
    }

    public function likeAction(int $likedUserId): array
    {
        // логика действия
        return ['success' => true];
    }

    public function publicInfoAction(): array
    {
        // доступно без авторизации
        return ['info' => 'public data'];
    }
}

Дополняющие и вычитающие фильтры (работают через ключи +prefilters / -prefilters):

public function configureActions(): array
{
    return [
        'index' => [
            '+prefilters' => [
                new ActionFilter\CloseSession(),   // добавить
            ],
            '-prefilters' => [
                ActionFilter\Authentication::class, // убрать
            ],
        ],
    ];
}

Создание собственного префильтра:

<?php
namespace My\Module\ActionFilter;

use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\Engine\ActionFilter\Base;

class MyCustomFilter extends Base
{
    public function onBeforeAction(Event $event): ?EventResult
    {
        if (!someCondition())
        {
            $this->addError(new \Bitrix\Main\Error('Доступ запрещён'));
            return new EventResult(EventResult::ERROR, null, null, $this);
        }
        return null; // пропускаем
    }

    public function onAfterAction(Event $event): ?EventResult
    {
        // можно подменить результат
        return null;
    }
}

Используйте префильтры в контроллерах для валидации, авторизации и проверок — это делает код модульным и переиспользуемым.