2

在 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->contentNULL

我想要做的是将 HTML 存储在一个字符串中,以便我可以通过电子邮件发送它。我实例化了一个子视图模型,它表示我想在布局中呈现的视图脚本。然后我实例化布局视图模型并添加子视图模型。然后我创建了一个 PhpRenderer 并向其中添加一个TemplateMapResolver,这样它将使用模板映射来解析模板。最后,我调用了renderPhpRendereraViewModel作为其第一个参数的方法。我已将这两个模板添加到我的template_map配置中,并且模板映射设置正确,名称和路径正确。

问题是我在它的渲染方法中看不到任何子视图的处理。这让我想,如果我PhpRenderer错误地使用了这个类,也许这就是它不起作用的原因。我已经检查了嵌套视图模型的文档,并且我正在做同样的事情,除了不从控制器操作返回视图模型。如果我$layout从控制器操作返回,它可以工作。

如果我查看Zend\View\View's render方法,我可以看到它呈现子视图。好像我不能使用PhpRenderer我想要的东西。但是我可以用Zend\View\View这个吗?该render方法不返回任何内容,但会触发一些事件。我对事件管理器还不太熟悉,所以我不确定如果使用这种方法,我如何/是否可以捕获输出。听响应事件是否明智?我必须检查我猜是哪个视图呈现(或者在完成我的工作后分离我的听众)。我不知道这样有没有好处。

任何想法都非常受欢迎。谢谢!

4

1 回答 1

8

$this->content为空,因为 PhpRenderer 只渲染自身级别,不包括子视图模型。

实际上 ZF2 MVC 渲染使用 Zend\View\View->render() 而不是 Zend\View\Renderer\PhpRenderer->render(),所以你需要像 Zend\View\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

于 2013-03-04T03:10:15.860 回答