Сегодня, после года практики в Битриксе мне открылось поистине тайное знание.
Когда передаёшь в компонент имя переменной-фильтра через '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',
...
)
);
Я знаю, вы всегда мечтали хранить временные данные в глобальной области видимости, не правда ли?
Пиздец.