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