Zend_Layout で Smarty を使う 2

Zend_Layout で Smarty を使う - Memo の続き。
Layout の表示はできたが、コンテンツとなるページが表示されなかった。
コンテンツのテンプレートは Zend_Controller_Action_HelperBroker::addHelper($viewRender); を使って、自動的に読み込まれる。


Zend_View を使った場合は、

<?php $this->layout()->content ?>

とすれば、コンテンツが表示された。


Smarty も同じように、

{$layout.content}

とかすれば出来ると思ったけど、Layout のテンプレートに content がアサインされていない。


ドキュメントを読むと以下のように書いてあった。

Zend_View の実装がすべて同じというわけではない
Zend_Layout では Zend_View_Interface を実装した任意のクラスを使用できますが、 その中で様々な Zend_View ヘルパー (特にレイアウトヘルパーや プレースホルダ ヘルパー) が使用できなければ問題となることもあるでしょう。 これは、Zend_Layout がオブジェクトの中の変数を自分自身と プレースホルダ で使えるようにしているからです。

これらのヘルパーをサポートしていない Zend_View の実装を使用する場合は、レイアウト変数をビューに取り込む方法を見つける必要があります。 たとえば Zend_Layout オブジェクトを継承して render() メソッドにビューへの変数を渡すようにするか、 あるいは独自のプラグインクラスを作成して レイアウトのレンダリングの前に変数を渡すようにするといった方法があります。

http://framework.zend.com/manual/ja/zend.layout.advanced.html#zend.layout.advanced.view


なるほど・・・。とりあえず Zend_Layout を継承して、render() の中で、コンテンツをアサインするのが簡単そうなので、やってみた。

<?php
class My_Layout extends Zend_Layout
{
    public function render($name = null)
    {
        if (null === $name) {
            $name = $this->getLayout();
        }                                                                        
        if ($this->inflectorEnabled() && (null !== ($inflector = $this->getInflector())))
        {
            $name = $this->_inflector->filter(array('script' => $name));
        }

        $view = $this->getView();

        if (null !== ($path = $this->getLayoutPath())) {
            $view->addScriptPath($path);
        }
        $view->assign('layout', $this->_container);
        return $view->render($name);
    }
}

テンプレート側はこう呼ぶ

{$layout.content}

これで Smarty と Zend_Layout を連携できた。


プレイスホルダーの連携はまだ出来ない。
というか、プレイスホルダーの使い方(使い道)がイマイチ良く分からない。。。