スパイスラボ神部です。
CakePHP でちょっと考え込んでしまいがちなサイトルートのテンプレートでもある home.ctp のレイアウト変更。どうやって指定してあげたらいいか、ここではちょっと自分の経験則について書いてみます。
CakePHP 1.2 RC3 の場合
あくまで CakePHP 1.2 RC3 の場合ですが、サイトルートの表示にはいくつかの(とりあえず初心者には目に見えない)手順を踏んで表示されているようです。
たとえば http://cakephp.example.com/ という URL が CakePHP のインストールディレクトリをサイトルートとしてマップしていたとします。このとき、CakePHP は /app/config/routes.php に従って、/cake/libs/controller/pages_controller.php の display() メソッドを使ってコンテンツを表示しようとします。
この際、表示のテンプレートとして使われるのは /app/views/pages/home.ctp になります。さらに、/app/views/layouts/default.ctp があれば、通常は $contents_for_layout の中身として home.ctp の内容が合成されて表示されるはずです。。
しかし、home.ctp と組み合わせるものとしてここで default.ctp を使いたくない場合はどうしたらいいのでしょうか?(たとえばトップページのみに使用したい特別なテンプレートを表示したい場合など)
通常であればレイアウトファイルの変更は難しくなく、コントローラ内の、URL からマップされるページ名のメソッド(例えば index() といった感じの)の中に
$this->layout = "default2"
などと書いておけば、/app/views/layouts/default.ctp のかわりに /app/views/layouts/default2.ctp を使ってくれます。
しかしこここで問題が。/app/controllers/ 以下にはないコントローラである /cake/libs/controller/pages_controller.php の display() メソッドに同様に書いても動作しないのです。これでは常に default.ctp のレイアウトのみしか指定できないことになり、困ってしまいます。
解決方法はシンプル
ちょっと乱暴ですが、次のやりかたで解決できています。home.ctp の冒頭に、次のように書いてしまいます。
<?php
$this->layout = "default2";
$this->pageTitle = "This is pageTitle";
?$gt;
/cake/libs/controller/pages_controller.php に beforeFilter をつけるなども試してみたいところですが、これでは /pages/* の全てに適用されてしまうのでうまくありません。当座の策としては、まずはお手軽に home.ctp の冒頭でレイアウトファイルを指定してしまうのがよいのではないでしょうか。今回使用するレイアウトファイルに $title_for_layout を仕込んでいれば、いっしょに $this->pageTitle でタイトルに設定したいテキストを追記しておくのもよいかもしれません。
実際はどういう順番で動いているのか分かりませんが、テンプレートファイルの home.ctp を読み込む際に $this->layout の値が取り込まれているのなら納得できますね。
このように、home.ctp と組み合わせる /app/views/layout 以下のファイルをもっとスマートに指定する方法、どこかで詳しく解説されていないでしょうかね。
その他のエントリでの pages_contoller まわりの既述
新規作成すると上書き
-CakePHP / DirectryIndexっぽいことを実現|とんでもブログ ~ プログラマのWeb開発メモ (PHP, CSS, JavaScript)
pages_controller をコピーするのも賢いかも?
静的ページをアジャイルにつくるときにも便利
-CakePHP 静的なページの作成方法 | Sun Limited Mt.
このページによると「サイトルートにあたる / 」は、router.php のチカラも借りて「/pages/home/」を表示している似すぎないと言うことがよくわかりますね。実際に /pages/home/ にアクセスしてもサイトルートと同じページを見ることが出来ます。
関連記事



コメント ( 1 )
はじめまして。
トップページのデザインに悩んでいたので、参考になりました。
細かいことで申し訳ありませんが、誤字と思われるものを見つけたのでお知らせします。
--------------------------------------------------
しかし、home.ctp と組み合わせるものとしてここで default.ctp を使いたくない場合はどうしたらいいのでしょうか?(たとえばトップページのみに使用したい特別なテンプレートを夭死したい場合など)
--------------------------------------------------
『夭死』ではなく『表示』ではないでしょうか?
投稿者: sutara_lumpur | 2009年01月23日 10:26
日時: 2009年01月23日 10:26