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し、テンプレート マップを使用してテンプレートを解決するように を追加します。最後に、最初のパラメーターとしてa を取るrenderメソッドを呼び出します。両方のテンプレートを構成に追加し、テンプレート マップが正しい名前と正しいパスで正しく設定されました。PhpRendererViewModeltemplate_map
問題は、 render メソッドで子ビューの処理が見られないことです。これは、PhpRendererクラスを間違って使用しているかどうかを考えさせ、おそらくそれが機能しない理由です。ビューモデルのネストに関するドキュメントを確認しましたが、コントローラーアクションからビューモデルを返さないことを除いて、同じことをしています。$layoutコントローラー アクションから戻ると、機能します。
Zend\View\Viewのrenderメソッドを見ると、子ビューをレンダリングしていることがわかります。使いたいように使えないPhpRendererようです。しかしZend\View\View、これに を使用できますか? このrenderメソッドは何も返しませんが、いくつかのイベントをトリガーします。私はまだイベント マネージャーにあまり慣れていないので、この方法を使用して出力を取得する方法や方法がわかりません。応答イベントをリッスンするのは賢明でしょうか? どのビューがレンダリングされたかを確認する必要があります (または、作業を行った後にリスナーを切り離す必要があります)。それが良いかどうかはわかりません。
どんなアイデアでも大歓迎です。ありがとうございました!