「Paginationのために
Webアプリに欠かせない「ページ繰り」は自前でやるのは面倒!
ページ繰りとは、

複数のデータを列挙するWebアプリケーションでは、
しかし、
「次へ」
このようにすべてのケースに対応できるような汎用的なコードを書こうとすると結構大変なので、
そんな面倒なページ繰りを、
Pagination例その1:基本のサンプルコード
もしPaginationのコードを見るのが初めてな場合、
Paginationはコントローラーでセットアップし、
<?php
class SampleController extends AppController {
var $name = 'Sample';
var $uses = array('Post');
var $paginate = array(
'limit' => 25,
'order' => array(
'Post.id' => 'desc'
),
);
functon posts() {
$this->set('posts', $this->paginate('Post'));
}
}
次にビューです。PaginatorHelperで表示します。PaginatorHelperはコントローラーで指定しなくても読み込まれています。
リスト app/<?php
echo $paginator->prev('前へ');
echo $paginator->numbers();
echo $paginator->next('次へ');
?>
たったこれだけで、
| <span class="current">1</span> | <span><a href="/sample/posts/page:2">2</a></span> | <span><a href="/sample/posts/page:3">3</a></span> | <a href="/sample/posts/page:2">次へ</a>
ブラウザ上の表示は図2のようになります。

「前へ」
$paginator->prev('前へ', null, '前へ')
また、
Pagination例その2:検索条件や取得フィールドなどを指定する
取得するレコードの検索条件の指定や、
<?php
class SampleController extends AppController {
var $name = 'Sample';
var $uses = array('Post');
var $paginate = array(
'conditions' => array(
'Post.status' => 'active',
),
'fields' => 'Post.id, Post.title, Post.created',
'order' => 'Post.id desc',
'recursive' => -1,
);
functon posts() {
$this->set('posts', $this->paginate('Post'));
}
}
パラメータの形式はModel::find()メソッドの引数と同じです。
Pagination例その3:URLからのパラメータも引き継ぐ
URLから受け取ったパラメータを引き継ぎたいときは、
例は、
<?php
class SampleController extends AppController {
var $name = 'Sample';
var $uses = array('Post');
functon posts($category_id) {
$this->paginate = array(
'conditions' => array(
'Post.category_id' => $category,
),
'order' => 'Post.id desc',
);
$this->set('posts', $this->paginate('Post'));
$this->set('paginator_option', array('url' => array($category_id)));
}
ビュー側では、
<?php
echo $paginator->prev('前へ', $paginator_option));
echo $paginator->numbers($paginator_option);
echo $paginator->next('次へ', $paginator_option);
?>
出力結果は以下のようになります。
| <span class="current">1</span> | <span><a href="/sample/posts/123/page:2">2</a></span> | <span><a href="/sample/posts/123/page:3">3</a></span> | <a href="/sample/posts/123/page:2">次へ</a>
また、
まだまだある、PaginatorHelperのメソッド群
Paginatorができるのは前後のリンクとページ番号だけではありません。PaginatorHelperのメソッド群を利用すればかなり複雑なページ繰り表示にも自由に対応できます。メソッド群の一部を表にしました。
counter() | 「1ページ目を表示 4ページ中」 |
---|---|
current() | 現在のページ番号 |
first() | 最初のページへのリンク |
last() | 最後のページへのリンク |
hasNext() | 次のページがあるか (true or false) |
hasPrev() | 前のページがあるか (true or false) |
hasPage($page) | 指定のページ番号のページがあるか (true or false) |
$params | ページ数などの情報やパラメータが詰まった連想配列。例えば $paginator->params['paging']['Post']['count'] で件数を取得できる。 |
とくに$paginator->params変数の中身は、