[英]How to Render a custom view with plugins in Zend Framework 2
我正在开发一个需要在流程完成后发送电子邮件的应用。 由于电子邮件需要是HTML,我有一个明智的想法,即将视图呈现为电子邮件消息正文,以便我可以实现“单击此处在浏览器上查看此内容”功能。 这都是参与实现AbstractRestfulController的控制器,因此视图本身驻留在我的前端模块中,以便可以通过浏览器从URL访问它。 但是我得到了一个
没有提供RouteStackInterface实例
我尝试渲染视图时出错。
这是我的代码:
use Zend\View\HelperPluginManager;
use Zend\View\Resolver;
use Zend\View\Renderer\PhpRenderer;
//Instantiate the renderer
$renderer = new PhpRenderer();
$resolver = new Resolver\TemplateMapResolver(array(
'layout' => realpath(__DIR__ . '/../../../../Application/view/layout/email.layout.phtml'),
'email/view' => realpath(__DIR__ . '/../../../../Application/view/application/email/view.phtml')
)
);
$renderer->setResolver($resolver);
$renderer->url()->setRouter($this->getEvent()->getRouter());
我在API文档中看到,您可以通过为路由器提供RouteStackInterface将路由器设置为URL插件,因此最后一行。 但是,这似乎也没有用。
我想使用相同的视图发送HTML邮件消息,该消息在邮件正文中有链接并通过URL显示在浏览器上。
有关如何完成此任务的任何想法/建议?
编辑/解决方案:
根据下面的dotwired的回答,从服务管理器获取渲染器的实例会导致插件正确实例化。 所以这是有效的代码:
module.config.php:
array('view_manager' => array(
'template_map' => array(
'layout/email' => __DIR__ . '/../../Application/view/layout/email.layout.phtml',
'email/share' => __DIR__ . '/../../Application/view/application/email/share.phtml',
'email/view' => __DIR__ . '/../../Application/view/application/email/view.phtml',
),
),
);
REST控制器:
use Zend\View\Model\ViewModel;
//get the renderer
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\RendererInterface');
//Create the views
$shareView = new ViewModel(array('data' => $data));
$shareView->setTemplate('email/view');
$emailLayout = new ViewModel(array('subject' => $this->_subject, 'content' => $renderer->render($shareView)));
$emailLayout->setTemplate('layout/email');
//Render the message
$markup = $renderer->render($emailLayout);
使用服务管理器中的渲染器,$ this-> url()视图助手可以正常工作。
只需使用模块的module.config.php指定您的电子邮件模板,例如:
'view_manager' => array(
'template_path_stack' => array(
'user' => __DIR__ . '/../view'
),
'template_map' => array(
'email/view' => __DIR__ . '/../view/application/email/view.phtml'
)
),
之后,您可以继续阅读这部分文档。 然后,您可以将视图模板从渲染器传递到MimePart,MimeMessage将使用它
$viewModel = new \Zend\View\Model\ViewModel();
$viewModel->setTemplate('email/view');
$renderer = $this->serviceLocator->get('Zend\View\Renderer\RendererInterface');
$htmlPart = new \Zend\Mime\Part($renderer->render($viewModel));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.