在Yii

时间:2016-02-18 08:46:10

标签: pdf yii components tcpdf

我正在生成pdf报告并将其添加为电子邮件的附件。我正在使用tcpdf扩展并使用Yii框架。我怀疑的是我在哪里放置代码来生成pdf。我可以在发送电子邮件之前将其添加到控制器代码中,但我想创建一个单独的函数,在调用时生成pdf并将其保存到磁盘。

这是我的示例代码

                $transaction->commit();



                        $mail = Yii::app()->Smtpmail;
                        $mail->IsSMTP();   
                        $mail->IsHTML(true);                                   

                        $mail->SetFrom("do-not-reply@abc.com", 'XXX Admin');
                        //$headers = "Content-Type: text/html; charset=UTF-8";

                        $mail->Subject = "Confirmation of survey completion";
                        $mail->MsgHTML("Hi $survey->first_name $survey->last_name, <br><br>Thank you for completing the survey. The details of your survey result will be sent to the leader. <br><br>Please contact the leader for further details.<br><br>Regards,<br>Admin, XXX");


                        $mail->AddAddress("abc@gmail.com", "");
                        $mail->CharSet = 'UTF-8';
                        //to invoke another controller/component to generate pdf here
                        $controller1 = new PdfReportController("test");
                        $controller1->actionEnglishReport();
                        $dir = realpath(__DIR__ . '/../runtime/pdf-assets');
                        $file = $dir . '/export.pdf';
                        $mail->AddAttachment($file);   
                        if(!$mail->Send()) 
                        {
                                Yii::log("Mailer Error: " . $mail->ErrorInfo, 'error','application');
                        }
                        else 
                        {
                            Yii::log('Data1 saved!. Mail sent', 'info','application');
                        }

我不太清楚如何分离这个pdf生成模块。请帮忙

更新: 我设法将pdf模块分开:

                  //Pdfreports is a component class which has MandarinReport            as a static method
                 PdfReports::MandarinReport();
                 $dir = realpath(__DIR__ . '/../runtime/pdf-assets');
                 $file = $dir . '/export.pdf';
                 $mail->AddAttachment($file);                       

问题是虽然创建了Pdf,但没有发送包含附件的电子邮件

1 个答案:

答案 0 :(得分:0)

我建议你看一下Yii使用的http://www.yiiframework.com/doc/guide/1.1/en/basics.mvc

的MVC模式

MVC模式广泛用于开发GUI,如果你在这里查看(https://en.wikipedia.org/wiki/Model - view-controller #Interactions)你可以看到控制器只能在三个不同的层中分离代码的职责发送命令以更新模型或视图的状态

在Yii中,永远不应该实例化控制器。这是Yii将为您处理的事情。它不是很清楚你的示例代码在哪里执行,但你可以创建一个Yii组件(http://www.yiiframework.com/doc/guide/1.1/en/basics.component)来发送电子邮件和生成pdf的

class mailer extends CComponent{

    public static function sendMail($model){
        // You're mail code
        return $mail->send(); // return true the mail is send
    }

    public static function generatePDF($model){
        // You're mail code
        return $pdf->path; //return the path where the pdf is saved
    }
}

然而,你可以看看Yii的事件和行为,但它有点棘手。 (http://www.yiiframework.com/wiki/44/behaviors-events/&amp; http://www.yiiframework.com/doc/guide/1.1/en/basics.component#component-event

为了存储您的pdf,您可以使用yii资产管理器http://www.yiiframework.com/wiki/148/understanding-assets/

邮件未发送的原因可能是出于多种原因检查运行时的应用程序日志中是否存在错误。