UMI.CMS. Как прикрепить файл к отправляемому письму или автоответ со вложенным файлом

UMI.CMS. Как прикрепить файл к отправляемому письму или автоответ со вложенным файлом
Давненько я не писал про работу с UMI.CMS, нужно исправлять ситуацию.

Не так давно на работе столкнулись с такой задачей — нужно было прикрепить файл к письму, но к тому который отправляет пользователь, такие варианты решения есть на wiki UMi.CMS, а к тому, который отправляется пользователю — автоответ на его письмо. Как говорит wiki.umisoft.ru такой возможности нет.

Стандартного функционала, для прикрепления загруженного файла к письму, которое придет администратору — не предусмотрено. Однако, имеется возможность указать в письме прямую ссылку на загруженный файл.

Для того, чтобы ясно понимать ситуацию прикрепления файла в автоответе пользователю, вот пример - пользователь решил запросить прайс лист вашей продукции, а вам нужно взамен на прайс лист получить данные пользователя. Ну я думаю примерно задача ясна, теперь я вам все распишу. Первое что нужно сделать — это в UMI.CMS создать новую форму связи. Нужно перейти в Модули -> Обратная связь. Если у вас нет формы связи, то нужно ее создать. Я не буду описывать процесс создания формы, в документации UMI.CMS это прекрасно описано. Если у вас формы есть, то вам этот шаг нужно пропустить 😉 Сразу переходите в Модули -> Шаблоны данных и тут нужно найти «Шаблон письма»

Шаблон письма. UMI.CMS Заходите. Добавляете новую группу:Добавить группу. UMI.CMS Группу обзываете «Прикрепленные файлы», ну или так, как удобно вам.Прикрепленные файлы UMI.CMSДобавляете новые поля типа «Файл». Добавить вы можете то количество, которое вы хотите, чтобы пользователь получил на почту. В моем случае это было три, но отправлялось по одному, в зависимости от условия(их я описывать не буду, опишу лишь общие принципы)Отправка файла UMI.CMS После того, как поле добавлено, его нужно перетащить в секцию «Автоответ»: Автоответ UMI.CMS После того, как все сделано, нужно нажать «сохранить и выйти». Идем далее. Сейчас нужно перейти в «Шаблоны писем», модуля «Обратная связь» — /admin/webforms/templates/. Теперь кликнуть по кнопке «Добавить шаблон» Добавить шаблон UMI.CMS Далее нужно настроить шаблон письма. Если не поймете, что за что отвечает, почитайте документацию ;). Тут нас интересует три секции — это «Письмо», «Принадлежность к форме» и «Автоответ».

В блоке «Принадлежность к форме» нужно выбрать форму, с которой пользователь будет работать.

Блок «Письмо» — вводите свою информацию, чтобы получить уведомление на почту, о том, что написали.

В блоке «Автоответ» — собственно шаблон автоответа и файл, который  будет отправляться пользователю.

Настраиваем автоответ.

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

Автоответ с pontyk.com.ua Добавить и выйти.

На этом работа с админ панелью UMI.CMS закончена, давайте настроим отправку прикрепленного файла в автоответе UMI.CMS.

Нужно открыть папку \classes\modules\webforms, в этой папочке найти файл __custom.php. В этом файле будет находится функция стандартная функция UMI.CMS  send (), но немного модернизированная для целей отправки файла. Отойду немного от темы, функция send () находится в файле custom.php, строка #362.

Теперь в файл __custom.php нужно добавить вот этот код, там где нужно, я все прокомментировал. Все начинается после // Send autoreply if should

public function pontyk_com_ua_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['prajs_1']; // название поля прикрепленного файла из админки, посмотреть можно в Шаблонах данных.

        $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 '';
}

На это не все. Нужно создать в той же папке файл permissions.custom.php, для того, чтобы неавторизированный пользователь мог работать с формой/функцией pontyk_com_ua_send ()

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

Вот теперь все, в этой папке;) Теперь нужно немного модернизировать форму, с которой работает пользователь на front-end. Для этого нужно открыть шаблон который отвечает за отображение формы, он должен быть в папке вашей темы — \data\reflection. У меня это шаблон по умолчанию webforms.tpl. Далее в секции $FORMS['form_block'] модернизировать тег

, и лучше просто заменить на:

<form enctype="multipart/form-data" method="post" action="%pre_lang%/webforms/pontyk_com_ua_send/">

Вот теперь все. Можно отправлять пользователю файлы на почту в автоответе через UMI.CMS.
На всякий случай вот файлы исходники