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し、テンプレート マップを使用してテンプレートを解決するように を追加します。最後に、最初のパラメーターとしてa を取るrenderメソッドを呼び出します。両方のテンプレートを構成に追加し、テンプレート マップが正しい名前と正しいパスで正しく設定されました。PhpRendererViewModeltemplate_map

問題は、 render メソッドで子ビューの処理が見られないことです。これは、PhpRendererクラスを間違って使用しているかどうかを考えさせ、おそらくそれが機能しない理由です。ビューモデルのネストに関するドキュメントを確認しましたが、コントローラーアクションからビューモデルを返さないことを除いて、同じことをしています。$layoutコントローラー アクションから戻ると、機能します。

Zend\View\Viewrenderメソッドを見ると、子ビューをレンダリングしていることがわかります。使いたいように使えないPhpRendererようです。しかしZend\View\View、これに を使用できますか? このrenderメソッドは何も返しませんが、いくつかのイベントをトリガーします。私はまだイベント マネージャーにあまり慣れていないので、この方法を使用して出力を取得する方法や方法がわかりません。応答イベントをリッスンするのは賢明でしょうか? どのビューがレンダリングされたかを確認する必要があります (または、作業を行った後にリスナーを切り離す必要があります)。それが良いかどうかはわかりません。

どんなアイデアでも大歓迎です。ありがとうございました!

4

1 に答える 1

8

$this->contentPhpRenderer は子ビュー モデルを含まない自己レベルをレンダリングするだけなので、null です。

実際、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 に答える