1

で、 を使用して PDF を生成し、 を使用して電子メールで送信ZF2しようとしています。DOMPDFModuleEmailZF2

これが私のコントローラーでやっていることです:

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

どんな助けでも大歓迎です、ありがとう!:)

4

1 に答える 1

1

この ID が正しい方法かどうかはわかりませんが、なんとか機能させることができたので、他の誰かが同じ問題に遭遇した場合に備えて、どのように行ったかを投稿します。

基本エンジンとして使用し、コントローラで PDF を生成するアクションで、ビュー スクリプトをテンプレートとして使用するためにDOMPDFModulePDF をレンダリングしました。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);
    }
}
于 2013-08-23T13:07:57.450 に答える