Перехватить результат и дополнить его полем. Веб-форма Битрикс

Задача

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

Решение

  1. Перехватываем событие перед добавлением нового результата.

  2. Получаем значение из select.

  3. Получаем email.

  4. Добавляем в массив с результатами формы.


Скрытое поле

Добавляем в вопросы формы скрытое поле куда будем передавать наш email

В шаблоне письма

заменяем

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

/**
 * Форма "Обратная связь".
 *
 * Перед сохранением формы, перезаписываем email получателя в зависимости от выбранного Отделения.
 * Id:1 - Форма для физических лиц.
 * Id:2 - Форма для юридических лиц.
 */
$eventManager->addEventHandler(
    'form',
    'onBeforeResultAdd',
    'onBeforeResultAddHandler'
);

function onBeforeResultAddHandler($WEB_FORM_ID, &$arFields, &$arrVALUES)
{
    if ($WEB_FORM_ID == 1 || $WEB_FORM_ID == 2) {
        Loader::includeModule('iblock');

        $tableResult = OrmAnswerTable::getList([
            'select' => ['MESSAGE'],
            'filter' => ['ID' => $arrVALUES['form_dropdown_organisation']],
            'cache' => ["ttl" => 3600],
        ])->fetch();

        $departmentName = $tableResult['MESSAGE']; // Название отделения.

        // Находим Email по названию отделения.
        $rawData = ElementDepartmentsTable::getList([
            'select' => ['ID', 'NAME', 'EMAIL_' => 'EMAIL'],
            'filter' => ['NAME' => $departmentName],
            'cache' => ["ttl" => 3600],
        ])->fetch();

        // Записываем в скрытое поле email на который будет отправлен результат формы.
        if (!empty($rawData['EMAIL_VALUE'])) {
            $emailTo = $rawData['EMAIL_VALUE'];
            $arrVALUES['form_hidden_79'] = $rawData['EMAIL_VALUE'];
        } else {
            $rsSites = \CSite::GetByID('s1');
            $arSite = $rsSites->Fetch();
            $emailTo = $arSite['EMAIL'];
        }
        // Физ. Лица.
        if ($arrVALUES['form_hidden_79']) {
            $arrVALUES['form_hidden_79'] = $emailTo;
        }
        // Юр. Лица.
        if ($arrVALUES['form_hidden_80']) {
            $arrVALUES['form_hidden_80'] = $emailTo;
        }

        $data = [
            'WEB_FORM_ID' => $WEB_FORM_ID,
            'arFields' => $arFields,
            'arrVALUES' => $arrVALUES,
            'departmentName' => $departmentName,
            'rawData' => $rawData
        ];
        Bitrix\Main\Diag\Debug::writeToFile($data, date('d.m.Y H:i:s'), 'webForm.log');
    }
}

В select мы получаем ID ответа, а не его значение. Сам ID для нас не несет никакой полезной нагрузки для определения email куда отправлять.

Значение из select лежит в таблице b_form_answer. ORM Класса для этой таблицы нет, поэтому напишем его сами и по ID из select получим значение.

<?php

namespace Helper;

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\BooleanField;
use Bitrix\Main\ORM\Fields\DatetimeField;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\TextField;
use Bitrix\Main\ORM\Fields\Validators\LengthValidator;

class OrmAnswerTable extends DataManager
{
    /**
     * Returns DB table name for entity.
     *
     * @return string
     */
    public static function getTableName()
    {
        return 'b_form_answer';
    }

    /**
     * Returns entity map definition.
     *
     * @return array
     */
    public static function getMap()
    {
        return [
            new IntegerField(
                'ID',
                [
                    'primary' => true,
                    'autocomplete' => true,
                    'title' => Loc::getMessage('ANSWER_ENTITY_ID_FIELD'),
                ]
            ),
            new IntegerField(
                'FIELD_ID',
                [
                    'default' => 0,
                    'title' => Loc::getMessage('ANSWER_ENTITY_FIELD_ID_FIELD'),
                ]
            ),
            new DatetimeField(
                'TIMESTAMP_X',
                [
                    'title' => Loc::getMessage('ANSWER_ENTITY_TIMESTAMP_X_FIELD'),
                ]
            ),
            new TextField(
                'MESSAGE',
                [
                    'title' => Loc::getMessage('ANSWER_ENTITY_MESSAGE_FIELD'),
                ]
            ),
            new IntegerField(
                'C_SORT',
                [
                    'default' => 100,
                    'title' => Loc::getMessage('ANSWER_ENTITY_C_SORT_FIELD'),
                ]
            ),
            new BooleanField(
                'ACTIVE',
                [
                    'values' => array('N', 'Y'),
                    'default' => 'Y',
                    'title' => Loc::getMessage('ANSWER_ENTITY_ACTIVE_FIELD'),
                ]
            ),
            new StringField(
                'VALUE',
                [
                    'validation' => function()
                    {
                        return[
                            new LengthValidator(null, 255),
                        ];
                    },
                    'title' => Loc::getMessage('ANSWER_ENTITY_VALUE_FIELD'),
                ]
            ),
            new StringField(
                'FIELD_TYPE',
                [
                    'default' => 'text',
                    'validation' => function()
                    {
                        return[
                            new LengthValidator(null, 255),
                        ];
                    },
                    'title' => Loc::getMessage('ANSWER_ENTITY_FIELD_TYPE_FIELD'),
                ]
            ),
            new IntegerField(
                'FIELD_WIDTH',
                [
                    'title' => Loc::getMessage('ANSWER_ENTITY_FIELD_WIDTH_FIELD'),
                ]
            ),
            new IntegerField(
                'FIELD_HEIGHT',
                [
                    'title' => Loc::getMessage('ANSWER_ENTITY_FIELD_HEIGHT_FIELD'),
                ]
            ),
            new TextField(
                'FIELD_PARAM',
                [
                    'title' => Loc::getMessage('ANSWER_ENTITY_FIELD_PARAM_FIELD'),
                ]
            ),
        ];
    }
}