Использование PhpRenderer непосредственно с дочерними представлениями в ZF2

При отправке электронной почты в 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, и карта шаблона правильно установлена ​​с правильными именами и правильными путями.

Дело в том, что в методе рендеринга я не вижу обработки дочерних представлений. Это заставляет меня думать, если я неправильно использую класс PhpRenderer и, возможно, поэтому он не работает. Я проверил документацию для моделей размещения вложенности , и я делаю то же самое, за исключением того, что не возвращаю модель представления из действия контроллера. Если я верну $layout из действия контроллера, он будет работать.

Если я посмотрю на метод рендеринга Zend\View\View , я вижу, что он отображает дочерние представления. Казалось бы, я не могу использовать PhpRenderer как я хочу. Но могу ли я использовать Zend\View\View для этого? Метод render ничего не возвращает, но вызывает некоторые события. Я еще не слишком хорошо знаком с менеджером событий, поэтому я не уверен, как / если я могу захватить вывод, используя этот метод. Было бы разумно слушать ответное событие ? Мне нужно было бы проверить, какой вид был сделан, я думаю (или отделите моего слушателя после выполнения моей работы). Я не знаю, хорошо ли это.

Любые идеи более чем приветствуются. Спасибо!

$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