標準装備のページング機能paginate()
とりあえず久々にcakePHPに取り組んでいるが、ぜんぜん思い出せない。1.2ベータにチャレンジしたのが無謀ともいえないではないけれど、いまさら1.1を始めるのもちょっと・・・。
基本的なところは放置して、まずはテーブルを作成してbake。出来上がったスクリプトを覗くところから始める。ここでコントローラの記述に注目。1.1のときはなかったメソッドがいきなり出てくる。
function index() {
$this->Site->recursive = 0;
$this->set(‘sites’, $this->paginate());
}
sitesというテーブルを作ってbakeしてみた。上記はテーブル中のデータを一覧表示させるメソッドだ。この中の最初の行は見覚えがある。
$this->Site->recursive = 0;
sitesテーブルとリレーションのあるテーブルからデータをとってくるかどうか(とってくる階層を指定)。デフォルトは関連テーブルからのデータ取得はしない設定になっている。ここは問題なし。
2行目で新メソッドが出てくる。$this->paginate()。たしか前はfindAllメソッドが呼び出されていた箇所だ。まぁ、しかしメソッド名から想像はつく。findAllにページング処理が追加されたものだ。いきなり便利になっている。すばらしい。どういう処理になっているのか詳しく知りたいわけではないが、いちおう調べてみる。継承元の以下のファイルを調べる。
cake/libs/controller/controller.php
とりあえずpaginateで検索すると変数の定義がでてきた。
var $paginate = array(‘limit’ => 20, ‘page’ => 1);
ページング関連の設定でデフォルトで1度に取得する行数を20として、ページ番号の指定がなければ1ページ目をとってくる、ということだろう。変更したければ作成したコントローラに上記の一行を書き加えて、適宜数値を変えればよさそうだ。
で、更に検索してpaginateメソッドが出てくる。どうやら以下の引数をとるようだ。
function paginate($object = null, $scope = array(), $whitelist = array()) {
(プログラムが書かれている)
}
ここも詳しくはわからないけれど、SQLのwhere句などを記述できそうだ。今はまだサンプルが見つけられないので、自分で適宜試してみるしかなさそうだ。
ちなみにbakeしたスクリプトにウェブからアクセスして1行追加してみた。データが追加されるのは当然だけれど、createdにデータ作成日時が自動挿入されない。たしかここは何も入力しなくても勝手にやってくれるはずだったと思ったのだが・・・。
当面試行錯誤が続きそうだ。