Форма обратной связи ui.feedback.form

Форма обратной связи показывает на странице CRM-форму Битрикс24: пользователь заполняет ее, а результат приходит в CRM того Битрикс24, где форма создана. Форма открывается в боковой панели шириной 600 пикселей или встраивается прямо в разметку страницы.

Используйте форму, когда нужно собрать отзыв, заявку или сообщение об ошибке со страницы своего модуля, а обрабатывать ответы — в CRM. Сама форма с полями, согласиями и капчей хранится в Битрикс24: расширение загружает ее оттуда, а ответы на сайте не сохраняет.

Расширение выбирает одну форму из набора по региону лицензии и языку страницы, поэтому для разных регионов и языков передают несколько форм.

За форму отвечают:

  • JavaScript-расширение ui.feedback.form модуля ui — открывает форму методом BX.UI.Feedback.Form.open(),

  • компонент bitrix:ui.feedback.form того же модуля — выводит кнопку, которая открывает форму, или встраивает форму в страницу.

Метод Form.open() работает только для авторизованных пользователей и открывает форму в момент вызова, с данными этого момента. Компонент выбирает форму при выводе страницы и работает и для гостей сайта.

Подключить расширение

Если вы открываете форму из своего JavaScript-кода, загрузите расширение ui.feedback.form и расширение боковой панели main.sidepanel.

\Bitrix\Main\UI\Extension::load(['main.sidepanel', 'ui.feedback.form']);

Расширение ui.feedback.form зависит только от main.core и боковую панель не подключает. Без main.sidepanel на странице метод Form.open() прерывается ошибкой TypeError: объекта BX.SidePanel.Instance нет.

Если вы работаете в модульном JavaScript, импортируйте класс Form из расширения.

import { Form } from 'ui.feedback.form';

Вне модульного JavaScript тот же класс доступен как BX.UI.Feedback.Form.

Компоненту отдельная загрузка не нужна: его шаблон подключает ui.feedback.form, а для кнопки — еще боковую панель и кнопки ui.buttons.

Описать набор форм

И метод Form.open(), и компонент принимают не одну форму, а массив форм. Каждый элемент массива описывает CRM-форму объектом с полями.

Поле

Тип

Описание

id

number

Обязательное. Числовой идентификатор CRM-формы в Битрикс24

sec

string

Обязательное. Код безопасности формы

lang

string

Язык формы. Сервер сравнивает его с языком текущей страницы. По умолчанию ru для регионов лицензии ru, by, kz, uz и en для остальных

zones

Array

Регионы лицензии, для которых предназначена форма. По умолчанию ['ru'] для регионов лицензии ru, by, kz, uz и ['en'] для остальных

Элемент без id или sec сервер пропускает. Оба значения есть в коде встраивания CRM-формы — в атрибуте data-b24-form вида inline/<id>/<sec>.

Регион лицензии — код региона, для которого выпущена лицензия продукта: ru, by, kz, en, de и другие. Регион своего сайта возвращает метод getRegion() объекта лицензии. Если регион не определен, метод возвращает null, и сервер выбирает форму как для региона en.

$region = \Bitrix\Main\Application::getInstance()->getLicense()->getRegion();

Пример. Набор из двух форм: одна для русскоязычных регионов, другая для всех остальных.

const forms = [
    { id: 12, sec: 'a1b2c3', lang: 'ru', zones: ['ru', 'by', 'kz'] },
    { id: 14, sec: 'd4e5f6', lang: 'en', zones: ['en'] },
];

Порядок выбора формы

Одну форму из набора выбирает сервер — класс Bitrix\UI\Form\FeedbackForm. Порядок такой:

  1. Сервер отбирает формы, у которых в zones есть регион лицензии сайта.

  2. Если таких форм нет, сервер отбирает формы с регионом по умолчанию: ru для регионов ru, by, kz, uz и en для остальных.

  3. Если и таких форм нет, форма не выбрана.

  4. Из отобранных форм сервер оставляет те, у которых lang совпадает с языком текущей страницы — константой LANGUAGE_ID.

  5. Если совпадений по языку нет, сервер оставляет формы с языком по умолчанию: ru или en по тому же правилу, что и регион.

  6. Если и таких нет, сервер оставляет все формы, отобранные по региону.

  7. Из оставшихся сервер берет первую по порядку в массиве.

