使用Yii ePDF在电子邮件中发送多个pdf

时间:2012-12-20 09:33:29

标签: php pdf yii

我正在制作带有优惠券的pdf文件进行预订。现在重点是客户可以为多人预订房间,因此应该有两张优惠券,因此顾客不依赖于单张优惠券。

我正在使用Yii的ePDF扩展,它使用mpdf和html2pdf。这是我生成单个pdf的代码:

//foreach voucher generate a pdf
    foreach($rhrs as $rhr) {
                $this->generatePDF($reservation, $rhr);
            }

生成pdf函数:

private function generatePDF($reservation, $rhr)
{

    $pdf = Yii::app()->ePdf->mpdf('','', 0, '', 0, 0, 0, 0, 0, 0, 'P');
    $pdf->WriteHTML( $this->renderPartial('voucher', array(
            'rhr'=>$rhr,
            'reservation'=>$reservation
        ), true) );

    $this->sendMailWithPDF($pdf, $reservation);
}

sendmailWithPDF函数:

private function sendMailWithPDF($pdf, $reservation)
    {

        $content = $pdf->Output('', 'S');

        $content = chunk_split(base64_encode($content));
        $mailto = $reservation->emailaddress;
             ....

            $is_sent = @mail($mailto, $subject, "", $header);

问题是这会发送多封电子邮件,其中包含一个pdf。我正在尝试发送一封包含多个pdf的电子邮件。我正在考虑建立一个阵列,但起初我想问你们,那么你对如何妥善处理这个问题有什么看法?

提前致谢,

1 个答案:

答案 0 :(得分:1)

就个人而言,我会将generatePDF()功能与sendMailWithPDF()分离,以便您可以单独调用它们。从技术上讲,你没有必要发送电子邮件来生成PDF。

如果你的generatePDF()函数只是返回了PDF对象,你可以创建一个数组,然后传入你的sendMailWithPDF()函数。

这样的事情:

//foreach voucher generate a pdf
$generatedPDFs = array();
foreach($rhrs as $rhr) {
        $generatedPDFs[] = $this->generatePDF($reservation, $rhr);
}
// Call the mail function outside of the pdf generator, but pass in the array instead
$this->sendMailWithPDF($generatedPDFs, $reservation);


private function generatePDF($reservation, $rhr)
{

    $pdf = Yii::app()->ePdf->mpdf('','', 0, '', 0, 0, 0, 0, 0, 0, 'P');
    $pdf->WriteHTML( $this->renderPartial('voucher', array(
            'rhr'=>$rhr,
            'reservation'=>$reservation
        ), true) );

    return $pdf;
}


private function sendMailWithPDF($pdf, $reservation)
{

    //Update this section to handle $pdf being an array
    $content = $pdf->Output('', 'S');

    $content = chunk_split(base64_encode($content));
    $mailto = $reservation->emailaddress;
    ....

    $is_sent = @mail($mailto, $subject, "", $header);
}

现在代码可能无法完全按照我基于您的系统编写的方式工作,但您应该通过解耦函数来增加灵活性来了解我的意思。