割と既出ネタですが。。。
Ethnaでも、CakePHPなどのようなレイアウトテンプレートを使いたくなります。
ViewClassのforwardを変更すると、意外と簡単に実現できました。
Controllerの$directoryに'layout'のパスをセットして、ViewClassのforwardを下記のようにオーバーライドします。
class AppId_ViewClass extends Ethna_ViewClass
{
function forward()
{
//Rendererを取得
$renderer =& $this->_getRenderer();
$this->_setDefault($renderer);
<br />
//各Viewのコンテンツを取得
$contents = $renderer->perform($this->forward_path, true);
<br />
//レイアウトを取得
$layout = $renderer->getProp('layout_file');
if ($layout) {
$controller =& $this->backend->getController();
$dir = $controller->getDirectory('layout');
$layout_file = $controller->getDirectory('layout') . '/' . $layout . '.' . $controller->getExt('tpl');
$renderer->setProp('contents', $contents);
$renderer->perform($layout_file);
} else {
echo $contents;
}
}
}
これで、各tplで
{assign var="layout_file" value="default"}
と指定すれば、default.tplが呼ばれて、default.tpl内の {$contents} のところに各Viewのコンテンツが挿入されます。
レイアウトファイルに各Viewのテンプレート内から値を渡したいときは、{assign}を使えばOKです。
tplの見通しが良くなって、便利ですよ。