Zend_View用のフィルターで、コンテンツをZend_Dojoタブコンテナーに入れる

http://d.hatena.ne.jp/noopable/20090207/1233957428
これの続きで
要件

  • コントローラーの出力内容についてはViewRendererで作成
  • Zend_DojoのcontentPaneでラップ、その後タブコンテナでラップ
  • レイアウトにはdojoソースを出せるものを使用

以上の要件を
http://d.hatena.ne.jp/noopable/20090206/1233872373
ここで、使用したScriptStackで実現する。

contentpane.php

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

<?php
    $this->contentPane()->captureStart(
        $this->contentPaneId,
        array(
            'title' => $this->tablabel,
            'selected' => true,
            'closable' => $this->closable,
        ),
        array(
            //'style' => 'background-color: lightgray;'
        )
    );
    echo $this->getFilter('ScriptStack')->getContent();
    echo $this->contentPane()->captureEnd($this->contentPaneId);

tabcontainer.php

コンテンツをタブコンテナーでラップする

<?php
$this->TabContainer()->captureStart(
	$this->subTabContainer,
	array(
		'tabPosition' => "top",
	),
	array(
		'style' => "border: 1px solid #bfbfbf;width:100%; height:100%;"
	)
);
//単純にラップするだけなら、captureを使わない方法もある。
echo $this->getFilter('ScriptStack')->getContent();
echo $this->TabContainer()->captureEnd($this->subTabContainer);

以上のスクリプトをビュースクリプトとして保存しておく。

コントローラーで以下のように指定する。

<?php
$data['tablabel'] = '概要';
//必要なデータをアサインする
$this->view->assign($data);
//フィルターを登録する
$this->view->addFilterPath('Flower/View/Filter', 'Flower_View_Filter_');
$this->view->addFilter('ScriptStack');
//フィルターで使用するスクリプトをアサインする。
$this->view->assign('scriptStack', array('tabcontainer.php','contentpain.php'));

これでビュースクリプトにはコンテンツの吐き出しだけを記述すればよく、共通するpaneによるラップに関してはビューから除外することができた。
レイアウトの上位階層から順に必要なラップをしながらタブ表示といった用途には重宝している。
条件指定として、scriptStackに与えるスクリプトを変更すれば、タブコンテナーではなく単純なdivに入れたり、構造だけ取得してRSSを吐いたりといった仕組みにも容易に流用できる。