Zend framework 在Zend框架中呈现HTML电子邮件的操作

Zend framework 在Zend框架中呈现HTML电子邮件的操作,zend-framework,html-email,Zend Framework,Html Email,我有一个动作,它通过布局呈现一些内容 我实际上想通过电子邮件发送此输出。在Zend框架中实现这一点的最佳方法是什么 我知道我需要使用Zend_Mail组件发送电子邮件,但我不清楚如何将我的操作输出附加到Zend_Mail 我已经阅读了一些关于ContextSwitch动作助手的文章,我认为这可能是合适的,但我仍然不相信 我还是Zend框架的新手。我习惯于使用诸如输出缓冲之类的技术来捕获输出,我认为在Zend中这样做是不正确的。我不能给你一个超级详细的答案,但是如果你想要完整的输出(包括布局),我

我有一个动作,它通过布局呈现一些内容

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

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

我已经阅读了一些关于ContextSwitch动作助手的文章,我认为这可能是合适的,但我仍然不相信


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

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

有关Zend Framework调度过程的完整概述,请参阅


如果您不需要包含在电子邮件内容中的布局,那么您可以在许多点上执行此操作,包括使用您提到的上下文开关。

当您分派操作时,您可以在plugin的postDispatch()方法中捕获事件,您可以从所需操作动态添加到堆栈中。您通过以下方式接收响应的内容:

//in action
//...some php code
Zend_Controller_Front::getInstance()->registerPlugin(new My_Plugin());
//in plugin
$htmlCode = $this->_response->getBody();
从控制器:

// 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_操作实例的类执行此操作,则可能必须首先创建Zend_视图的实例,才能执行此操作:

$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');

谢谢,你给了我一些想法。实际上,我可能不需要布局,只需要渲染视图。因此,上下文切换可能不是一个坏主意。您提到的我可以截取此内容的其他几点是什么?我认为最合适的方法仍然是将其作为操作助手(或者至少作为控制器类中的非操作方法)编写,并从控制器操作中执行它。在这种情况下,我甚至不认为上下文切换是必要的。这就是我在尝试发送电子邮件时所做的。调用视图以获取渲染结果,然后通过电子邮件发送给它。注意,你知道大多数电子邮件代理显示的结果不同于浏览器吗?我也这么做,而且效果很好。如果当前视图有助于共享数据,则可以使用它,如果没有,则按照第二个示例创建一个新视图。通常,您也可以使用strip_标记生成一个基于文本的版本。
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();
}