+7 (843) 212-62-17 - Казань
+7 (843) 212-62-17 - Казань

Модуль logictim.registration (версия 1.0.63+) рисует галочки с текстом согласия и пишет отметки в журнал 152-ФЗ. Всё через один класс ConsentForm: показать → проверить → записать.

Какая у вас форма?

Ответьте на один вопрос: где создана форма, в которую нужно добавить согласия?

  • Вариант А подходит, если форма создана в админке (Сервисы → Веб-формы), на странице выводится стандартный компонент bitrix:form, а поля (имя, телефон, e-mail) настраиваются в админке, а не в PHP-шаблоне.
  • Вариант Б подходит, если вы сами написали HTML-форму в шаблоне, используете свой компонент или AJAX-обработчик — форма не из раздела «Веб-формы» в админке.

Вариант А — форма из админки Битрикса

Шаг 1. Вывод

В шаблоне веб-формы, перед кнопкой «Отправить»:

use Logictim\Registration\Consent\Form\ConsentForm;

echo ConsentForm::render([
    'prefix'      => 'lr_wf_6',
    'source'      => 'form',
    'web_form_id' => 6,
    'phone_field' => 'PHONE',
    'email_field' => 'EMAIL',
    'lookup'      => 'phone',
    'consents'    => [
        [
            'text'         => 'Согласен на обработку данных (#1:политика#)',
            'document_ids' => [3],
            'required'     => true,
        ],
    ],
]);

Что подставить

Поле в кодеОткуда взять
'prefix' => 'lr_wf_6'Любое уникальное имя блока на странице. Удобно: lr_wf_ + ID формы
'source' => 'form'Метка в журнале. Обычно form
'web_form_id' => 6Сервисы → Веб-формы → ID формы в списке или в URL
'phone_field' => 'PHONE'В этой форме → вопрос с телефоном → символьный идентификатор (SID), не числовой ID
'email_field' => 'EMAIL'То же для поля e-mail
'lookup' => 'phone'Как искать ранее данное согласие: phone, email, any
'consents' => [...]Список галочек (см. ниже)
'text' => '...'Текст у галочки. #1:подпись# превратится в ссылку на документ
'document_ids' => [3]Админка модуля → документы согласия → ID документа
'required' => trueБез галочки форма не уйдёт

Два способа задать галочки

  • profile_id — взять галочки из профиля регистрации (админка модуля → профили).
  • consents — свой список в коде (как в примере выше).
В варианте А не нужны отдельные шаги JS, PHP-проверки и записи в журнал — модуль делает это сам при отправке веб-формы.

Вариант Б — своя форма

Шаг 1. Вывод

В шаблоне, внутри <form>, перед кнопкой:

$config = [
    'prefix'   => 'lr_subscribe',
    'source'   => 'subscribe',
    'lookup'   => 'phone',
    'consents' => [
        [
            'text'         => 'Согласен на рассылку (#1:условия#)',
            'document_ids' => [12],
            'required'     => true,
        ],
    ],
];
echo \Logictim\Registration\Consent\Form\ConsentForm::render($config);

Один раз задали $config — тот же массив на шагах 3 и 4.

Откуда берутся галочки

Вариант 1. Из профиля регистрации (как на странице регистрации):

$config = [
    'prefix'     => 'lr_form',
    'source'     => 'form',
    'profile_id' => 1,  // ID профиля в админке модуля; 0 = первый профиль на сайте
];

Вариант 2. Свой набор в коде:

$config = [
    'prefix'   => 'lr_subscribe',
    'source'   => 'subscribe',
    'consents' => [
        [
            'text'         => '...',
            'document_ids' => [12],
            'required'     => true,
        ],
    ],
];

Указывается либо profile_id, либо consents — не оба сразу.

Через компонент (удобно в визуальном редакторе):

$APPLICATION->IncludeComponent('logictim:consent.request', '', [
    'FIELD_PREFIX' => 'lr_subscribe',
    'SOURCE'       => 'subscribe',
    'CONSENTS'     => [ /* массив consents как выше */ ],
]);

Шаг 2. JavaScript

При обычной отправке формы (submit) ничего не делайте — скрипт подключается из render() и блокирует отправку без обязательных галочек.

AJAX-отправка (без submit формы) — одна строка перед вашим запросом:

if (!lrFormConsentValidate(document.getElementById('my_form'))) {
    return;
}

Функция lrFormConsentValidate — глобальная, подключается вместе с блоком согласий. Показывает текст ошибки и подсвечивает неотмеченные галочки.

Шаг 3. PHP-проверка (до сохранения заявки)

$phone = trim((string)$request->getPost('PHONE'));
$subject = ConsentForm::subjectFromValues([
    'phone'  => $phone,
    'lookup' => 'phone',
]);
if (!ConsentForm::validate($config, $request, $subject)->isSuccess()) {
    // ошибка пользователю
}

Модуль не знает имена ваших полей — телефон/e-mail читаете вы и передаёте в $subject.

Имена галочек модуль создаёт сам: lr_subscribe_consent[0], lr_subscribe_consent[1]

Шаг 4. Запись в журнал (после сохранения)

ConsentForm::grant($config, $request, $subject, $idЗаявки);

$idЗаявки — ID созданной записи (лид, подписка и т.п.). Можно 0, если привязка не нужна.

Полный пример (своя форма)

// шаблон
$config = [ /* как в шаге 1 */ ];
echo ConsentForm::render($config);

// обработчик
Loader::includeModule('logictim.registration');
$request = Context::getCurrent()->getRequest();
$phone = trim((string)$request->getPost('PHONE'));
$subject = ConsentForm::subjectFromValues(['phone' => $phone, 'lookup' => 'phone']);
if (!ConsentForm::validate($config, $request, $subject)->isSuccess()) {
    die('Нужно отметить согласие');
}
$id = 123; // ID после вашего сохранения
ConsentForm::grant($config, $request, $subject, $id);

Откуда берётся текст ошибки «нужно отметить согласие»

Способ задания галочекТекст ошибки
profile_id — из профиля регистрации Из настроек этого профиля в админке модуля: поле «Обязательно согласие на обработку данных» (как на странице регистрации)
consents — свой список в коде Параметр required_message в $config, если задали. Иначе — стандартная фраза модуля
Веб-форма (вариант А) Тот же принцип: из profile_id или required_message, иначе стандартная фраза

Текст одинаковый в JS (lrFormConsentValidate) и в PHP (validate) — модуль подставляет его в блок при render().

Пример со своим текстом:

$config = [
    'prefix'           => 'lr_subscribe',
    'source'           => 'subscribe',
    'required_message' => 'Пожалуйста, отметьте согласие на рассылку',
    'consents'         => [ /* ... */ ],
];

Справочник $config

КлючЗачем
prefixУникальное имя блока
sourceМетка в журнале: form, subscribe, one_click
profile_idГалочки из профиля регистрации
consentsСвой список галочек
required_messageТекст ошибки (для consents; для profile_id не нужен — берётся из профиля)
web_form_idТолько вариант А
phone_field, email_fieldТолько вариант А — SID полей
lookupphone, email, any

Оформление заказа на сайте

Для стандартной корзины и sale.order.ajax эта инструкция не нужна — включите «Согласия на заказе» в настройках модуля.

Перед сдачей

  1. Блок согласий внутри <form>.
  2. Один и тот же $config на render, validate, grant (вариант Б).
  3. Для своей формы — не забыть validate и grant.
  4. Телефон/e-mail в $subject — из вашего кода, не из имён полей модуля.