визуализировать PDF и прикрепить к электронной почте (используя DOMPDFModule и EmailZF2)

В ZF2 я пытаюсь создать PDF-файл с помощью DOMPDFModule и отправить его по электронной почте с помощью 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() или $pdf->output()).

Я также безуспешно пытался отобразить представление самостоятельно следующим образом (может быть, какая-то проблема с генерацией заголовков?)

// 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);

Наконец, цель состоит в том, чтобы получить этот обработанный PDF-файл и сохранить его где-нибудь, чтобы иметь возможность прикрепить его или прикрепить сразу - даже так просто, как

// 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);

Что мне удалось заставить работать, отредактировав файл \src\EmailZF2\Controller\Plugin\Mailer.php с помощью этих строк, чтобы прикрепить PDF:

...
public function send($data = array(), $viewModel, $pdf)
...
if($pdf && file_exists($pdf)) {
    $pdf = fopen($pdf, 'r');
    $MessageAttachment = new MimePart($pdf);
    $MessageAttachment->type = 'application/pdf';
    $MessageAttachment->filename = 'output.pdf';
    $MessageAttachment->encoding = \Zend\Mime\Mime::ENCODING_BASE64;
    $MessageAttachment->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT;
}
...

$body_html = new MimeMessage();
$body_html->setParts(array($text, $html, $MessageAttachment));

Любая помощь приветствуется, спасибо! :)


person cellulosa    schedule 20.08.2013    source источник


Ответы (1)


Я не знаю, правильный ли это идентификатор, но мне удалось заставить его работать, поэтому я опубликую, как мы это сделали, на случай, если кто-то еще столкнется с той же проблемой.

Я использовал DOMPDFModule в качестве базового механизма, а затем в контроллере, в действии, которое генерирует PDF, я визуализировал PDF через Viewmodel, чтобы использовать сценарии просмотра в качестве шаблонов.

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);
    }
}
person cellulosa    schedule 23.08.2013