Zend_Dojo contentPaneでコンテンツをラップする

dojoのレイアウト機能を利用する場合、レイアウトの最小単位をcontentPaneとし、tabContainerやaccordionContainerなどのレイアウト用コンテナーに格納する。
フレームワーク的にはZend_DojoのcontentPaneでコンテンツを包むことになる。
ただし、Ajaxで動的にcontentPaneを育成するケースもあり、サーバーから取得するのは生のコンテンツということもある。逆に上位タブから下位レイアウトまで一式必要になることもある。
この部分のマネージメントを構造的にわかりやすくする必要がある。

基本のビュースクリプト

<?php
    $this->contentPane()->captureStart(
        $this->contentPaneId,
        array(
            'title' => $this->tablabel,
            'selected' => true,
            'closable' => $this->closable,
        ),
        array(
            //'style' => 'background-color: lightgray;'
        )
    );
//ここからコンテンツ
    echo $this->book;
//コンテンツここまで
    echo $this->contentPane()->captureEnd($this->contentPaneId);

シンプルにcontentPaneでラップする場合はこんな感じになる。主に初期の動作確認用だろう。

スクリプトを分離

ビューファイルに毎回ラッパーを書いていたのでは仕様変更の際に大変なことになる。集約してrenderすると、

<?php
ob_start();?>
ここに固有のコンテンツを書く
<?php
$this->content = ob_get_clean();
echo $this->render('contentpain.php');

かっこ悪いが一応動く。
contentpain.phpというのを他のラッパーに変えれば、ラップをコントローラーで制御することも可能だろう。

wrapperにする

ラッパーにスクリプト名を渡して拾わせる。固有コンテンツ用にrenderするためのパスをビューオブジェクトに渡す。この場合、viewRenderrerは使わないので、自分の対応するスクリプトのパスを把握して渡さなければならない。

<?php
    $this->contentPane()->captureStart(
        $this->contentPaneId,
        array(
            'title' => $this->tablabel,
            'selected' => true,
            'closable' => $this->closable,
        ),
        array(
            //'style' => 'background-color: lightgray;'
        )
    );
    echo $this->render($this->script);//ここでコンテンツを作る。
    echo $this->contentPane()->captureEnd($this->contentPaneId);

ラッパーとしては、汎用的に使えるので、ラッパーを選択することでラッパーを切り替えるといった用途にも使える。

Zend_Viewをデコレーターっぽく使う

http://d.hatena.ne.jp/noopable/20090206/1233872373
これを使って、デコレーターっぽい実装が可能。
続きは↓
http://d.hatena.ne.jp/noopable/20090208/1234054579