こんなコード。AppControllerのbeforeFilterだと検索前になっちゃうので、beforeRenderで。
public function beforeRender(Event $event) { // ・・・ // ページネーションはindexで使う if($this->request->action == "index") { // カスタムのサンプル。全テーブルにidというカラムがあるという前提のもと、id降順 $this->paginate["order"] = ["id" => "DESC"]; // テーブル名=Controller名なのでnameプロパティでアクセス可能 $rows = $this->paginate($this->{$this->name}); // ここがキモ。デフォルトのbakeコードでは、先頭小文字のキャメルケースで検索結果をset。 // なのでvariableで変換して上書き $this->set(Inflector::variable($this->name), $rows); $this->set('_serialize', [Inflector::variable($this->name)]); } }
問題は、各コントローラのindex関数での検索処理が無駄になること!
※ので、仕事ではbake templateを書き換えて対応したけど、、、
indexで使うpaginateプロパティの設定をAppControllerとか、外からいじれればいいんだけどなー
// 今のindex()。。。index前、例えばbeforeFilterでpaginateの設定しても上書きされちゃう $this->paginate = ["contain" => ["hoge", "hogehoge"]];
ので、例えば↓みたいになれば、beforeFilterで設定できそう。containはだめだけど、、、
// こんなふうならいいのにな~。containって多次元配列も使えたかもだけど、 // このコードはドット記法前提。 array_merge($this->paginate["contain"], ["hoge", "hogehoge"]);
でも外からいじれるようになってない、ってことは、なんか今のコードに意味があるんだろうかね?変にカスタムされるとバグるとか・・・
最近のマイトレンドがいかにbake生成コード、さらにbake templateもデフォルトのままでシステムを作るか、ってことでこんなTIPSでした。
bake templateをいじる開発方法で作ったこともあって、それはそれで問題なかったんだけど、本家bake templateのバグFIXを取り込めなくなるのが辛い。