Задача
Результаты формы должны отправляться по почте на адрес, который зависит от того какое значение выбрали в select.
Решение
-
Перехватываем событие перед добавлением нового результата.
-
Получаем значение из select.
-
Получаем email.
-
Добавляем в массив с результатами формы.
Скрытое поле
Добавляем в вопросы формы скрытое поле куда будем передавать наш 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'),
]
),
];
}
}