В Битрикс фильтр — это обычный ассоциативный массив, который склеивается с базовым $arFilter компонента и уходит в CIBlockElement::GetList (или в ORM). Большинство багов «почему не нашлось» — не в SQL, а в синтаксисе ключей: пустое значение, отрицание, свойства и даты пишутся по-разному.
Ниже — рабочие паттерны для news.list / каталога и коротко — как то же самое выглядит в D7.
FILTER_NAME в news.list
Компонент сам не знает ваш бизнес-фильтр. Перед вызовом кладёте массив в $GLOBALS, а в параметрах указываете имя:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $GLOBALS['arrFilter'] = [ 'ACTIVE' => 'Y', 'PROPERTY_BEST_VALUE' => 'да', ]; ?> <?$APPLICATION->IncludeComponent( 'bitrix:news.list', '', [ 'IBLOCK_ID' => 12, 'FILTER_NAME' => 'arrFilter', // ... ] );?> |
Внутри компонента это примерно array_merge($arFilter, $GLOBALS[$arParams['FILTER_NAME']]). Имя может быть любым — главное, чтобы оно совпадало с ключом в $GLOBALS.
Пустые и непустые свойства
Для строковых/списочных свойств «пусто» в фильтре инфоблока — это false, а не пустая строка:
|
1 2 3 4 5 |
// только элементы БЕЗ цены типа 2 $filter = ['CATALOG_PRICE_2' => false]; // только элементы С заполненной ценой типа 2 $filter = ['!CATALOG_PRICE_2' => false]; |
Префикс ! — отрицание условия. То же работает для свойств: '!PROPERTY_CODE' => false значит «свойство не пустое».
Частые операторы в ключе
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$filter = [ 'IBLOCK_ID' => 12, '>=DATE_ACTIVE_FROM' => ConvertTimeStamp(false, 'FULL'), '%NAME' => 'скидка', // подстрока 'PROPERTY_COLOR' => [12, 15], // IN '!PROPERTY_STATUS' => 'archive', [ 'LOGIC' => 'OR', ['PROPERTY_HIT' => 'Y'], ['PROPERTY_NEW' => 'Y'], ], ]; |
Логику OR/AND задают вложенные массивы с ключом LOGIC. Без него условия на одном уровне склеиваются через AND.
Свойства: код vs ID
В фильтре можно писать и PROPERTY_CODE, и PROPERTY_123. Код читаемее; ID стабильнее при переносах между стендами, если коды разъехались. Для множественных свойств значение часто передают массивом.
|
1 2 3 4 5 |
// по коду ['PROPERTY_BRAND' => 'nike']; // по ID свойства ['PROPERTY_45' => 100]; |
Тот же фильтр в D7
В ORM инфоблока синтаксис ближе к SQL, но идея та же — явные условия вместо «магии» компонента:
|
1 2 3 4 5 6 7 8 9 10 11 |
use Bitrix\Iblock\Elements\ElementProductsTable; $rows = ElementProductsTable::getList([ 'select' => ['ID', 'NAME', 'BEST_VALUE_' => 'BEST_VALUE'], 'filter' => [ '=ACTIVE' => 'Y', '=BEST_VALUE.VALUE' => 'да', '!PRICE.VALUE' => false, ], 'limit' => 50, ])->fetchAll(); |
Имена полей зависят от API вашего инфоблока (сгенерированный класс элемента vs ElementTable). Перед продом сверьте схему на стенде.
Типичные ошибки
''вместоfalseдля «пустого» свойства — выборка пустая или наоборот слишком широкая.- Фильтр положили в
$arrFilter, а в компонентеFILTER_NAMEдругой. - Фильтруете по символьному коду раздела, а в инфоблоке нужен
SECTION_ID/SECTION_CODEс учётомINCLUDE_SUBSECTIONS. - Кэш компонента не сбрасывается после смены фильтра в коде — на время отладки отключите кеш или смените
CACHE_TIME.
Связка с событиями
Если фильтр «собирается» из нескольких модулей, не размазывайте его по шаблонам. Соберите массив в одном месте (init.php, свой сервис) или подпишитесь на событие подготовки параметров компонента. Подробный разбор подписок — в гайде Bitrix D7 EventManager и обзоре событий AddEventHandler / EventManager.
Итог
Сначала зафиксируйте контракт фильтра: какие поля, какие операторы, что значит «пусто». Потом подключайте его через FILTER_NAME или ORM. Так проще тестировать и не ломать выдачу правками в шаблоне.
