Zend Framework电子邮件内容生成

时间:2010-01-20 12:53:12

标签: email zend-framework

使用Zend_Framework,我想知道构建要在HTML电子邮件中发送的内容的最佳做法。在我的情况下,发送的电子邮件的内容由许多因素决定,例如数据库中特定值的返回行数。因此,我认为内容是在控制器内构建的,控制器发送与相关数据库模型对话的电子邮件并确定内容应该是什么。我不确定这是否有效,我们的设计师和版权人经常会想要在电子邮件中调整副本,这将要求他们对模型进行更改或要求我。我应该以不同的方式处理吗?我是应该将HTML片段存储在包含不同文本的某个地方,然后以某种方式调用它们?

编辑以下来自fireeyedboy的回答,做这样的事情是否可以接受。在名为“partials”的视图中创建一个文件夹,并使用它来存储我可以在需要的地方调用的text / 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 ...

e.g。在这种情况下,可以使用两个不同的模板,具体取决于从模型返回的变量:

// 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 个答案:

答案 0 :(得分:2)

不确定这是否是最佳做法,但我所做的是使用以下方法扩展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:
由于您提到了任意数据行,因此您可以使用ZF附带的partialLoop视图助手来实现此目的。但你可能已经意识到了这一点?

<强> PPS:
我实际上同意chelmertz关于不扩展Zend_Mail但将其包装在我自己的组件中的评论。