Фильтр для компонента bitrix:news.list
У компонента bitrix:news.list есть параметр FILTER_NAME. В него передаётся имя переменной (строкой), которая содержит массив с дополнительными условиями фильтрации элементов.
Как это работает:
- Вы задаёте в параметрах компонента
FILTER_NAME = 'myFilter'. - Перед вызовом компонента создаёте глобальную переменную
$GLOBALS['myFilter']с массивом фильтра. - Компонент автоматически применяет этот фильтр к выборке элементов через
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;
}
}
Используйте префильтры в контроллерах для валидации, авторизации и проверок — это делает код модульным и переиспользуемым.