Прикрепление файла к автоответу, которое присылается пользователю, после отправки формы обратной свзяи

Материал из Umicms
Перейти к:навигация, поиск


Актуально для версии 2.9

Задача: Отправлять пользователю автоответ с прикрепленным файлом, после отправки им сообщения через форму обратной связи.

Пример применения: пользователь решил запросить прайс лист вашей продукции, а вам нужно взамен на прайс лист получить данные пользователя. Пользователь заполняет форму обратной связи (email, имя и т.д.), и ему автоответом приходит письмо, в котором прикреплен файл прайс листа.

Реализация: В модуле обратная связь нужно создать форму обратной связи. Подробная информация о создании формы обратной связи находится в документации по адресу: http://help.docs.umi-cms.ru/rabota_s_modulyami/modul_obratnaya_svyaz/

После создания формы обратной связи нужно зайти в модуль "Шаблоны данных" и найти там тип данных "Шаблон письма". В этом типе данных нужно добавить группу полей, неважно какого названия и поле с названием, например:"Вложенный файл", тип поля должен быть "Файл", идентификатор (например, 'attfile') этого поля будет впоследствии использован в кастомном макросе, который будет описан ниже. Далее, нужно перенести, только что созданное поле в группу полей "Автоответ".

Сохраняем изменения и заходим на вкладку "Шаблоны писем" модуля "Обратная связь", добавляем шаблон письма. Тут нас интересует три секции — это "Письмо", "Принадлежность к форме" и "Автоответ".В блоке "Принадлежность к форме" нужно выбрать форму, с которой пользователь будет работать. Блок "Письмо" — вводите свою информацию, чтобы получить уведомление на почту, о том, что написали. В блоке "Автоответ" — собственно шаблон автоответа и файл, который будет отправляться пользователю.

  • Адрес отправителя — укажите произвольный адрес, далее все поправим.
  • Имя отправителя — имя отправителя
  • Тема — собственно тема письма
  • Тело — можно оставить пустым или написать — прайс приложен к письму.
  • Вложенный файл (название созданного Вами поля) — прикрепленный файл, который нужно отправить.


Теперь, нужно добавить код кастомизированнго метода webforms send(). Отрываем файл \classes\modules\webforms\__custom.php и добавляем туда следующий код:

public function custom_send() {
    // 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();
 
        /*
         *  $user_email - Email пользователя. ['data']['new']['название_поля_из_админки']
         *  $user_name - Вежливое обращение к пользователю ['data']['new']['название_поля_из_админки']
         */
        $user_email = $_REQUEST['data']['new']['email'];
        $user_name = $_REQUEST['data']['new']['vashe_imya'];
 
        // Стандартная строчка UMI.CMS
        // $oMailReply->addRecipient( $aMessage['from_email_template'], $aMessage['from_template'] );
 
        // Заменили на:
        $oMailReply->addRecipient( $user_email, $user_name );
 
        // Формирование темы, установка от кого...
        $oMailReply->setFrom($aMessage['autoreply_from_email_template'], $aMessage['autoreply_from_template']);
        $oMailReply->setSubject($aMessage['autoreply_subject_template']);
        $oMailReply->setContent($aMessage['autoreply_template']);
 
        /*
         * Прикрепление файла
         */
        $f = "."; // Нужно!
        $f .= $aMessage['attfile']; // название поля прикрепленного файла из админки, посмотреть можно в Шаблонах данных.
 
        $oFile = new umiFile($f); // создание нового файла
        if (!$oFile->getIsBroken()) { //Возвращает false, если файл существует и доступен скрипту на чтение.
            $oMailReply->attachFile($oFile); // прикрепление файла к письму
        } else {
            echo "Файл не существует.";
        }
        // Отправка письма
        $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 '';
}

Также, в директорию \classes\modules\webforms\ нужно добавить файл permissions.custom.php со следующим содержанием:

<?php
    $permissions = Array(
        'add'       => array('custom_send')
    );
?>

Осталось внести изменения в шаблон.
Для XSLT шаблонизатора: в шаблоне <xsl:template match="udata[@module = 'webforms'][@method = 'add']"> для шаблона дизайна "Современный интернет-магазин demodizzy" в файле templates\demodizzy\xslt\modules\webforms\add.xsl. Нужно, чтобы action у тега <form> выглядел так: action="{$lang-prefix}/webforms/custom_send/"

Для TPL шаблонизатора: в директории \data\reflection в файле шаблона по выводу формы обратной свзяи (по умолчанию webforms.tpl) Нужно, чтобы action у тега <form> выглядел так: action="{$lang-prefix}/webforms/custom_send/"