Добрый день!
Сегодня пришлось разбираться с взаимодействием между компонентами «bitrix:catalog.smart.filter» и «bitrix:catalog.section» в комплексном компоненте «bitrix:catalog», что находится по пути "/bitrix/components/bitrix/catalog/templates/.default/section.php".
Для меня было не ясно, как данные из фильтра передаются в раздел и показывается только выбранные товары.
Оказалось в этом участвует переменная $arParams['FILTER_NAME'], она задает имя переменной фильтра и используется следующим образом в компонентах:
На первый взгляд все логично, но если задать в комплексном компоненте
То есть, $arParams['FILTER_NAME']='arParams', такое название фильтра непредсказуемо ломает в нашем примере раздел каталога.
Предупреждаю, что тесты на боевых сайтах опасны!
За все ваши действия несете полную ответственность!
Спасибо за внимание!
P.S. На вопрос «Доведено ли это до разработчиков?», отвечаю, что нет.
Я считаю, что программист/пользователям должен знать об опасности в первую очередь и сможет ее избежать, а разработчики быстрее отреагируют.
Основная угроза в неправильном использовании 'FILTER_NAME'. Если используете значение 'FILTER_NAME' по умолчанию, возможно у вас все работает нормально.
Важно это знать программистам/пользователям в первую очередь потому, что не все системы на Битриксе обновляются и используют последнюю версию и обновление их не затронет, а угроза все равно остается.
Разработчики сами учат плохому тону: Способы передачи данных между компонентами.
Сегодня пришлось разбираться с взаимодействием между компонентами «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' по умолчанию, возможно у вас все работает нормально.
Важно это знать программистам/пользователям в первую очередь потому, что не все системы на Битриксе обновляются и используют последнюю версию и обновление их не затронет, а угроза все равно остается.
Разработчики сами учат плохому тону: Способы передачи данных между компонентами.