おそらく、当ブログで初めて「CakePHPのソースコード単体」を紹介すると思います。
以前の記事で書いていますが「当方からはHow toは発信しない」のが理由なんですけど、ちょっと便利なのと、あまりこういう使い方をされている人がいらっしゃらないみたいなので、気まぐれで書いています。
さて前置きはこれくらいにして…
CakePHPでサイトを製作している際に、「プログラムで制御する必要がない複数のページを表示する」もしくは「一部のデータが違うだけで、全く処理が同じような複数のページを表示する」といった場合に、どうやって実装していますでしょうか?
前者の場合は、一般的には「pages」コントローラを使う方もいるでしょう。htmlやctpを突っ込むだけで、コントローラいらずで表示される便利な機能です。ただ、欠点はpagesコントローラを必ず呼ばなければならないため、他の名前のコントローラで似たようなことをやりたいことも出てくるでしょう。
具体的には、次のようなケースを考えてみます。
会社案内を表示する「companies」コントローラを作り、その中でいくつかの情報を紹介する。
次のアクションを設ける。
- 概要を表示する「index」
- 企業理念を表示する「detail」
- 財務情報を表示する「ir」
- 所在地を表示する「map」
上記の場合、DBを扱うような特別なコントローラは必要とせず、単一のviewを呼び出すだけで良いと思いますが、通常の場合、それぞれのアクションを用意しなければなりません。
そこで、次のようなコントローラを書くことで、「一つのアクションで全部のアクションを用意したような振る舞いをさせる」ようにします。
<?php class CompaniesController extends AppController { var $name = 'Companies'; var $uses = array(); var $render_view = 'index'; //レンダリングするビューを格納する場所 function beforeFilter(){ //indexアクション以外は、indexアクションにして、actionをrender_viewに入れる if($this->action != 'index'){ $this->render_view = $this->action; $this->action = $this->param['action'] = $this->method[0] = 'index'; } } function index(){ $this->render($this->render_view); } } ?>
あとは「view/companies/」ディレクトリ内に「index.ctp」「detail.ctp」「ir.ctp」「map.ctp」を用意すれば、それぞれのアクション名でアクセスが可能です。