Отбор по региону идет первым, по языку — только среди форм, которые его прошли. Форма с подходящим языком, но другим регионом в выбор не попадет. Чтобы форма открывалась в любом регионе, добавьте в набор форму с регионом en и форму с регионом ru.

Указать свой Битрикс24

Без параметра адреса расширение загружает форму с сервиса обратной связи Битрикс: https://product-feedback.bitrix24.ru для регионов ru, by, kz, uz и https://product-feedback.bitrix24.com для остальных. Свои CRM-формы хранятся в вашем Битрикс24, поэтому его адрес передавайте всегда: в параметре portalUri метода Form.open() или в параметре PORTAL_URI компонента.

Расширение дописывает к адресу путь /bitrix/js/crm/form_loader.js и загружает по нему загрузчик CRM-форм. Задавайте адрес со схемой https:// и без косой черты в конце.

Открыть форму из JavaScript

Метод Form.open(options) открывает форму в боковой панели. Метод отправляет запрос к действию ui.feedback.loadData, получает от сервера выбранную форму и загружает ее в панель.

Параметры метода:

Параметр

Тип

Описание

id

string

Обязательный. Идентификатор формы на странице, непустая строка. По нему метод находит форму, открытую раньше

forms

Array

Набор форм, из которого сервер выбирает одну. Состав элемента описан в разделе Описать набор форм

portalUri

string

Адрес Битрикс24, где созданы формы. По умолчанию — сервис обратной связи Битрикс

title

string

Заголовок над формой в панели. По умолчанию Обратная связь на языке страницы

presets

Object

Значения, которые уходят вместе с заполненной формой. Описаны в разделе Передать данные вместе с формой

defaultForm

Object

Одна форма в том же формате, что и элемент forms. Сервер берет ее, если из forms не подошла ни одна. Параметр устарел: серверный метод, который его обрабатывает, помечен @deprecated. Задавайте формы для всех регионов в forms

Пример. Кнопка на странице открывает форму отзыва о списке документов.

import { Event } from 'main.core';
import { Form } from 'ui.feedback.form';

Event.bind(document.getElementById('documents-feedback'), 'click', () => {
    Form.open({
        id: 'documents-feedback',
        portalUri: 'https://example.bitrix24.com',
        title: 'Отзыв о списке документов',
        forms: [
            { id: 12, sec: 'a1b2c3', lang: 'ru', zones: ['ru', 'by', 'kz'] },
            { id: 14, sec: 'd4e5f6', lang: 'en', zones: ['en'] },
        ],
        presets: {
            source: 'documents-list',
        },
    });
});

Метод ничего не возвращает. Панель открывается сразу и остается пустой до ответа сервера. Затем в ней появляются заголовок и индикатор загрузки, а когда загрузится CRM-форма, индикатор пропадает.

Условия запроса к серверу

Действие ui.feedback.loadData принимает только POST-запрос авторизованного пользователя с CSRF-токеном. Метод Form.open() отправляет запрос через BX.ajax.runAction(), а тот добавляет токен в заголовок X-Bitrix-Csrf-Token.

Для неавторизованного пользователя метод Form.open() не работает: сервер отклоняет запрос, расширение пишет ошибку в консоль браузера, а панель остается пустой. Форму для гостей сайта выводите компонентом: он готовит данные формы при выводе страницы, без отдельного запроса.

Панель остается пустой и в двух других случаях:

  • ни одна форма из forms не подошла по региону и параметр defaultForm не передан,

  • параметр id не передан или пустой.

Повторное открытие

Метод Form.open() запоминает созданную форму по значению id. Повторный вызов с тем же id открывает ту же форму. Если первая загрузка прошла успешно, новый запрос к серверу метод не отправляет. Новые forms, presets и title в таком вызове не применяются: форма остается с параметрами первого вызова.

Если параметры формы меняются от вызова к вызову, передавайте каждый раз новое значение id.

Пример. Форма получает новый идентификатор при каждом открытии, поэтому в presets всегда уходит код текущего раздела.

import { Form } from 'ui.feedback.form';

function openSectionFeedback(sectionCode)
{
    Form.open({
        id: `section-feedback-${sectionCode}-${Date.now()}`,
        portalUri: 'https://example.bitrix24.com',
        forms: [
            { id: 12, sec: 'a1b2c3', lang: 'ru', zones: ['ru', 'by', 'kz'] },
            { id: 14, sec: 'd4e5f6', lang: 'en', zones: ['en'] },
        ],
        presets: {
            section: sectionCode,
        },
    });
}

