在ZF2中直接使用PhpRenderer和子视图

And*_*708 2 php zend-view zend-framework2

在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);
}
Run Code Online (Sandbox Code Playgroud)

布局视图脚本:

Hello from the e-mail layout script!

<?php echo $this->content; ?>
Run Code Online (Sandbox Code Playgroud)

发生的事情是只有布局的内容存储在布局视图脚本中$output和$this->content内部NULL.

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

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

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

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

All*_*nce 8

$this->content 为null,因为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);
Run Code Online (Sandbox Code Playgroud)

请参阅ZF2源代码以了解更多信息:

https://github.com/zendframework/zf2/blob/master/library/Zend/View/View.php#L222