代码之家  ›  专栏  ›  技术社区  ›  robjmills

Zend框架电子邮件内容生成

  •  2
  • robjmills  · 技术社区  · 15 年前

    有了Zend_框架,我想知道构建HTML电子邮件发送内容的最佳实践是什么。在我的例子中,发送的电子邮件的内容由许多因素决定,例如数据库中特定值的返回行数。因此,对我来说,内容建立在发送电子邮件的控制器中是有意义的,它与相关的数据库模型进行对话,并确定内容应该是什么。我不确定这是否可行,因为我们的设计师和版权所有者经常希望在电子邮件中调整副本,这将要求他们更改模型或要求我这样做。我应该以不同的方式处理这个问题吗?我是否应该将HTML片段存储在包含不同文本的某个地方,然后以某种方式调用它们?

    编辑 从FireeyedBoy的回答来看,这样做是可以接受的吗?在视图中创建一个名为“partials”的文件夹,并使用它存储文本/HTML片段,然后我可以在需要的地方调用这些片段,并使用regexp(或类似的)将特殊字符串替换为动态值。

    $nview = new Zend_View();
    $nview->setScriptPath(APPLICATION_PATH.'/views/partials/');
    $bodytext = $nview->render('response.phtml');
    $mail = new Zend_Mail();
    $mail->setBodyText($bodytext);
    // etc ...
    

    例如,在这种情况下,根据模型返回的变量,可以使用两个不同的模板:

    // within a controller
    public function emailAction()
    {
        $images = new Model_ApplicationImages();
        $totimages = count($images->fetchImages($wsid));
        $acceptedImages = $images->fetchImages($wsid,'approved');
        $accepted = count($acceptedImages);
        $rejectedImages = $images->fetchImages($wsid,'rejected');
        $rejected = count($rejectedImages);
        $response = ($rejected == $totimages)?'rejected':'approved';
        $nview = new Zend_View();
        $nview->setScriptPath(APPLICATION_PATH.'/views/partials/');
        $content = $nview->render($response.'.phtml');
        $mail = new Zend_Mail();
        $mail->setBodyText($content);
        // etc
    }
    

    有没有更优雅的方式可以/应该这样做?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Decent Dabbler    15 年前

    不确定这是否是最佳实践,但我所做的是使用以下方法扩展Zend-mail:

    setTemplatePath( $templatePath );
    setTemplateHtml( $templateHtml );
    setTemplateText( $templateText );
    setTemplateArguments( array $templateArguments );
    

    …然后在某一点上我重写了 send() 我愿意:

    $view = new Zend_View();
    $view->setScriptPath( $this->_templatePath );
    
    foreach( $this->_templateArguments as $key => $value )
    {
        $view->assign( $key, $value );
    }
    
    if( null !== $this->_templateText )
    {
        $bodyText = $view->render( $this->_templateText );
        $this->setBodyText( $bodyText );
    }
    
    if( null !== $this->_templateHtml )
    {
        $bodyHtml = $view->render( $this->_templateHtml );
        $this->setBodyHtml( $bodyHtml );
    }
    

    所以要利用这个,你可以做如下的事情:

    $mail = new My_Extended_Zend_Mail();
    $mail->setTemplatePath( 'path/to/your/mail/templates' );
    $mail->setTemplateHtml( 'mail.html.phtml' );
    $mail->setTemplateText( 'mail.text.phtml' );
    $mail->setTemplateArguments(
        'someModel' => $someFunkyModel,
        /* etc, you get the point */
    )
    $mail->send();
    

    换句话说,有了这个,你可以让你的设计师和文案简单地编辑视图(模板),就像他们已经习惯了一样。希望这对你有所帮助,并激励你想出一些适合你需要的时髦的东西。

    PS:
    由于您提到了任意数据行,例如,您可以使用 partialLoop 查看ZF附带的帮助程序。但你可能已经意识到了?

    PPS:
    我实际上同意切尔默茨关于不扩展Zend_邮件,而是将其包装在自己的组件中的评论。