Добрый день!
Сегодня пришлось разбираться с взаимодействием между компонентами «bitrix:catalog.smart.filter» и «bitrix:catalog.section» в комплексном компоненте «bitrix:catalog», что находится по пути "/bitrix/components/bitrix/catalog/templates/.default/section.php".
Для меня было не ясно, как данные из фильтра передаются в раздел и показывается только выбранные товары.
Оказалось в этом участвует переменная $arParams['FILTER_NAME'], она задает имя переменной фильтра и используется следующим образом в компонентах:
if(empty($arParams["FILTER_NAME"]) || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["FILTER_NAME"]))
{
$arrFilter = array();
}
else
{
global ${$arParams["FILTER_NAME"]};
$arrFilter = ${$arParams["FILTER_NAME"]};
if(!is_array($arrFilter))
$arrFilter = array();
}
На первый взгляд все логично, но если задать в комплексном компоненте
<?$APPLICATION->IncludeComponent(
"bitrix:catalog",
"",
Array(
"IBLOCK_TYPE" => "catalog",
"IBLOCK_ID" => "99",
...
"USE_FILTER" => "Y",
"FILTER_NAME" => "arParams", // не делайте так!!!
)
);?>
То есть, $arParams['FILTER_NAME']='arParams', такое название фильтра непредсказуемо ломает в нашем примере раздел каталога.
Использование названий фильтра совпадающих с используемыми переменными может поломать сайт, например, 'APPLICATION'.
Совет от Аркадия Паровозова:
«Дети, Саши и Маши, избегайте использования FILTER_NAME в Битриксе, а если придется применить, то проверяйте на совпадение с существующими переменными и НИКОГДА не делайте как в примере ниже.»<?$APPLICATION->IncludeComponent( "bitrix:catalog", "", Array( "IBLOCK_TYPE" => "catalog", "IBLOCK_ID" => "99", ... "USE_FILTER" => "Y", "FILTER_NAME" => $_REQUEST['FILTER_HACK'], // НИКОГДА НЕ ДЕЛАЙТЕ ТАК!!! ) );?>
Предупреждаю, что тесты на боевых сайтах опасны!
За все ваши действия несете полную ответственность!
Спасибо за внимание!
P.S. На вопрос «Доведено ли это до разработчиков?», отвечаю, что нет.
Я считаю, что программист/пользователям должен знать об опасности в первую очередь и сможет ее избежать, а разработчики быстрее отреагируют.
Основная угроза в неправильном использовании 'FILTER_NAME'. Если используете значение 'FILTER_NAME' по умолчанию, возможно у вас все работает нормально.
Важно это знать программистам/пользователям в первую очередь потому, что не все системы на Битриксе обновляются и используют последнюю версию и обновление их не затронет, а угроза все равно остается.
Разработчики сами учат плохому тону: Способы передачи данных между компонентами.