Не используйте FILTER_NAME в компонентах Битрикса

в 11:32, , рубрики: Песочница, метки: , ,

Добрый день!

Сегодня пришлось разбираться с взаимодействием между компонентами «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' по умолчанию, возможно у вас все работает нормально.

Важно это знать программистам/пользователям в первую очередь потому, что не все системы на Битриксе обновляются и используют последнюю версию и обновление их не затронет, а угроза все равно остается.

Разработчики сами учат плохому тону: Способы передачи данных между компонентами.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js