Просмотров: 6330 (Статистика ведётся с 06.02.2017)

Включение поддержки соглашений в собственных компонентах рассмотрим на примере компонента подписки на рассылку sender.subscribe.

Добавление секции в настройки компонента

В файле параметров вашего компонента .parameters.php достаточно объявить параметр "USER_CONSENT" => array() и появится раздел с параметрами настройки:

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentParameters = array(
    "GROUPS" => array(
    ),
    "PARAMETERS" => array(
     "AJAX_MODE" => array(),
     "USER_CONSENT" => array(),
    )
);

Теперь в настройках компонента появились секция Согласие пользователя:

Вывод в форме

Для вывода используется компонент main.userconsent.request Системный компонент, в документации не описывается. Расположен: /bitrix/components/bitrix/main.userconsent.request . Компонент умеет сохранять полученное согласие. Он выводит чекбокс с подписью, по нажатию на которую выводится окно с текстом соглашения. Окно с текстом адаптивное и уже сделано и под мобильные устройства:

Компонент main.userconsent.request нужно подключить в шаблоне вашего компонента перед кнопкой отправки формы. Есть два вида форм:

  • стандартная get/post отправка формы с событием submit;
  • отправка через ajax и иные механизмы, реализованные в js, то есть без события submit у формы.

В этих формах компонент используется по разному.

Простая форма с событием submit

В этом случае подключаем компонент перед кнопкой отправки формы:

<form method="POST">
    <input name="EMAIL" placeholder="Email">
    <input name="PHONE" placeholder="Телефон">
    <input name="NAME" placeholder="Имя">
    <br>
    <?if ($arParams['USER_CONSENT'] == 'Y'):?>
     <?$APPLICATION->IncludeComponent(
      "bitrix:main.userconsent.request",
      "",
      array(
          "ID" => $arParams["USER_CONSENT_ID"],
          "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"],
          "AUTO_SAVE" => "Y",
          "IS_LOADED" => $arParams["USER_CONSENT_IS_LOADED"],
          "REPLACE" => array(
           'button_caption' => 'Подписаться!',
           'fields' => array('Email', 'Телефон', 'Имя')
          ),
      )
     );?>
    <?endif;?>
    <input type="submit" name="subscribe" value="Подписаться!">
</form>

Указанные в примере параметры $arParams появятся в шаблоне вашего компонента при наличии в .parameters.php блока "USER_CONSENT" => array().

В параметре REPLACE передается:

  • button_caption - название кнопки отправки формы;
  • fields - массив названий полей, которые попадут в текст соглашения.

Форма без события submit(ajax и другие)

В компонент в параметре SUBMIT_EVENT_NAME передаётся название события, при котором появится окно запроса согласия.

Далее, добавляется обработчик события принятия соглашения. Если обработчик поймает событие - значит, согласие получено и можно отправлять форму/данные или выполнять какое-то действие.

<div id="my_container">
    <input type="text" placeholder="Электронный адрес" name="EMAIL">
    <input type="submit" id="fire_event" value="Отправить">
    <br>
    <?if ($arParams['USER_CONSENT'] == 'Y'):?>
        <?$APPLICATION->IncludeComponent(
            "bitrix:main.userconsent.request",
            "",
            array(
                'ID' => $arParams["USER_CONSENT_ID"],
                "IS_CHECKED" => $arParams["USER_CONSENT_IS_CHECKED"],
                "IS_LOADED" => "Y",
                "AUTO_SAVE" => "N",
                'SUBMIT_EVENT_NAME' => 'my-event-name',
                'REPLACE' => array(
                    'button_caption' => 'Отправить',
                    'fields' => array('Электронный адрес')
                ),
            )
        );?>
    <?endif;?>
</div>
    
<script type="text/javascript">
BX.ready(function () {

    var submitBtn = BX('fire_event');
    BX.bind(submitBtn, 'click', function(){
        BX.onCustomEvent('my-event-name', []);
    });

    if (!BX.UserConsent)
    {
        return;
    }
    var control = BX.UserConsent.load(BX('my_container'));
    if (!control)
    {
        return;
    }
    
    BX.addCustomEvent(
        control,
        BX.UserConsent.events.save,
        function (data) {
            console.log('js event:', 'save', data);
            // успешно!
            // отправляем ajax 
            // или другие действия
        }
    );
    
});
</script>

Сохранение согласия

В параметрах компонента есть параметр AUTO_SAVE. Если его значение равно Y, то согласие автоматически сохраняется компонентом. Если вам нужно сохранить согласие самим, то передайте значение N. А для ручного добавления согласия вызовите следующий код:
\Bitrix\Main\UserConsent\Consent::addByContext( 
       $arParams["USER_CONSENT_ID"]
   );

11


Курсы разработаны в компании «1С-Битрикс»