もふもふ技術部

CakePHPのPagination機能を使ってみる


概要

CakePHPのPagination機能を使って、検索結果をページングしたり、ソートをしたりしてみる。

下記ページを参考にした。
http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html

CakePHP2.2.5を利用。

前提条件

適当にBakeした一覧画面が作成済みであること。

Controllerに設定を追加する

とりあえずControllerに、1ページ何件か、ソート順はどうするかなどを設定する。例はUserテーブルに、id、usernamer、passwordが入っているようなテーブルに対して実行することを想定。

$paginateに、limit(1ページの表示件数)と、order(ソート順)を指定している。

Viewにページングの表記を追加する

Viewに下記のように記述して、「前へ」と「次へ」でページを進められるようにしてみる。

$this->Paginator->prevで全画面への動きを、同nextで次画面への動きを設定できるらしい。

counterメソッドのformat文字列内は、{:page}が現在表示しているページ番号、{:pages}が全ページ数を表す。

これで「前へ 1/3ページを表示 次へ」のようなページング機能が出力される。前や次がない場合は自動的にリンクが無効になる。

Paginator->numbersを使うと、「1 2 3 4 5」のように番号が表示されて、押すと指定したページに飛ぶ形になる。

ページング時に取れるパラメータ

BakeしたViewを見ると、パラメータを使ってFormatした文字列を出力している箇所がある。

page(現在のページ番号)、pages(全ページ数)、current(現在表示しているレコードの数)、count(全レコード数)、start(1行目のレコード番号)、end(10行目のレコード番号)などが取れるらしい。

これらを個別に取り出して利用するにはどうすれば良いのだろうか。とりあえずこんな記述で取ることはできた。もっと良い取り方がありそうな気はする。

startとendはどうやって取っているんだろう、ということでPaginatorHelper.phpのソースを見てみると、下記のように計算していた。

ページング時のURL

ページング時のURLは下記のようになっていた。page:1のところをpage:2にすれば2ページ目が開く。

http://localhost/users/index/page:1

これに「sort:field_name」のように、ソート条件も付けてやると、指定したフィールドでソートされた。

http://localhost/users/index/page:1/sort:username

パラメータをクエリストリングで指定できるような設定もあるようだ。下記のようにparamTypeにquerystringを設定すると、「?page=2」のような指定で遷移した。

この場合、ソート条件を加えると下記のようになる。

http://localhost/users?page=2&sort=username

ソートの方向(ASC/DESC)も加えると、こんな感じ。

http://localhost/users?page=1&sort=username&direction=asc

The following two tabs change content below.
masato watanabe

masato watanabe

もふもふ部ブレーン。プログラマ兼ライター。