Одновременно открыта только одна форма. Пока панель с формой открыта, новые вызовы Form.open() ничего не делают — даже с другим id. Следующая форма откроется после того, как пользователь закроет панель.

Что метод не принимает

Метод Form.open() передает серверу только параметры из таблицы выше. Остальные параметры он отбрасывает без ошибки:

  • showTitle — заголовок над формой в панели всегда виден,

  • button и node — привязка к кнопке и встраивание в страницу работают только в компоненте,

  • form — одну готовую форму без выбора метод не принимает, используйте forms с одним элементом.

Конструктор new BX.UI.Feedback.Form(options) устарел. Он продолжает работать и принимает уже выбранную форму, адрес и presets в готовом виде — так его вызывает шаблон компонента. Для своего кода используйте метод Form.open(): он сам выбирает форму на сервере.

Загрузить расширение по требованию

Если форма нужна редко, загрузите расширение в момент открытия методом BX.Runtime.loadExtension(). Метод возвращает промис с экспортами расширения, среди них класс Form.

Пример. Функция загружает расширение только в момент вызова, например по нажатию кнопки.

import { Runtime } from 'main.core';

async function openFeedback(options)
{
    const { Form } = await Runtime.loadExtension('ui.feedback.form');

    Form.open(options);
}

Расширение main.sidepanel при этом должно быть на странице заранее.

Вывести кнопку компонентом

Компонент bitrix:ui.feedback.form выбирает форму при выводе страницы и рисует кнопку. Нажатие на кнопку открывает форму в боковой панели. Запроса к серверу при этом нет, поэтому кнопка работает и для неавторизованного пользователя.

Подключают компонент методом $APPLICATION->IncludeComponent(), как описано в статье Компоненты.

Параметры компонента:

Параметр

Тип

Описание

ID

string

Обязательный. Идентификатор формы на странице. Из него компонент собирает id кнопки: <ID>-button

FORMS

array

Обязательный. Набор форм, из которого компонент выбирает одну. Элементы — массивы с ключами id, sec, lang, zones, как в разделе Описать набор форм

PORTAL_URI

string

Адрес Битрикс24, где созданы формы. По умолчанию — сервис обратной связи Битрикс

TITLE

string

Текст кнопки и заголовок над формой. По умолчанию Обратная связь на языке страницы

PRESETS

array

Значения, которые уходят вместе с заполненной формой

VIEW_TARGET

string или false

Имя области отложенного вывода, куда шаблон помещает кнопку. По умолчанию pagetitle. Значение false выводит кнопку на месте вызова компонента

air

bool

Со значением true рисует кнопку в air-оформлении. Имя параметра пишется строчными буквами

USE_UI_TOOLBAR

string

Со значением Y добавляет кнопку в панель инструментов ui.toolbar, а не выводит в разметку. Работает только вместе с air = true

INLINE

bool

Со значением true встраивает форму в страницу вместо кнопки. Описан в разделе Встроить форму в страницу

SHOW_TITLE

string

Со значением N скрывает заголовок над встроенной формой. Работает только вместе с INLINE = true

Пример. Кнопка отзыва выводится на месте вызова компонента.

<?php

global $APPLICATION;

$APPLICATION->IncludeComponent(
    'bitrix:ui.feedback.form',
    '',
    [
        'ID' => 'documents-feedback',
        'PORTAL_URI' => 'https://example.bitrix24.com',
        'TITLE' => 'Отзыв о списке документов',
        'FORMS' => [
            ['id' => 12, 'sec' => 'a1b2c3', 'lang' => 'ru', 'zones' => ['ru', 'by', 'kz']],
            ['id' => 14, 'sec' => 'd4e5f6', 'lang' => 'en', 'zones' => ['en']],
        ],
        'PRESETS' => [
            'source' => 'documents-list',
        ],
        'VIEW_TARGET' => false,
    ]
);

Компонент ничего не выводит, если параметр ID пустой, параметр FORMS пустой или не массив, или ни одна форма не подошла по региону. Параметра для запасной формы, как defaultForm у метода Form.open(), у компонента нет.

Выбрать место для кнопки

