Настройка веб-формы - вопросы, статусы результатов, права
Разбираемся в устройстве веб-формы: вопросы против полей, статусы результатов, права сотрудников и выгрузка накопленных ответов.
Что нужно знать заранее
Вопрос и поле в веб-форме - разные вещи. Вопросы заполняет посетитель при отправке, поля заполняются уже после сохранения результата и служат служебным хранилищем.
Каждый ответ посетителя сохраняется отдельным результатом, и у результата есть статус. Статусы дают готовый процесс обработки: новая заявка, в работе, обработана, отклонена.
Права на конкретную форму раздаются группам отдельно от прав на сам модуль. Сотрудник может видеть список форм, но не видеть ни одного результата, и это нормальная настройка.
Шаги
- Собрать весь ввод посетителя вопросами формы, а служебные значения оставить полям.
- Описать статусы результатов под тот процесс обработки заявок, который принят у заказчика.
- Раздать права группам: кто видит результаты, кто меняет их статусы.
- Настроить письмо на новый результат и проверить его на тестовой отправке.
- Настроить выгрузку и чистку старых результатов, чтобы база не росла.
Решение
Читаем результаты формы с фильтром:
\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()));// право на модуль и право на конкретную форму настраиваются отдельноТипичные проблемы
Посетитель не видит поле, добавленное в форму.
Значение заведено полем, а поля заполняются уже после сохранения результата. Всё, что вводит посетитель, описывают вопросами формы, а не её полями.
Вопрос не сохраняется и форма показывает ошибку.
У варианта ответа пустой текст, а платформа требует непустое значение. В такое поле ставят хотя бы пробел, если сам текст ответу не нужен.
После возврата из расширенного режима форма развалилась.
Обратное переключение режима теряет структуру правил и внутренних связей самой формы. Переключение делают на копии формы, а не на той, что уже собирает заявки.
Заявки приходят, а письмо не уходит никому.
Почтовый шаблон неактивен, не привязан к сайту или у него пустые адреса. Проверяют активность почтового шаблона, привязку к сайту и заполненность обоих адресов.
В настройках формы нет статистики заполнения.
Раздел статистики опирается на модуль веб-аналитики, доступный не во всех редакциях. Замену этой статистике считают по результатам формы своим отчётом или внешней аналитикой.
Таблица результатов разрослась до миллионов строк.
Старые результаты формы не выгружаются в файл и не чистятся годами. Заявки старше срока хранения выгружают в файл и удаляют по расписанию.
Частые вопросы
Чем вопрос отличается от поля?
Вопрос заполняет посетитель при отправке формы, поле - служебное хранилище. Поля удобны для меток источника и результатов обработки заявки.
Зачем результату статус?
Статус описывает процесс обработки: новая, в работе, обработана. Он же управляет письмами и правами на просмотр результатов.
Как отдать формы менеджерам, не пуская их дальше?
Правом на модуль форм и правом на конкретную форму для их группы. Остальные разделы административной части при этом остаются закрытыми.
Как выгрузить ответы в свой формат?
Пройти по результатам выборкой и собрать нужные столбцы своим кодом. Штатная выгрузка отдаёт всё подряд и редко совпадает с ожиданиями заказчика.
Когда веб-форма перестаёт подходить?
Когда нужна сложная логика показа полей, шаги или своя вёрстка каждого поля. Тогда форму пишут своим кодом на контроллере и хранят заявки в своей таблице.
Смежное
- Формы и заявки - оглавление подтемы
- Форма обратной связи: веб-форма, письма, свой обработчик - постановка формы на страницу
- Заявка с формы не сохранилась: разбор причин - когда результата нет в списке
- Заявки с сайта: хранение, дубли, передача в CRM - что делать с заявками дальше
- Спам через формы сайта: капча, скрытое поле, ограничение частоты - защита формы от роботов
- Согласие на обработку данных: соглашение, компонент, запись факта - обязательная галочка формы
- Роли менеджеров: что видит и что может в админке - права на формы и результаты
- Контентные модули - устройство модулей контента целиком
- Ограничения веб-формы и правка анкеты - вкладка ограничений и правка анкеты посетителем