6

我有一个通过布局呈现一些内容的操作。

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

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

我已经阅读了 ContextSwitch 动作助手,我认为这可能是合适的,但我仍然不相信。

我还是 Zend 框架的新手。我习惯于使用输出缓冲之类的技术来捕获输出,我认为这在 Zend 中不是正确的方法。

4

4 回答 4

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');
于 2009-10-12T09:20:08.107 回答
2
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();
}
于 2012-10-11T12:14:53.297 回答
1

当您调度动作时,您可以在插件的 postDispatch() 方法中捕获事件,您可以从所需的动作动态添加到堆栈中。因为您通过以下方式收到响应的内容

//in action
//...some php code
Zend_Controller_Front::getInstance()->registerPlugin(new My_Plugin());
//in plugin
$htmlCode = $this->_response->getBody();
于 2009-10-12T06:15:14.047 回答
0

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

请参阅http://nethands.de/download/zenddispatch_en.pdf以获取完整的 Zend Framework Dispatch Process Overview。

如果您不需要电子邮件内容中包含的布局,那么您可以在很多时候执行此操作,包括使用上下文切换,正如您所提到的。

于 2009-10-12T04:38:42.327 回答