По умолчанию шаблон компонента выводит кнопку в область отложенного вывода pagetitle: оборачивает разметку в вызовы SetViewTarget('pagetitle') и EndViewTarget(). Кнопка появится там, где шаблон сайта вызывает $APPLICATION->ShowViewContent('pagetitle'). Если шаблон сайта эту область не выводит, кнопки на странице не будет.

Чтобы кнопка встала на место вызова компонента, передайте 'VIEW_TARGET' => false. Чтобы кнопка попала в другую область, передайте ее имя.

На страницах с панелью инструментов ui.toolbar кнопку добавляют в панель параметрами 'air' => true и 'USE_UI_TOOLBAR' => 'Y': компонент передает ее методу Toolbar::addButton(). Без air параметр USE_UI_TOOLBAR не действует: компонент выводит обычную кнопку в разметку.

Открыть форму компонента из своего кода

Компонент создает в JavaScript объект формы с идентификатором из параметра ID. Метод Form.getById(id) возвращает этот объект или null, если формы с таким идентификатором нет. Метод openPanel() объекта открывает форму в боковой панели — так же, как нажатие на кнопку.

Пример. Пункт меню открывает форму, которую на странице вывел компонент с 'ID' => 'documents-feedback'.

import { Form } from 'ui.feedback.form';

const form = Form.getById('documents-feedback');

if (form)
{
    form.openPanel();
}

Метод getById() сравнивает идентификатор строго, вместе с типом. Компонент приводит ID к строке, поэтому и в getById() передавайте строку.

Встроить форму в страницу

Параметр 'INLINE' => true переключает компонент на шаблон встроенной формы. Вместо кнопки компонент выводит пустой блок с id вида <ID>-node и сразу загружает в него CRM-форму. Боковая панель в этом режиме не нужна.

Компонент сравнивает значение строго: строка 'Y' встроенную форму не включает, и вместо нее появится кнопка.

Пример. Форма встроена в страницу без заголовка.

<?php

global $APPLICATION;

$APPLICATION->IncludeComponent(
    'bitrix:ui.feedback.form',
    '',
    [
        'ID' => 'documents-feedback-inline',
        'PORTAL_URI' => 'https://example.bitrix24.com',
        'FORMS' => [
            ['id' => 12, 'sec' => 'a1b2c3', 'lang' => 'ru', 'zones' => ['ru', 'by', 'kz']],
            ['id' => 14, 'sec' => 'd4e5f6', 'lang' => 'en', 'zones' => ['en']],
        ],
        'INLINE' => true,
        'SHOW_TITLE' => 'N',
    ]
);

Встроенная форма выводится на месте вызова компонента: параметр VIEW_TARGET в этом режиме не действует. Без 'SHOW_TITLE' => 'N' над формой стоит заголовок из параметра TITLE.

Передать данные вместе с формой

Параметр presets метода Form.open() и параметр PRESETS компонента передают в форму пары «ключ — значение». Расширение отдает их загрузчику CRM-формы, и форма отправляет их вместе с результатом заполнения. Так в CRM попадает контекст: раздел, из которого открыли форму, код объекта, режим работы страницы. Ключи и значения выбираете вы, например source или section из примеров выше.

К вашим значениям сервер добавляет системные. Если ключ совпадает с системным, остается системное значение. Системные ключи:

  • c_id — идентификатор текущего пользователя.

  • c_name — имя текущего пользователя, а если имя не заполнено — логин.

  • c_email — адрес электронной почты текущего пользователя.

  • hosturl — адрес сайта со схемой.

  • hostname — имя хоста сайта без схемы.

  • db_name — имя базы данных сайта.

  • b24_plan — тариф: в облачном Битрикс24 — тип лицензии, в коробочной установке — коды лицензии через запятую.

  • b24_plan_date_to — дата окончания лицензии.

  • b24_partner_id — идентификатор партнера, который обслуживает сайт. Пустая строка, если партнера нет.

  • b24_partner_name — название партнера. Пустая строка, если партнера нет.

  • business — значение настройки CJM-business модуля bitrix24. Ключ есть, только если настройка задана.

Системные значения уходят в тот Битрикс24, адрес которого указан в portalUri или PORTAL_URI: почта и имя пользователя, адрес сайта, имя базы данных. Если адрес не задан, они уходят на сервис обратной связи Битрикс.

Связанные материалы