Search
Write a publication
Pull to refresh

Не используйте 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' по умолчанию, возможно у вас все работает нормально.

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

Разработчики сами учат плохому тону: Способы передачи данных между компонентами.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.