在使用SonataAdminBundle编辑记录后,我需要发送基于模板的电子邮件。
在普通网站中,我在控制器中发送电子邮件。像这样:
$message = \Swift_Message::newInstance()
->setContentType('text/html')
->setSubject('Subject')
->setFrom('from@site.com')
->setTo($member->getEmail())
->setBody(
$this->renderView(
'AcmeSiteBundle:Site:email.html.twig',
array('name' => $member->getFirstName())
)
)
;
$this->get('mailer')->send($message);
但是在管理员中我配置了从扩展的 configureFormFields , preUpdate , postUpdate MyAdmin 的方法管理员的
答案 0 :(得分:5)
解决方案是:使用EventListener。
使用以下代码在 VendorName / SiteBundle / EventListener 中创建文件 AdminApplicationListener.php :
<?php
namespace VendorName\SiteBundle\EventListener;
class AdminApplicationListener
{
/**
*
* @var Swift_Mailer
*/
private $__mailer = null;
private $__templating = null;
public function __construct(\Swift_Mailer $mailer, $templating)
{
$this->__mailer = $mailer;
$this->__templating = $templating;
}
public function onApplication( \Sonata\AdminBundle\Event\PersistenceEvent $event )
{
$ac = $event->getObject();
$message = \Swift_Message::newInstance()
->setContentType('text/html')
->setSubject('[VendorName] Object was edited')
->setFrom('admin@VendorName.ru')
->setTo($ac->getEmail())
->setBody(
$this->__templating->render(
'VendorNameSiteBundle:Admin:email.html.twig',
array('name' => $ac->getFirstName())
)
)
;
$this->__mailer->send($message);
}
}
在 VendorName / SiteBundle / Resources / config / services.yml 中添加:
services:
vendor_name.admin.on_application:
class: VendorName\SiteBundle\EventListener\AdminApplicationListener
arguments:
mailer: @mailer
templating: @templating
tags:
- { name: kernel.event_listener, event: sonata.admin.event.persistence.post_update, method: onApplication }
我认为这不是最佳做法,但是第一步就可以了:)