例えば、CDショップのサイトをCakePHPで構築するとして、ロック音楽のパスを「/cd/rock/」、ポップ音楽のパスを「/cd/pop/」としたと仮定します。
CakePHPのコントローラの基本的なルールでは、「/cd/rock/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「rock」で処理が行われ、ビュー「/app/views/cd/rock.ctp」で表示されます。
同じくして、「/cd/pop/」にアクセスがあった場合に、コントローラ「CdController」のメソッド「pop」で処理が行われ、ビュー「/app/views/cd/pop.ctp」で表示されます。
ここでコントローラの処理についていうと、ジャンルは違えど処理はほとんど同じのはずです。処理を共通化したい場合には、コンポーネントを活用すればよいことは以前書きました。
CakePHPでコンポーネントを作成する
ビューについても、共通部分についてはエレメントでまとめることが可能です。
CakePHPでビューからエレメントを呼び出す
さて、コントローラのつくりをうまく工夫すれば、ビューをまったく同じ構造にすることができます。つまり、「rock.ctp」と「pop.ctp」の内容がまったく同じなわけです。たとえこれをエレメントで共通化したとしても、100のジャンルが存在するとなると、ビューファイル「/app/views/cd/xxx.ctp」が100ファイル存在することになります。
あまり気持ちがよいものではありませんね。
そこで、ビューを呼び出すルールを意図的に操作して、同じビューファイルを参照するようにコントローラに記述してあげます。この時に使用する関数が「render()」です。
class CdController extends AppController { function rock(){ /* 処理 */ $this->render('/common/category'); } function pop(){ /* 処理 */ $this->render('/common/category'); } function jazz(){ /* 処理 */ $this->render('/common/category'); } ...
このようにrender関数でビュー「/app/views/common/category.ctp」を参照するように指定してあげれば、いくつアクションがあったとしても、ビューファイルは1つ用意するだけでよいのです。
管理がだいぶすっきりしますね。
render関数の公式マニュアルです。
ビューとの連携 :: コントローラのメソッド :: コントローラ :: CakePHPによる開発 :: マニュアル :: 1.3コレクション :: The Cookbook
コメントする