「Paginationのために(CakePHP 1.1から)1.2にアップグレードしたい」と言う人がいるほど,Paginationは便利なものです。今回はPaginationの紹介と,サンプルコードを3つ紹介いたします。
Webアプリに欠かせない「ページ繰り」は自前でやるのは面倒!
ページ繰りとは,「次のページ」や「前のページ」の基本的なリンクから,「1 2 3 4 5 …」といったページ番号でのリンクなどのことです(図1)。
複数のデータを列挙するWebアプリケーションでは,必ずと言っていいほどこのページ繰りが必要になります。
しかし,ページ繰りをすべて自前でやるのは意外に面倒で,加減算や除算を駆使した計算をずらずら書かないといけません。表示のときにも場合わけが必要で,1ページ目なら「前へ」はリンクしませんし,最後のページなら「次へ」はリンクしません。
「次へ」「前へ」だけならまだしも,ページ番号の列挙などになると,計算に加えて「最大で5件表示するけど5件に満たないとき」などの例外への対応も必要になります。さまざまなパターンの動作確認のためのデータの用意も手間ですね。
このようにすべてのケースに対応できるような汎用的なコードを書こうとすると結構大変なので,仕様を簡略化したり,場当たり的に行っていた場合も少なくないのではないでしょうか。
そんな面倒なページ繰りを,計算から表示までほぼ全て引き受けてくれるのが「Pagination」機構なのです。
Pagination例その1:基本のサンプルコード
もしPaginationのコードを見るのが初めてな場合,「えっ,これだけでいいの?」と驚くことでしょう。
Paginationはコントローラーでセットアップし,ビューで表示させます。まずはコントローラです。
リスト app/controller/sample_controller.php
<?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/viess/sample/posts.ctp
<?php
echo $paginator->prev('前へ');
echo $paginator->numbers();
echo $paginator->next('次へ');
?>
たったこれだけで,前後のリンクとページ番号の列挙が完成しました。たとえば1ページ目を表示しようとして,最大3ページの場合,以下のようなHTMLが出力されます。
| <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のようになります。
「前へ」の表示がありませんが,1ページ目なので自動的に表示しないように処理されています。1ページ目でも何か表示したければprevメソッドの第三引数に文字列を渡せば1ページ目のときのみ出力されます。リンクは行われません。
$paginator->prev('前へ', null, '前へ')
また,ページ番号の列挙がspanで囲われていますが,これもnumbersメソッドへの引数によってliなどの要素にすることもできますし,適切にCSSをあてれば図1のように表示させることも可能です。

