2009-10-12 83 views
4

我有一个通过布局呈现某些内容的动作。在Zend Framework中对HTML电子邮件进行渲染操作

我实际上是想通过电子邮件发送这个输出。在Zend框架中实现这一点的最佳方式是什么?

我知道我需要使用Zend_Mail组件发送电子邮件,但我不清楚如何将我的操作输出附加到Zend_Mail

我已经对ContextSwitch动作助手做了一些阅读,我认为这可能是合适的,但我仍然不确定。

我还是Zend Framework的新手。我习惯于使用输出缓冲技术来捕获输出,我不认为这是在Zend中做到这一点的正确方法。

回答

8

从你的控制器:

// do this if you're not using the default layout 
$this->_helper->layout()->disableLayout(); 

$this->view->data = $items; 

$htmlString = $this->view->render('foo/bar.phtml'); 

如果你从一类,这不是依靠Zend_Controller_Action的一个实例,这样做,你可能必须创建一个实例一个Zend_View的第一,要做到这一点:

$view = new Zend_view(); 

// you have to explicitly define the path to the template you're using 
$view->setScriptPath(array($pathToTemplate)); 

$view->data = $data; 

$htmlString = $view->render('foo/bar.phtml'); 
+0

这就是我在尝试发送电子邮件时做到的。您调用视图获取渲染结果,然后通过电子邮件发送。 请注意,您是否知道大多数电子邮件代理显示的结果与浏览器不同? – 2009-10-12 17:21:07

+0

我也这样做,并且运行良好。如果共享数据有用,则可以使用当前视图,如果没有,则根据第二个示例创建一个新视图。一般来说,你也可以使用strip_tags来生成一个体面的基于文本的版本。 – 2009-10-12 19:07:33

0

我不能给你一个超级详细的答案,但是如果你想要完整的输出(包括布局),我想你想写你的电子邮件功能作为一个动作助手,并将其插入PostDispatch钩子Zend_Controller_Action-> dispatch()循环。

请参阅http://nethands.de/download/zenddispatch_en.pdf了解完整的Zend Framework调度流程概述。

如果您不需要包含在电子邮件内容中的布局,那么您可以在很多方面都做到这一点,包括通过使用上下文切换,如您所述。

+0

谢谢你给了我一些思考。我可能实际上不需要布局,只是渲染的视图。所以上下文切换可能不是一个坏主意。你提到的其他一些点可以拦截这些内容吗? – asgeo1 2009-10-12 05:02:08

+0

我认为最好的方法是将它作为一个动作助手(或者至少它在你的控制器类中是它自己的非动作方法),然后从控制器动作中执行它。 在这种情况下,我不认为上下文切换甚至是必要的。 – gravelpot 2009-10-12 12:40:13

1

当您调度动作时,您可以在插件的postDispatch()方法中捕获该事件,以便您可以从期望的动作动态添加到堆栈中。在你收到响应的内容由

//in action 
//...some php code 
Zend_Controller_Front::getInstance()->registerPlugin(new My_Plugin()); 
//in plugin 
$htmlCode = $this->_response->getBody(); 
1
public static function sendMail($data = array(), $template = ''){ 
    $html = new Zend_View(); 
    $html->setScriptPath(APPLICATION_PATH . '/modules/default/views'); 

    // assign valeues 
    if(count($data['Assigni'])){ 
     foreach($data['Assigni'] as $assign){ 
      $html->assign($assign['key'], $assign['value']); 
     } 
    }   
    // create mail object 
    $mail = new Zend_Mail('utf-8'); 

    // render view //'scripts/newsletter/emailtemplate.phtml' 
    $bodyText = $html->render($template); 

    $mail->addTo($data['To']); 
    $mail->setSubject($data['Subject']); 
    $mail->setFrom($data['From'], $data['FromName']); 
    $mail->setBodyHtml($bodyText); 
    $mail->send(); 
} 
相关问题