Фильтры в Битриксе
2011.12.26
Сегодня, после года практики в Битриксе мне открылось поистине тайное знание.
Когда передаёшь в компонент имя переменной-фильтра через
'FILTER_NAME'
, Битрикс ожидает имя глобально доступной переменной. Там
прямо в исходниках любого компонента можно увидеть вызов
global ${$arParams['FILTER_NAME']}
или, во всяком случае, аналог этого кода. А раз используется поиск
переменной средствами ключевого слова global
, то без шаманства можно
забыть о таких интересных вещах, как динамическая генерация фильтра
внутри объектов классов или вообще внутри любого lexical scope,
отличающегося от глобального.
Сегодня же до меня дошёл смысл этого global
. Фильтр надо просто
сохранять как элемент массива $GLOBALS
, вместе со всеми остальными
глобальными переменными. Это, по-видимому, самый надёжный способ
генерировать фильтр и передавать его имя в компонент.
Следующие две инструкции могут быть теперь вообще где угодно, как угодно глубоко внутри иерархии классов и/или стека вызовов:
$GLOBALS['similar_items'] = array(
'=EXTERNAL_ID' => getSimilarItems($arResult)
);
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
Array(
...
"FILTER_NAME" => 'similar_items',
...
)
);
Я знаю, вы всегда мечтали хранить временные данные в глобальной области видимости, не правда ли?
Пиздец.