トップ > ラボブログ

ラボブログ

« mixi アプリが続々と開発されているもよう | メイン | OpenSocial Hackathon 参加中! »

【CakePHP】ちょっと考えてしまいがちな home.ctp のレイアウト変更

あとで読む

スパイスラボ神部です。


CakePHP でちょっと考え込んでしまいがちなサイトルートのテンプレートでもある home.ctp のレイアウト変更。どうやって指定してあげたらいいか、ここではちょっと自分の経験則について書いてみます。


CakePHPが好きだ! - Favorites!


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入門


静的ページをアジャイルにつくるときにも便利


-CakePHP 静的なページの作成方法 | Sun Limited Mt.


このページによると「サイトルートにあたる / 」は、router.php のチカラも借りて「/pages/home/」を表示している似すぎないと言うことがよくわかりますね。実際に /pages/home/ にアクセスしてもサイトルートと同じページを見ることが出来ます。

 



関連記事



ブックマークに追加する この記事についてTwitterでツイート

トラックバック

このエントリーのトラックバックURL:
http://www.spicebox.jp/cgi-bin/mt/mt-tb.cgi/679

コメント ( 1 )

はじめまして。

トップページのデザインに悩んでいたので、参考になりました。
細かいことで申し訳ありませんが、誤字と思われるものを見つけたのでお知らせします。

--------------------------------------------------
しかし、home.ctp と組み合わせるものとしてここで default.ctp を使いたくない場合はどうしたらいいのでしょうか?(たとえばトップページのみに使用したい特別なテンプレートを夭死したい場合など)
--------------------------------------------------
『夭死』ではなく『表示』ではないでしょうか?

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

mixiアプリ本
4/22発売!

mixiアプリをつくろう!
OpenSocialで学ぶ
ソーシャルアプリ



(株)スパイスボックス
神部 竜二(著)

書籍情報






検索



神部竜二
ブログ執筆者の一人です。ネットの新しい話題や Web まわりのプログラミング、Web 広告について書いていきたいと思います。


About

2008年12月16日 23:51 に投稿されたエントリーのページです。

ひとつ前の投稿は「 mixi アプリが続々と開発されているもよう 」です。

次の投稿は「 OpenSocial Hackathon 参加中! 」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

SEO ブログパーツ  

+ インデックス数計測 +