Подгрузка элементов в Bitrix на AJAX. Особенность передачи $arParams
Запись от 03.09.2014
Обычный компонент "Элементы раздела" должен по нажатию "Показать ещё" подгрузить следующую партию элементов.
Поскольку, новые элементы должны быть загружены таким же компонентом, с такими же параметрами, то и передавать их было решено через AJAX. В таком случае, если изменятся параметры компонента, то они, автоматически отразятся и на подгружаемых элементах.
Передавать массив параметров было решено с помощью json - вроде бы, логичный вариант, и плюс ко всему зашифровать и сжать - так и компактнее и безопаснее:
И такой массив передавался в php-скрипт вызываемый AJAX-ом, да только компонент не вернет ничего, т.к. некоторые (!) значения параметров типа "Y" и "N" преобразуются в true и false, а компонент эти значения в качестве входных параметров не принимает, поэтому получилась такая конструкция:
И вот такой массив параметров, после расшифровки компонент уже примет:
Поскольку, новые элементы должны быть загружены таким же компонентом, с такими же параметрами, то и передавать их было решено через AJAX. В таком случае, если изменятся параметры компонента, то они, автоматически отразятся и на подгружаемых элементах.
Передавать массив параметров было решено с помощью json - вроде бы, логичный вариант, и плюс ко всему зашифровать и сжать - так и компактнее и безопаснее:
var arParams = '<?=base64_encode(gzcompress(json_encode($arParams)))?>';
И такой массив передавался в php-скрипт вызываемый AJAX-ом, да только компонент не вернет ничего, т.к. некоторые (!) значения параметров типа "Y" и "N" преобразуются в true и false, а компонент эти значения в качестве входных параметров не принимает, поэтому получилась такая конструкция:
$arParamsClear = Array();
foreach($arParams as $key=>$val) {
if(strstr($key, "~") === false) {
if($val === true) {
$val = 'Y';
} elseif ($val === false) {
$val = 'N';
}
$arParamsClear[$key] = $val;
}
}
...
<sc ript type="text/javascript">
...
var arParams = '<?=base64_encode(gzcompress(json_encode($arParamsClear)))?>';
И вот такой массив параметров, после расшифровки компонент уже примет:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
$arParams = (array) json_decode(gzuncompress(base64_decode($_REQUEST['arParams'])));
?>
<?$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"xxx",
$arParams
);?>