在Zend Framework 2中发送电子邮件时,我想使用视图脚本模板,以便我可以利用各种电子邮件模板的布局。我的想法是,我有一个具有共享标记的布局,并在某处回应内容。究竟布局如何工作。为此,我尝试将子视图模型添加到布局视图模型中,并使用PhpRenderer
进行渲染。
public function someMethod() {
$child = new ViewModel();
$child->setTemplate('test-template');
$layout = new ViewModel();
$layout->setTemplate('email-layout');
$layout->addChild($child, 'content');
$phpRenderer = new \Zend\View\Renderer\PhpRenderer();
$phpRenderer->setCanRenderTrees(true);
$resolver = new \Zend\View\Resolver\TemplateMapResolver();
$resolver->setMap($this->serviceLocator->get('ViewTemplateMapResolver'));
$phpRenderer->setResolver($resolver);
$output = $phpRenderer->render($layout);
}
布局视图脚本:
Hello from the e-mail layout script!
<?php echo $this->content; ?>
在布局视图脚本中,只有布局内容存储在$output
和$this->content
中才会NULL
。
我要做的是将HTML存储在一个字符串中,以便我可以通过电子邮件发送它。我实例化一个子视图模型,它表示我想在布局中呈现的视图脚本。然后我实例化布局视图模型并添加子视图模型。然后我创建一个PhpRenderer并向其添加TemplateMapResolver
,以便它将使用模板映射解析模板。最后,我在render
上调用PhpRenderer
方法,该方法将ViewModel
作为其第一个参数。我已将两个模板添加到template_map
配置中,并使用正确的名称和正确的路径正确设置模板映射。
问题是我在render method中没有看到对子视图的任何处理。这让我想到如果我错误地使用PhpRenderer
类,也许这就是为什么它不起作用。我检查了documentation for nesting view models,我做了同样的事情,除了不从控制器动作返回视图模型。如果我从控制器操作返回$layout
,它就会起作用。
如果我查看Zend\View\View
的{{3}}方法,我可以看到它呈现了子视图。好像我不能像我想的那样使用PhpRenderer
。但我可以使用Zend\View\View
吗? render
方法不会返回任何内容,但会触发一些事件。我对事件管理器还不太熟悉,所以如果使用这种方法,我不知道如何捕获输出。听render是否明智?我必须检查我猜的是哪个视图(或者在完成我的工作后分离我的听众)。我不知道这有什么用。
任何想法都非常受欢迎。谢谢!
答案 0 :(得分:7)
$this->content
为null,因为PhpRenderer只渲染自我级别,不包括子视图模型。
实际上ZF2 MVC渲染使用的是Zend \ View \ View-&gt; render()而不是Zend \ View \ Renderer \ PhpRenderer-&gt; render(),所以你需要渲染树模板,就像Zend \ View一样\查看:
foreach ($layout as $child) {
if ($child->terminate()) {
continue;
}
$child->setOption('has_parent', true);
$result = $view->render($child);
$child->setOption('has_parent', null);
$capture = $child->captureTo();
if (!empty($capture)) {
if ($child->isAppend()) {
$oldResult=$model->{$capture};
$layout->setVariable($capture, $oldResult . $result);
} else {
$layout->setVariable($capture, $result);
}
}
}
$output = $view->render($layout);
请参阅ZF2源代码以了解更多信息:
https://github.com/zendframework/zf2/blob/master/library/Zend/View/View.php#L222