[PHP] Ethnaでレイアウトテンプレートを使うには

割と既出ネタですが。。。

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の見通しが良くなって、便利ですよ。

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(16区分17回 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、Ruby Programmer Gold、AWSソリューションアーキテクト(アソシエイト)、日商簿記2級、漢検準1級などを保有。

babaの書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