Перейти к содержимому

Настройка веб-формы - вопросы, статусы результатов, права

Разбираемся в устройстве веб-формы: вопросы против полей, статусы результатов, права сотрудников и выгрузка накопленных ответов.

Что нужно знать заранее

Вопрос и поле в веб-форме - разные вещи. Вопросы заполняет посетитель при отправке, поля заполняются уже после сохранения результата и служат служебным хранилищем.

Каждый ответ посетителя сохраняется отдельным результатом, и у результата есть статус. Статусы дают готовый процесс обработки: новая заявка, в работе, обработана, отклонена.

Права на конкретную форму раздаются группам отдельно от прав на сам модуль. Сотрудник может видеть список форм, но не видеть ни одного результата, и это нормальная настройка.

Шаги

  1. Собрать весь ввод посетителя вопросами формы, а служебные значения оставить полям.
  2. Описать статусы результатов под тот процесс обработки заявок, который принят у заказчика.
  3. Раздать права группам: кто видит результаты, кто меняет их статусы.
  4. Настроить письмо на новый результат и проверить его на тестовой отправке.
  5. Настроить выгрузку и чистку старых результатов, чтобы база не росла.

Решение

Читаем результаты формы с фильтром:

\Bitrix\Main\Loader::includeModule('form');
$by = 's_timestamp'; $order = 'desc'; $filtered = false;
$rs = \CFormResult::GetList(FORM_ID, $by, $order, ['STATUS_ID' => 1], $filtered);
// сортировку и признак фильтрации метод принимает по ссылке и меняет сам
while ($row = $rs->Fetch()) {
printf("%d %s %s\n", $row['ID'], $row['DATE_CREATE'], $row['USER_AUTH']);
}

Список результатов - обычная выборка с фильтром и сортировкой. Фильтр по статусу здесь важнее прочих: он отделяет новые заявки от уже разобранных сотрудниками.

Достаём ответы одного результата:

\CFormResult::GetDataByID($resultId, $questions, $answers, $fields);
foreach ($answers as $code => $values) {
printf("%-12s %s\n", $code, implode(', ', array_column($values, 'USER_TEXT')));
}
// вопросы приходят отдельным массивом, служебные поля - третьим

Ответы разложены по кодам вопросов, а не по их названиям. Код задают при создании вопроса, и менять его потом не стоит: на него завязан весь свой код вокруг формы.

Меняем статус результата из кода:

\CFormResult::SetStatus($resultId, 2); // 2 - идентификатор своего статуса
// смена статуса умеет отправлять письмо, если оно настроено на этот статус

Статус - это и есть процесс обработки заявки. Без него заявки складываются в одну кучу, и через месяц никто не помнит, какие из них уже отработаны.

Выгружаем результаты в файл:

$out = fopen('/tmp/results.csv', 'w');
$rs = \CFormResult::GetList(FORM_ID, $by, $order, [], $filtered);
while ($row = $rs->Fetch()) {
\CFormResult::GetDataByID($row['ID'], $q, $a, $f);
fputcsv($out, [$row['ID'], $row['DATE_CREATE'], $a['NAME'][0]['USER_TEXT'] ?? '']);
}
fclose($out);

Выгрузка своим кодом нужна там, где столбцы задаёт заказчик. Штатная выгрузка из административного раздела отдаёт всё подряд и обычно требует ручной правки файла.

Проверяем права сотрудника на формы:

printf("право на модуль: %s\n", $APPLICATION->GetGroupRight('form'));
printf("группы: %s\n", implode(',', $USER->GetUserGroupArray()));
// право на модуль и право на конкретную форму настраиваются отдельно

Типичные проблемы

Посетитель не видит поле, добавленное в форму.

Значение заведено полем, а поля заполняются уже после сохранения результата. Всё, что вводит посетитель, описывают вопросами формы, а не её полями.

Вопрос не сохраняется и форма показывает ошибку.

У варианта ответа пустой текст, а платформа требует непустое значение. В такое поле ставят хотя бы пробел, если сам текст ответу не нужен.

После возврата из расширенного режима форма развалилась.

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

Заявки приходят, а письмо не уходит никому.

Почтовый шаблон неактивен, не привязан к сайту или у него пустые адреса. Проверяют активность почтового шаблона, привязку к сайту и заполненность обоих адресов.

В настройках формы нет статистики заполнения.

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

Таблица результатов разрослась до миллионов строк.

Старые результаты формы не выгружаются в файл и не чистятся годами. Заявки старше срока хранения выгружают в файл и удаляют по расписанию.

Частые вопросы

Чем вопрос отличается от поля?

Вопрос заполняет посетитель при отправке формы, поле - служебное хранилище. Поля удобны для меток источника и результатов обработки заявки.

Зачем результату статус?

Статус описывает процесс обработки: новая, в работе, обработана. Он же управляет письмами и правами на просмотр результатов.

Как отдать формы менеджерам, не пуская их дальше?

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

Как выгрузить ответы в свой формат?

Пройти по результатам выборкой и собрать нужные столбцы своим кодом. Штатная выгрузка отдаёт всё подряд и редко совпадает с ожиданиями заказчика.

Когда веб-форма перестаёт подходить?

Когда нужна сложная логика показа полей, шаги или своя вёрстка каждого поля. Тогда форму пишут своим кодом на контроллере и хранят заявки в своей таблице.

Смежное

Первоисточник