Смена адреса для сообщений формы обратной связи в зависимости от значения поля
Актуально для версии 2.9.5
Задача
Предположим, в одной из форм обратной связи(пусть это будет форма заказа) имеется поле типа выпадающий список, например "пункт выдачи товара". Необходимо, чтобы, в зависимости от выбранного пункта выдачи, письмо приходило на определенный адрес.
Решение
Добавим в административной панели, в модуле "Обратная связь" необходимые списки адресов. в каждом списке будет содержаться один адрес электронной почты. Находим файл /classes/modules/webforms/, полностью копируем оттуда метод send и вставляем в файл __custom.php, в этой же директории. Переименуем его, например, в send_custom. Начальный код метода:
public function send_custom() {
// Check captcha to know we should do anything
if (isset($_REQUEST['captcha'])) {
$_SESSION['user_captcha'] = md5((int) $_REQUEST['captcha']);
}
if (!umiCaptcha::checkCaptcha()) {
$this->errorNewMessage("%errors_wrong_captcha%");
$this->errorPanic();
}
if (defined('CURRENT_VERSION_LINE') && CURRENT_VERSION_LINE=='demo') {
$url = getRequest('ref_onsuccess');
if (!$url) $url = $this->pre_lang . "/webforms/posted/";
$this->redirect($url);
}
//-------------------------------------------------------------------
// Get necessary data
$sMsgBody = '';
$oTypes = umiObjectTypesCollection::getInstance();
$iBaseTypeId = $oTypes->getBaseType("webforms", "form");
$iFormTypeId = getRequest('system_form_id');
$sSenderIP = getServer('REMOTE_ADDR');
$iTime = new umiDate( time() );
$aAddresses = getRequest('system_email_to');
if(!is_array($aAddresses)) $aAddresses = array($aAddresses);
$aRecipients = array();
foreach($aAddresses as $address){
$sEmailTo = $this->guessAddressValue($address);
$sAddress = $this->guessAddressName($address);
$aRecipients[] = array('email'=>$sEmailTo, 'name'=>$sAddress);
}
if(!$oTypes->isExists($iFormTypeId) || $oTypes->getParentClassId($iFormTypeId) != $iBaseTypeId) {
$this->errorNewMessage("%wrong_form_type%");
$this->errorPanic();
}//
if(($ef = $this->checkRequiredFields($iFormTypeId)) !== true) {
$this->errorNewMessage(getLabel('error-required_list').$this->assembleErrorFields($ef));
}
//-------------------------------------------------------------------
// Saving message and preparing it for sending
$_REQUEST['data']['new']['sender_ip'] = $sSenderIP; // Hack for saving files-only-forms
$oObjectsCollection = umiObjectsCollection::getInstance();
$iObjectId = $oObjectsCollection->addObject($sAddress, $iFormTypeId);
cmsController::getInstance()->getModule('data')->saveEditedObject($iObjectId, true);
$oObject = $oObjectsCollection->getObject($iObjectId);
$oObject->setValue('destination_address', $sEmailTo);
$oObject->setValue('sender_ip', $sSenderIP);
$oObject->setValue('sending_time', $iTime);
$aMessage = $this->formatMessage($iObjectId, true);
//--------------------------------------------------------------------
// Make an e-mail
$oMail = new umiMail();
//--------------------------------------------------------------------
// Determine file fields
$aFTypes = array('file', 'img_file', 'swf_file');
$aFields = $oTypes->getType($oObject->getTypeId())->getAllFields();
$aFileFields = array();
foreach($aFields as $oField) {
$oType = $oField->getFieldType();
if(in_array($oType->getDataType(), $aFTypes)) {
$oFile = $oObject->getValue($oField->getName());
if($oFile instanceof umiFile) {
$oMail->attachFile($oFile);
} /*else {
$this->errorNewMessage("%errors_wrong_file_type%");
$this->errorPanic();
}*/
}
}
$recpCount = 0;
foreach($aRecipients as $recipient) {
foreach(explode(',', $recipient['email']) as $sAddress) {
if(strlen(trim($sAddress))) {
$oMail->addRecipient( trim($sAddress), $recipient['name'] );
$recpCount++;
}
}
}
if(!$recpCount) {
$this->errorNewMessage(getLabel('error-no_recipients'));
}
$oMail->setFrom($aMessage['from_email_template'], $aMessage['from_template']);
$oMail->setSubject($aMessage['subject_template']);
$oMail->setContent($aMessage['master_template']);
$oMail->commit();
$oMail->send();
//--------------------------------------------------------------------
// Send autoreply if should
if(strlen($aMessage['autoreply_template'])) {
$oMailReply = new umiMail();
$oMailReply->addRecipient( $aMessage['from_email_template'], $aMessage['from_template'] );
$oMailReply->setFrom($aMessage['autoreply_from_email_template'], $aMessage['autoreply_from_template']);
$oMailReply->setSubject($aMessage['autoreply_subject_template']);
$oMailReply->setContent($aMessage['autoreply_template']);
$oMailReply->commit();
$oMailReply->send();
}
//--------------------------------------------------------------------
// Process events
$oEventPoint = new umiEventPoint("webforms_post");
$oEventPoint->setMode("after");
$oEventPoint->setParam("email", $aMessage['from_email_template']);
$oEventPoint->setParam("message_id", $iObjectId);
$oEventPoint->setParam("form_id", $iFormTypeId);
$oEventPoint->setParam("fio", $aMessage['from_template']);
$this->setEventPoint($oEventPoint);
//--------------------------------------------------------------------
// Redirecting
$sRedirect = getRequest('ref_onsuccess');
if($sRedirect) $this->redirect($sRedirect);
//--------------------------------------------------------------------
// Or showing the message
$sTemplateName = getRequest('system_template');
if($sTemplateName) {
list($sSuccessString) = def_module::loadTemplates("data/reflection/".$sTemplateName, "send_successed");
if(strlen($sSuccessString)) return $sSuccessString;
}
//--------------------------------------------------------------------
// If we're still here
if(isset($_SERVER['HTTP_REFERER'])) $this->redirect($_SERVER['HTTP_REFERER']);
return '';
}
Так как на сайте может использоваться много форм, а нам необходимо, чтобы адреса менялись только у одной, добавим проверку на принадлежность сообщения к форме после строки:
$iTime = new umiDate( time() );
Если идентификатор формы обратной связи тот, который необходим, то, далее метод проверяет значение поля и, в зависимости от значения, выбирает нужный адрес и получателя:
if($iFormTypeId=='id_формы_обратной_связи'){
$value = $_REQUEST['data']['new']['идентификатор_поля_выпадающего_списка'];
if($value=='id_позиции в справочнике'){
$AdressObject = umiObjectsCollection::getObject('id_объекта_список_адресов');
$sEmailTo=$AdressObject->getValue('address_list');
$sAddress=$AdressObject->getName();
trim($sEmailTo);
}
else if($value=='id_позиции в справочнике'){
$AdressObject = umiObjectsCollection::getObject('id_объекта_список_адресов');
$sEmailTo=$AdressObject->getValue('address_list');
$sAddress=$AdressObject->getName();
trim($sEmailTo);
}
......//продолжите, если необходимо
}
Стандартное получение адреса заключим в else{}:
else{
$aAddresses = getRequest('system_email_to');
if(!is_array($aAddresses)) $aAddresses = array($aAddresses);
$aRecipients = array();
foreach($aAddresses as $address){
$sEmailTo = $this->guessAddressValue($address);
$sAddress = $this->guessAddressName($address);
$aRecipients[] = array('email'=>$sEmailTo, 'name'=>$sAddress);
}
}
Далее, добавим проверку на то, каким образом мы получаем адрес, и смену адреса, в случае, если сообщение отправлено с "нужной" формы, после строки:
$recpCount = 0;
Проверка:
if (isset($aRecipients)){
foreach($aRecipients as $recipient) {
foreach(explode(',', $recipient['email']) as $sAddress) {
if(strlen(trim($sAddress))) {
$oMail->addRecipient( trim($sAddress), $recipient['name'] );
$recpCount++;
}
}
}
}
else{
$oMail->addRecipient( $sEmailTo, $sAddress );
if(!empty($sEmailTo)){
$recpCount++;
}
}
Теперь, осталось только изменить в шаблоне формы обратной связи action на "%pre_lang%/webforms/send_custom/ и добавить permissions.custom.php в директорию класса webforms