ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

layoutを共通化してみる。

generate scaffold などすると、app/views/layouts/ 以下にコントローラと同じ名前のlayout用ファイルが作成されます。例えば、

$ ./script/generate scaffold Hoge

とやると、

app/views/layouts/hoge.tpl

というlayout用ファイルができあがります。

まぁこれはこれで良いのですが、やっぱり大概のモノについては共通のlayoutを使いたい場面が多いと思います。

そういうときは、app/application_controller.php を開き、ApplicationControllerに$layoutメンバ変数を追加するのが手っ取り早いです。

<?php
class ApplicationController extends AkActionController 
{
    var $layout = "layout"; // 追加
}

上の例では、app/views/layouts/layout.tpl というテンプレートがlayoutとして使われるようになります。

とはいえ、場合によってはレイアウトを「このコントローラでだけ」「このコントローラのこのアクションでだけ」切り替えたい、という要望も出てくると思います。
一番単純に、コントローラ内でレイアウトを切り替えるには setLayout()メソッドを呼べばよいようです。このメソッドはAkActionControllerクラスで定義済みです。
app/controllers/hoge_controller.php :

<?php
class HogeController extends ApplicationController
{
    function index()
    {
        $this->setLayout('hoge'); // app/views/layouts/hoge.tplを使うようになる。
    }
...

setLayoutには他にも、条件で切り替えられるようなオプションもあるようですがそこまで詳しく見る気力は無くなりました。
基本的には $layout メンバ変数を設定するか、setLayout()*1を呼べば良いので、コンストラクタに埋め込んだり、ActionControllerのbeforeFilter()/beforeActionなどに埋め込んだりしても良さそうです。

で、基本的にタイトルとかは手動設定になります。自分の例で言うとこんな感じにすると良いかもです。
app/application_controller.php :

<?php
class ApplicationController extends AkActionController 
{
    var $layout = "layout";
    var $title_for_layout = "Akelos Benchmark Dummy Shop Site";
}

"title_for_layout"という変数をコントローラの基底クラスで初期設定しておきます。ページ固有のタイトルは派生先の各コントローラで、"title_for_page"という変数に設定されるようにしておけば、共通のレイアウトでは次のように出来ます。
app/views/layouts/layout.tpl :

<title><?php if (!empty($title_for_page)) { echo $title_for_page . " : " ; } ?>
<?php echo $title_for_layout ?></title>

(実際は一行)

とりあえずこんな感じでも行けそうです。

*1:これも結局はcontrollerのlayout変数に引数を指定しているだけです。