Zend_Dojo boarderContainerとZend_Layoutのはまりどころ

Zend_DojoとZend_Layoutでレイアウトする。

http://d.hatena.ne.jp/noopable/20090129/1233214004
ここに書いたレイアウトスクリプトDojoを使っている時だけDojo用のヘッダーを吐くヘルパーを使用すると

<?php echo $this->doctype() , PHP_EOL ?>
<html>
<head>
<?php echo ((false !== $this->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper'))
       && $this->dojo()->isEnabled()) ? $this->dojo() : '' ?>
<?php echo $this->placeholder('head') , PHP_EOL ?>
</head>
<body class="tundra">
<?php echo $this->layout()->content; ?>
<?php echo $this->inlineScript() ?>
</body>
</html>

こんな感じになる。細かいところは飛ばしてます。わざわざプラグインパスを確認しに行っているのは、使っていない時はisEnabledを聞くことすらできないから。
これで、通常のビュースクリプト内でZend_Dojoのフォームでもなんでも書けば動作する。

boarderContainerを使う

DojoにはboarderContainerというレイアウトするにはうってつけの機能がある。これを使わないのはもったいないので簡易的にこんな感じにしてみる。(実際にはかなり細かい設定が可能。
※ビュースクリプトに作成した場合。

<?php
//standby dojo layout objects.
$this->borderContainer()->captureStart('masterWrapper',
                      array('design' => 'headline'),    
                      array(
				'style' => 'width: 100%; height: 100%; ',
		      )
	);
	echo $this->contentPane(
		'header',
		$this->layout()->header,
		array('region' => 'top'),
		array('style' => ' height:35px;', 'class' => 'dijitAccordionTitle-selected')
	);
	echo $this->contentPane(
		'mainBlock',
		$this->layout()->content,
		array('region' => 'center'),
		array('style' => '')
	);
	echo $this->contentPane(
		'footer',
		$this->layout()->footer,
		array('region' => 'bottom'),
		array('style' => 'text-align:center;padding:5px; height:30px; background-color:lightgrey;')
	);
echo $this->borderContainer()->captureEnd('masterWrapper');

でも、これって明らかにレイアウト要素だよね。ってことで、レイアウトスクリプト内に移したとする

レイアウトスクリプト内に素直に書いてもboarderContainerは動作しない。

<?php echo $this->doctype() , PHP_EOL ?>
<html>
<head>
<?php echo ((false !== $this->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) && $this->dojo()->isEnabled()) ? $this->dojo() : '' ?>
<?php echo $this->placeholder('head') , PHP_EOL ?>
</head>
<body class="tundra">
<?php $this->borderContainer()->captureStart('masterWrapper',
                      array('design' => 'headline'),    
                      array(
				'style' => 'width: 100%; height: 100%; ',
		      )
	);
echo $this->layout()->content; 
echo $this->borderContainer()->captureEnd('masterWrapper'); ?>
<?php echo $this->inlineScript() ?>
</body>
</html>

残念ながらこれは動作しない。なぜなら、$this->dojo()の段階で、boarderContainerが登録されていないので、ヘッダーに吐かれるスクリプトが足りなくなる。(オプションでタグベースにしてあれば別だけど)

サンプルにあった解決方法

マニュアルだったかどっかで、こういうケースで、違う解決を提案してある。
レイアウトスクリプトの前半部分にこれを書けと。

<?php $this->borderContainer()->captureStart('masterWrapper',
                      array('design' => 'headline'),    
                      array(
				'style' => 'width: 100%; height: 100%; ',
		      )
	);
echo $this->layout()->content; 
$this->dojoWrapper =  $this->borderContainer()->captureEnd('masterWrapper'); ?>
<?php echo $this->doctype() , PHP_EOL ?>
<html>
<head>
<?php echo ((false !== $this->getPluginLoader('helper')->getPaths('Zend_Dojo_View_Helper')) && $this->dojo()->isEnabled()) ? $this->dojo() : '' ?>
<?php echo $this->placeholder('head') , PHP_EOL ?>
</head>
<body class="tundra">
<?php echo $this->dojoWrapper; ?>
<?php echo $this->inlineScript() ?>
</body>
</html>

動きます。でもこれ、奥歯に何かが挟まったイヤーな感じ。拡張しようと思ったら酷いことになりそう。動作確認としては手軽だけれども。
で、解決方法はいろいろあるんだろうけど、Zend_Layoutを拡張して対処する方法はこちらで。
http://d.hatena.ne.jp/noopable/20090203/1233620988