渲染PDF并附加到电子邮件(使用DOMPDFModule和EmailZF2)

时间:2013-08-20 10:15:03

标签: pdf-generation zend-framework2 dompdf

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

感谢任何帮助,谢谢! :)

1 个答案:

答案 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);
    }
}