在ZF2
中,我正在尝试使用DOMPDFModule
生成PDF并使用EmailZF2
通过电子邮件发送。
这是我在控制器中所做的事情:
// fetch data
$user = $this->getEntityManager()->getRepository('Application\Entity\Users')->find(1);
$address = $this->getEntityManager()->getRepository('Application\Entity\Addresses')->find(1);
// generate PDF
$pdf = new PdfModel();
$pdf->setOption('filename', 'Renter_application-report-' . date("Y_m_d"));
$pdf->setOption('paperSize', 'a4');
$pdf->setVariables(array(
'User' => $user,
'Address' => $address,
));
到目前为止一切顺利,但DOMPDFModule
要求我return $pdf
提示生成PDF,DOMPDF
似乎没有效果(例如$pdf->render()
或{ {1}})。
我还试图将自己的视图呈现失败,如下所示(可能是标题生成的一些问题?)
$pdf->output()
最后,我们的目标是获得这个呈现的PDF并将其保存在某处以便能够附加它或直接附加它 - 即使只是
// Render PDF
$pdfView = new ViewModel($pdf);
$pdfView->setTerminal(true)
->setTemplate('Application/index/pdf')
->setVariables(array(
'User' => $user,
'Address' => $address,
));
$pdfOutput = $this->getServiceLocator()
->get('viewrenderer')
->render($pdfView);
我设法通过使用这些行编辑文件// Save PDF to disk
$file_to_save = '/path/to/pdf/file.pdf';
file_put_contents($file_to_save, $pdfOutput);
// Send Email
$view = new ViewModel(array(
'name' => $User->getName(),
));
$view->setTerminal(true);
$view->setTemplate('Application/view/emails/user');
$this->mailerZF2()->send(array(
'to' => $User->getEmail(),
'subject' => 'Test email'
), $view, $file_to_save);
以附加PDF来实现工作:
\src\EmailZF2\Controller\Plugin\Mailer.php
感谢任何帮助,谢谢! :)
答案 0 :(得分:1)
我不知道这是不是正确的方式,但我设法让它工作,所以我会发布我们是如何做的,以防其他人遇到同样的问题。
我使用DOMPDFModule
作为基本引擎,然后在控制器中,在生成PDF的操作中,我通过Viewmodel
呈现PDF以使用视图脚本作为模板
use Zend\View\Model\ViewModel,
DOMPDFModule\View\Model\PdfModel;
...
public function indexAction()
{
$User = $this->getEntityManager()->getRepository('Application\Entity\Users')->find(1);
// generate PDF
$pdf = new PdfModel();
$pdf->setOption('filename', 'user_details-' . date("Y_m_d"));
$pdf->setOption('paperSize', 'a4');
$pdf->setVariables(array(
'User' => $User,
));
// Render PDF
$pdfView = new ViewModel($pdf);
$pdfView->setTerminal(true)
->setTemplate('Application/index/pdf.phtml')
->setVariables(array(
'User' => $User,
));
$html = $this->getServiceLocator()->get('viewpdfrenderer')->getHtmlRenderer()->render($pdfView);
$eng = $this->getServiceLocator()->get('viewpdfrenderer')->getEngine();
$eng->load_html($html);
$eng->render();
$pdfCode = $eng->output();
// Send the email
$mailer->sendEmail($User->getId(), $pdfCode);
}
emailzf2
模块也已弃用,自定义邮件程序模块现在管理电子邮件的附件和发送。为此,在Mailer/config/module.config.php
中注册了一项新服务:
'view_manager' => array(
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
'service_manager' => array(
'factories' => array(
__NAMESPACE__ . '\Service\MailerService' => __NAMESPACE__ . '\Service\MailerServiceFactory',
),
),
对文件Mailer/src/Mailer/Service/MailerServiceFactory.php
的哪些引用:
<?php
namespace Mailer\Service;
use Mailer\Service\MailerService;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MailerServiceFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$entityManager = $serviceLocator->get('Doctrine\ORM\EntityManager');
$viewRenderer = $serviceLocator->get('ViewRenderer');
$config = $serviceLocator->get('config');
return new MailerService($entityManager, $viewRenderer, $config);
}
}
Mailer/src/Mailer/Service/MailerService.php
:
use Zend\Mime\Message as MimeMessage;
use Zend\View\Model\ViewModel;
class MailerService
{
protected $em;
protected $view;
protected $config;
protected $options;
protected $senderName;
protected $senderEmail;
public function __construct(\Doctrine\ORM\EntityManager $entityManager, $viewRenderer, $config)
{
$this->em = $entityManager;
$this->view = $viewRenderer;
$this->config = $config;
$this->options = array(
'name' => $config['mailer']['smtp_host'],
);
$this->senderName = $config['mailer']['sender']['from_name'];
$this->senderEmail = $config['mailer']['sender']['from_address'];
}
protected function send($fromAddress, $fromName, $toAddress, $toName, $subject, $bodyParts)
{
// setup SMTP options
$options = new Mail\Transport\SmtpOptions($this->options);
$mail = new Mail\Message();
$mail->setBody($bodyParts);
$mail->setFrom($fromAddress, $fromName);
$mail->setTo($toAddress, $toName);
$mail->setSubject($subject);
$transport = new Mail\Transport\Smtp($options);
$transport->send($mail);
}
protected function setBodyHtml($content, $pdf = null, $pdfFilename = null) {
$html = new MimePart($content);
$html->type = "text/html";
$body = new MimeMessage();
if ($pdf != '') {
$pdfAttach = new MimePart($pdf);
$pdfAttach->type = 'application/pdf';
$pdfAttach->filename = $pdfFilename;
$pdfAttach->encoding = \Zend\Mime\Mime::ENCODING_BASE64;
$pdfAttach->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT;
$body->setParts(array($html, $pdfAttach));
} else {
$body->setParts(array($html));
}
return $body;
}
public function sendEmail($UserId)
{
$User = $this->em->getRepository('Application\Entity\Users')->find($UserId);
$vars = array( 'firstname' => $User->getFirstname(),
'lastname' => $User->getLastname());
$content = $this->view->render('emails/user-profile', $vars);
$body = $this->setBodyHtml($content);
$sendToName = $User->getOaFirstname() .' '. $User->getLastname();
$this->send($this->senderEmail, $this->senderName, $User->getEmailAddress(), $sendToName, 'User profile', $body);
}
}