CakePHP1.3のScaffold優先順位についてまとめ

CakePHP1.3のScaffold機能が便利なので、管理機能なんかはほとんど丸投げしちゃえて楽な感じです。ただ公式ドキュメントやGoogle先生で調べてみると、予想を遙かに超えて柔軟にカスタマイズできるようなので、個人的な備忘録を兼ねてまとめてみることにします。

ちなみに今知ってること、ネットで見つけたことがほとんどでソースはピンポイントでしか追っていないので、まだまだ隠されている機能があるかもしれません。恐ろしい子ッ…!

  1. コントローラーにvar $scaffoldが定義されていればscaffold機能を使用する。その際に自動で動作するアクションは「‘index’, ‘list’, ‘view’, ‘add’, ‘create’, ‘edit’, ‘update’, ‘delete’」の8つ。(でもindex=list、add=create、edit=updateみたいだから、実質5つ…のはずなのに、listだけviewがないって怒られる。バグ?)
  2. var $scaffold = ‘admin’のようにRouting.prefixesで設定されている値が使用されていれば、自動で動作するアクションは$scaffoldで設定されたprefix名が付加されたものになる。この例だと「’admin_index’, ‘admin_list’, ‘admin_view’ … ‘admin_update’, ‘admin_delete’」の8つが動作する。この場合、prefixがつかない方のアクション(index, viewなど)は動かないので注意。
  3. var $scaffold = array(‘index’, ‘view’)のようにscaffoldで任意で動作させたいアクション名を配列で指定可能。この例だと、indexとviewはscaffoldで動くが、add,edit,deleteの3つは(コントローラーで定義しないと)動作しない。
  4. var $scaffold = array(‘admin_index’, ‘admin_view’)もいけるかと思ったけど、prefix付きのアクションは動作せず。自分の設定ミス?それともバグ?仕様??
  5. 各コントローラーにアクションを記述した場合、scaffoldで自動生成されるアクションよりも優先される。基本scaffoldでいいけど、indexだけカスタマイズしたい場合はfunction index()を記述すればそちらが使用される。

コントローラーについてサクっとまとめると

  • var $scaffoldの記述なし(scaffold使用しない)
  • var $scaffold;
  • var $scaffold = ‘admin’;
  • var $scaffold = array(‘index’, ‘view’);

の4パターンの指定が可能で、scaffoldの利用に関わらず、各コントローラーにアクションが定義されていればそれが最優先ってことらしい。多分。

Scaffoldで使用されるビューの優先順位

  1. 例えばposts_controllerでvar $scaffoldが定義されていて、アクションを上書きしていない場合(function index()などの記述がない)は、app/view/posts/scaffold.index.ctp -> app/view/scaffolds/index.ctp -> cake/libs/view/scaffolds/indexctpの順に探しにいく。
  2. 各コントローラーでアクションを上書きした場合は、scaffoldsのビューは使用されない。例えばfunction index()を記述した場合は、app/view/posts/index.ctpを用意してあげる必要があります。ないと怒られます。

ビューに関してまとめると、コントローラーで自分で定義したアクションについては、必ず対応するビューを用意する必要があるって事でいいのかな。scaffoldで自動生成されたアクションに関しては、上の優先順位1のように探しにいきます。

CakePHP1.3のScaffold機能、コントローラー単位、アクション単位、ビュー単位で柔軟にカスタマイズできそうなので、上手く利用できれば作業がかなり楽になりそうです。使いこなすぞー!

それではまた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です