Смена адреса для сообщений формы обратной связи в зависимости от значения поля — различия между версиями
Williwaw (обсуждение | вклад) (Новая страница: «'''Актуально для версии 2.9.5''' == Задача == Предположим, в одной из форм обратной связи(пусть э…») |
Williwaw (обсуждение | вклад) |
||
(не показано 11 промежуточных версий этого же участника) | |||
Строка 6: | Строка 6: | ||
== Решение == | == Решение == | ||
− | + | Добавим в административной панели, в модуле "Обратная связь" необходимые списки адресов. в каждом списке будет содержаться один адрес электронной почты. | |
+ | Находим файл /classes/modules/webforms/, полностью копируем оттуда метод send и вставляем в файл __custom.php, в этой же директории. | ||
+ | Переименуем его, например, в send_custom. | ||
+ | Начальный код метода: | ||
<source lang="php"> | <source lang="php"> | ||
− | $ | + | 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 ''; | ||
+ | } | ||
+ | </source> | ||
+ | Так как на сайте может использоваться много форм, а нам необходимо, чтобы адреса менялись только у одной, добавим проверку на принадлежность сообщения к форме после строки: | ||
+ | |||
+ | <source lang="php"> | ||
+ | $iTime = new umiDate( time() ); | ||
</source> | </source> | ||
− | + | Если идентификатор формы обратной связи тот, который необходим, то, далее метод проверяет значение поля и, в зависимости от значения, | |
+ | выбирает нужный адрес и получателя: | ||
+ | |||
<source lang="php"> | <source lang="php"> | ||
− | foreach($ | + | 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); | ||
+ | |||
+ | } | ||
+ | ......//продолжите, если необходимо | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Стандартное получение адреса заключим в else{}: | ||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | 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); | ||
+ | } | ||
+ | } | ||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | [[Категория: | + | Далее, добавим проверку на то, каким образом мы получаем адрес, и смену адреса, в случае, если сообщение отправлено с "нужной" формы, после строки: |
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | $recpCount = 0; | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Проверка: | ||
+ | |||
+ | <source lang="php"> | ||
+ | |||
+ | 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++; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Теперь, осталось только изменить в шаблоне формы обратной связи action на "%pre_lang%/webforms/send_custom/ и добавить permissions.custom.php в директорию класса webforms | ||
+ | |||
+ | [[Категория:Написание кастомных макросов]][[Категория:Модуль Обратная связь]] |
Текущая версия на 06:34, 19 февраля 2014
Актуально для версии 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