最近オリンピックのサッカーの試合みてばかりで寝不足です。目指せアベック優勝!!!
Controllerの概要
Controllerの役目
CakephpのControllerは色々と指示を出す人です。多分、日本名は魂斗羅くんです。流行りのキラキラネームですが、仕事はできるヤツです。
魂斗羅くんはユーザーの注文を受け取って、ModelやView(美優さん)をこき使い、ユーザーに正しく返答できるようにするのが責任範囲です。
関係ないModelやViewは呼び出しません。必要に応じて美優さんに助っ人つけます。そんな感じの仕事をしてます。
PagesControllerを改造する
今までの所index.ctpでレイアウトを指定してますが、これをPagesControllerで指定するように変更します。
index.ctpのレイアウトを設定している部分を削除します。
app/View/Pages/index.ctp
<?php //$this->layout = "guest"; ?> ...
app/Controller/PagesController
...
public function index(){
$this->layout = "guest";
}
...

見た目が変わらないので、よく分かりませんがとりあえずOKです。
他のページを追加する。
とりあえず1ページだけ追加してみます。まず、routesの設定をコメントアウトします。
app/Config/routes.php
...
// Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); //コメントアウトします。
...
後は簡単で2箇所修正します。コントローラにメソッドを追加します。
app/Controller/PagesController
...
public function index(){
$this->layout = "guest";
}
//add
public function scaffolding() {
$this->layout = "guest";
}
...
app/View/Pages/scaffolding.ctp
<?php ?> <div class="row"> <div class="span3">サイド</div> <div class="span9">scaffolding</div> </div>

... 相変わらず変化しないので、分かりづらいですがOKのようです。
色々と試す
ここで色々と試してみたいと思います。とりあえず以下の用にscaffoldingメソッド内でレイアウトをdefaultに指定してみます。
app/Controller/PagesController
...
public function index(){
$this->layout = "guest";
}
public function scaffolding() {
$this->layout = "default";
}
...
「dream-travel.boo.jp/twitter_bootstrap_2.0.4/」

「dream-travel.boo.jp/twitter_bootstrap_2.0.4/pages/scaffolding」

scaffoldingの方はCakephpデフォルトのレイアウトが適応されてます。つまりメソッド毎にレイアウトを振り分ける事ができます。
もう一つ試します。PagesControllerのメンバでレイアウトを設定してみます。
app/Controller/PagesController
...
/**
* This controller does not use a model
*
* @var array
*/
public $uses = array();
public $helpers = array('B99TwitterBootstrap');
public $layout = "guest";
...
public function index(){
//$this->layout = "guest"; ←実際は削除する。
}
public function scaffolding() {
//$this->layout = "default"; ←実際は削除する。
}
...
「dream-travel.boo.jp/twitter_bootstrap_2.0.4/」

「dream-travel.boo.jp/twitter_bootstrap_2.0.4/pages/scaffolding」

両方共guestのレイアウトが適応されてます。メソッド毎に変えないという事ならこれでも良いです。
もっと汎用的にレイアウトを設定する
上記の方法でそれぞれレイアウトを設定しても問題ないのですが、Cakephp1.3で何個かサイト作った経験で私は定形的以下の方法でやってます。
1.AppControllerを修正します。beforeFilter()を追加して、その中に条件付きでレイアウト設定します。
app/Controller/AppControllerを修正
...
class AppController extends Controller {
public function beforeFilter(){
//レイアウトの設定
if (Configure::read('debug') == 0) {
$this->layout = "guest";
}
}
}
また、beforeFilter()メソッドはCakephpのコールバックの1つで、コントローラの各アクションの前に実行されます。
Configure::read('debug')はapp/Config/core.phpで設定するデバッグのレベルを取得します。
なのでここで追加した内容は、「全てのコントローラのアクション実行前にデバッグレベルが0だったらレイアウトをguestに設定する」という事をしてます。
2.各コントローラにbeforeFilter()を追加して、その中に条件付きでレイアウト設定します。ここではPagesControllerを修正します。
app/Controller/PagesController
...
// public $layout = "guest"; //←実際は削除
...
public function beforeFilter(){
//レイアウトの設定
if ('CakeError' === $this->name && Configure::read('debug') > 0){
$this->layout = "defalut";
} else if('admin' === $this->request['prefix']) {
// $this->layout = "admin";
} else {
$this->layout = "guest";
}
}
- エラーがあるかつデバッグレベルが0を超えていたらレイアウトはdefalut
- 管理者用のアクセスだったらレイアウトはadmin
- それ以外はguest
汎用的にレイアウトを設定した場合アクセス結果
上の修正をした時のアクセス結果のスクショです。
| URL | デバッグレベル 2 | デバッグレベル 0 |
|---|---|---|
| dream-travel.boo.jp/twitter_bootstrap_2.0.4/ | ![]() |
![]() |
| dream-travel.boo.jp/twitter_bootstrap_2.0.4/pages/hoge | ![]() |
![]() |
| dream-travel.boo.jp/twitter_bootstrap_2.0.4/hoge | ![]() |
![]() |
まとめ
- コントローラで色々と仕事を振り分ける
- 設定をコントローラで行う事もある
- AppControllerとかコールバック関数とかがある
環境とか
| 項目 | 内容 |
|---|---|
| PHPフレームワーク | Cakephp 2.2.0 |
| IDE | Eclipse 3.6 |
| 開発環境? | MAMP |
| PC | Macmini |
| OS | Mac OS Lion |






0 件のコメント:
コメントを投稿