UMI.CMS. Как прикрепить файл к отправляемому письму или автоответ со вложенным файлом
Давненько я не писал про работу с UMI.CMS, нужно исправлять ситуацию.
Не так давно на работе столкнулись с такой задачей — нужно было прикрепить файл к письму, но к тому который отправляет пользователь, такие варианты решения есть на wiki UMi.CMS, а к тому, который отправляется пользователю — автоответ на его письмо. Как говорит wiki.umisoft.ru такой возможности нет.
Стандартного функционала, для прикрепления загруженного файла к письму, которое придет администратору — не предусмотрено. Однако, имеется возможность указать в письме прямую ссылку на загруженный файл.
Для того, чтобы ясно понимать ситуацию прикрепления файла в автоответе пользователю, вот пример - пользователь решил запросить прайс лист вашей продукции, а вам нужно взамен на прайс лист получить данные пользователя. Ну я думаю примерно задача ясна, теперь я вам все распишу. Первое что нужно сделать — это в UMI.CMS создать новую форму связи. Нужно перейти в Модули -> Обратная связь. Если у вас нет формы связи, то нужно ее создать. Я не буду описывать процесс создания формы, в документации UMI.CMS это прекрасно описано. Если у вас формы есть, то вам этот шаг нужно пропустить 😉 Сразу переходите в Модули -> Шаблоны данных и тут нужно найти «Шаблон письма»
Заходите. Добавляете новую группу: Группу обзываете «Прикрепленные файлы», ну или так, как удобно вам.Добавляете новые поля типа «Файл». Добавить вы можете то количество, которое вы хотите, чтобы пользователь получил на почту. В моем случае это было три, но отправлялось по одному, в зависимости от условия(их я описывать не буду, опишу лишь общие принципы) После того, как поле добавлено, его нужно перетащить в секцию «Автоответ»: После того, как все сделано, нужно нажать «сохранить и выйти». Идем далее. Сейчас нужно перейти в «Шаблоны писем», модуля «Обратная связь» — /admin/webforms/templates/. Теперь кликнуть по кнопке «Добавить шаблон» Далее нужно настроить шаблон письма. Если не поймете, что за что отвечает, почитайте документацию ;). Тут нас интересует три секции — это «Письмо», «Принадлежность к форме» и «Автоответ».
В блоке «Принадлежность к форме» нужно выбрать форму, с которой пользователь будет работать.
Блок «Письмо» — вводите свою информацию, чтобы получить уведомление на почту, о том, что написали.
В блоке «Автоответ» — собственно шаблон автоответа и файл, который будет отправляться пользователю.
Настраиваем автоответ.
- Адрес отправителя — укажите произвольный адрес, далее все поправим.
- Имя отправителя — имя отправителя 😉
- Тема — собственно тема письма
- Тело — можно оставить пустым или написать — прайс приложен к письму.
- Прайс 1 (может быть ваше имя) — прикрепленный файл, который нужно отправить.
На этом работа с админ панелью 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'] модернизировать тег