Magento: Как отправить контактную форму по электронной почте с приложением в magento?
Есть ли какая-либо функциональность по умолчанию в Magento для простой контактной формы, которая должна отправить файл вложения? Или мне нужно настроить его с помощью почтовой функции Zend? Любая помощь или предложения будут оценены.
5 ответов
кнопка добавления файла в контактной форме
Чтобы избежать редактирования файла phtml, я люблю использовать события:
создать наблюдателя в config.xml:
<events> <core_block_abstract_to_html_after> <observers> <add_file_boton> <type>singleton</type> <class>contactattachment/observer</class> <method>addFileBoton</method> </add_file_boton> </observers> </core_block_abstract_to_html_after> </events>
Наблюдатель:
class Osdave_ContactAttachment_Model_Observer { public function addFileBoton($observer) { $block = $observer->getEvent()->getBlock(); $nameInLayout = $block->getNameInLayout(); if ($nameInLayout == 'contactForm') { $transport = $observer->getEvent()->getTransport(); $block = Mage::app()->getLayout()->createBlock('contactattachment/field'); $block->setPassingTransport($transport['html']); $block->setTemplate('contactattachment/field.phtml') ->toHtml(); } return $this; } }
класс блока (который вы только что создали в обозревателе):
class Osdave_ContactAttachment_Block_Field extends Mage_Core_Block_Template { private $_passedTransportHtml; /** * adding file select field to contact-form * @param type $transport */ public function setPassingTransport($transport) { $this->_passedTransportHtml = $transport; } public function getPassedTransport() { return $this->_passedTransportHtml; } }
файл.phtml, в который вы добавляете в форму атрибут enctype и добавляете входные данные:
<?php $originalForm = $this->getPassedTransport(); $originalForm = str_replace('action', 'enctype="multipart/form-data" action', $originalForm); $lastListItem = strrpos($originalForm, '</li>') + 5; echo substr($originalForm, 0, $lastListItem); ?> <li> <label for="attachment"><?php echo $this->__('Select an attachment:') ?></label> <div class="input-box"> <input type="file" class="input-text" id="attachment" name="attachment" /> </div> </li> <?php echo substr($originalForm, $lastListItem); ?>
обрабатывает вложение
вам нужно переписать Magento Contacts IndexController, чтобы загрузить файл туда, куда вы хотите, и добавить ссылку в электронное письмо.
config.xml:
<global> ... <rewrite> <osdave_contactattachment_contact_index> <from><![CDATA[#^/contacts/index/#]]></from> <to>/contactattachment/contacts_index/</to> </osdave_contactattachment_contact_index> </rewrite> ... </global> <frontend> ... <routers> <contactattachment> <use>standard</use> <args> <module>Osdave_ContactAttachment</module> <frontName>contactattachment</frontName> </args> </contactattachment> </routers> ... </frontend>
контроллер:
<?php /** * IndexController * * @author david */ require_once 'Mage/Contacts/controllers/IndexController.php'; class Osdave_ContactAttachment_Contacts_IndexController extends Mage_Contacts_IndexController { public function postAction() { $post = $this->getRequest()->getPost(); if ( $post ) { $translate = Mage::getSingleton('core/translate'); /* @var $translate Mage_Core_Model_Translate */ $translate->setTranslateInline(false); try { $postObject = new Varien_Object(); $postObject->setData($post); $error = false; if (!Zend_Validate::is(trim($post['name']) , 'NotEmpty')) { $error = true; } if (!Zend_Validate::is(trim($post['comment']) , 'NotEmpty')) { $error = true; } if (!Zend_Validate::is(trim($post['email']), 'EmailAddress')) { $error = true; } if (Zend_Validate::is(trim($post['hideit']), 'NotEmpty')) { $error = true; } if ($error) { throw new Exception(); } //upload attachment try { $uploader = new Mage_Core_Model_File_Uploader('attachment'); $uploader->setAllowedExtensions(array('jpg','jpeg','gif','png')); $uploader->setAllowRenameFiles(true); $uploader->setAllowCreateFolders(true); $result = $uploader->save( Mage::getBaseDir('media') . DS . 'contact_attachments' . DS ); $fileUrl = str_replace(Mage::getBaseDir('media') . DS, Mage::getBaseUrl('media'), $result['path']); } catch (Exception $e) { Mage::getSingleton('customer/session')->addError(Mage::helper('contactattachment')->__('There has been a problem with the file upload')); $this->_redirect('*/*/'); return; } $mailTemplate = Mage::getModel('core/email_template'); /* @var $mailTemplate Mage_Core_Model_Email_Template */ $mailTemplate->setDesignConfig(array('area' => 'frontend')) ->setReplyTo($post['email']) ->sendTransactional( Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE), Mage::getStoreConfig(self::XML_PATH_EMAIL_SENDER), Mage::getStoreConfig(self::XML_PATH_EMAIL_RECIPIENT), null, array('data' => $postObject) ); if (!$mailTemplate->getSentSuccess()) { throw new Exception(); } $translate->setTranslateInline(true); Mage::getSingleton('customer/session')->addSuccess(Mage::helper('contacts')->__('Your inquiry was submitted and will be responded to as soon as possible. Thank you for contacting us.')); $this->_redirect('*/*/'); return; } catch (Exception $e) { $translate->setTranslateInline(true); Mage::getSingleton('customer/session')->addError(Mage::helper('contacts')->__('Unable to submit your request. Please, try again later')); $this->_redirect('*/*/'); return; } } else { $this->_redirect('*/*/'); } } }
в контроллере нужно добавить $fileUrl
в шаблоне электронной почты, и в вашем файле шаблона электронной почты вам нужно повторить его.
Я думаю, что это все, дайте мне знать, если у вас возникли проблемы с этим.
ура
Для добавления вложения в электронное письмо вам необходимо использовать следующую функцию Zend_Mail:
public function createAttachment($body,
$mimeType = Zend_Mime::TYPE_OCTETSTREAM,
$disposition = Zend_Mime::DISPOSITION_ATTACHMENT,
$encoding = Zend_Mime::ENCODING_BASE64,
$filename = null)
{
Вот пример использования его с Magento для прикрепления файла PDF к электронному письму:
$myEmail = new new Zend_Mail('utf-8'); //see app/code/core/Mage/Core/Model/Email/Template.php - getMail()
$myEmail->createAttachment($file,'application/pdf',Zend_Mime::DISPOSITION_ATTACHMENT,Zend_Mime::ENCODING_BASE64,$name.'.pdf');
Вы можете использовать это расширение для вдохновения: Fooman Email Attachments
Не связано с Magento, но я использую PHP SwiftMailer (http://swiftmailer.org/):
require_once('../lib/swiftMailer/lib/swift_required.php');
...
$body="Dear $fname,\n\nPlease find attached, an invoice for the period $startDate - $endDate\n\nBest regards,\n\nMr X";
$message = Swift_Message::newInstance('Subject goes here')
->setFrom(array($email => "no-reply@mydomain.com"))
->setTo(array($email => "$fname $lname"))
->setBody($body);
$message->attach(Swift_Attachment::fromPath("../../invoices_unpaid/$id.pdf"));
$result = $mailer->send($message);
Не уверен в функциональности по умолчанию, но это может помочь - http://ecommercesoftwaresolutionsonline.com/magento-enquiry-feedback-form-with-attachment-extension.html
Вот пост, описывающий, как легко вы можете отправить электронное письмо с вложениями: