Блог

Несколько одинаковых AJAX-компонентов на одной странице

Чтобы компонент вызывался через AJAX, для большинства компонентов достаточно прописать следующие параметры:

"AJAX_MODE" => "Y",  // режим AJAX
"AJAX_OPTION_SHADOW" => "N", // затемнять область
"AJAX_OPTION_JUMP" => "N", // скроллить страницу до компонента
"AJAX_OPTION_STYLE" => "Y", // подключать стили
"AJAX_OPTION_HISTORY" => "N",
Но если на одной странице несколько одинаковых компонентов (например, формы bitrix:form.result.new или bitrix:iblock.element.add.form), то они начинают мешать жить друг другу. В этом случае необходимо добавить параметр
"AJAX_OPTION_ADDITIONAL" => 'random',
где вместо "random" для каждого компонента должно быть уникальное значение (например, если компонент в цикле вывода элементов, то ID элемента). В принципе этого параметра должно быть достаточно, но если вдруг компоненты продолжают ругаться, то делаем следующее: переносим компонент в свое пространство имен, и в файле component.php в проверку:
if (($_POST['WEB_FORM_ID'] == $arParams['WEB_FORM_ID'] || $_POST['WEB_FORM_ID'] == $arResult['arForm']['SID']) && (strlen($_REQUEST["web_form_submit"])>0 || strlen($_REQUEST["web_form_apply"])>0))
добавляем код:
&& $arParams['AJAX_OPTION_ADDITIONAL']==$_REQUEST["ajax_opt_add"]
получится где-то так:
if (($_POST['WEB_FORM_ID'] == $arParams['WEB_FORM_ID'] || $_POST['WEB_FORM_ID'] == $arResult['arForm']['SID']) && (strlen($_REQUEST["web_form_submit"])>0 || strlen($_REQUEST["web_form_apply"])>0) && $arParams['AJAX_OPTION_ADDITIONAL']==$_REQUEST["ajax_opt_add"])
а в шаблоне этого компонента добавляем в форму скрытое поле:

Примечание: сделано на примере компонента bitrix:form.result.new. Для других компонентов аналогично, только будет отличатся код проверки в файле component.php.

Комментарии (3)

  • Андрей

    Спасибо за статью! Помогло!

    22 сентября, 2021 в 4:47
  • Сергей

    Спасибо большое!

    31 марта, 2021 в 16:41
  • Юрий

    Полезная статья, спасибо)

    11 декабря, 2017 в 3:30

Оставить комментарий



Вам нужен сайт? С чего начать?

Проконсультируем, найдем оптимальное решение, подготовим индивидуальное предложение.