ページャライブラリ SimplePagination の紹介

dietcake advent calendar 2014 の17日目です。
今日は dietcake が使われる過程で同時期に生まれたライブラリ、SimplePagination を紹介します。

PHPにおけるページャ実装は、 PEAR::Pager をはじめとして
遥か古の時代から作られ続け、最近はフレームワークに内蔵される事も多くなりました。
CakePHPなんかは、paginationだとかpaginatorだとか似たような名前のページャの仕組みがいくつもあって
悩ましかった記憶があります。CakePHPのページング処理には1.2からはpaginatorを使え)

結局、フレームワーク関係なく、「これ使っとけ」的なページャライブラリは現代においても登場していないわけですが、
その理由の一旦は、ページャの実装自体が、外部のリクエストパラメータと、ページングに必要な情報と、デザインレイアウトという
MVCという流れの中のすべての要素を必要とするからだと私は考えています。

SimplePaginationは、ページャが持つべき最低限の機能だけを搭載する事で、できるだけフレームワークや表示物に依存しないように作られています。
ページャを利用するまでの手順は、まず最初にページ番号(current)と、1ページ当たりの表示件数(count)を指定した SimplePagination インスタンスを作ります。
そして次に、ページャとして表示するためのデータを準備します。DBから一覧を取り出す場合は、この時に1ページに表示する件数 + 1件分取得するようにしておいて、 SimplePagination の checkLastPage() メソッドを実行すると、最終ページかどうかの判定を簡単に行なう事ができます。
一覧がDBではなかったりして、明示的に最終ページである事を指定したい場合は、直接 is_last_page メンバを編集しても構いません。

current, count, is_last_page の3要素を指定したら、あとはこのインスタンスを View に持ってきてレンダリングするだけです。
以下のようなスニペットを用意しておいて、コピペしながら値を埋めていくと良いでしょう。

<?php if($pagination->current > 1): ?>
  <a href='?page=<?php echo $pagination->prev ?>'>Previous</a>
<?php else: ?>
  Previous
<?php endif ?>

<?php foreach ($items as $item): ?>
  <a href="<?php echo $item['id'] ?>"><?php echo $item['id'] ?></a> 
<?php endforeach ?>

 <?php if(!$pagination->is_last_page): ?>
  <a href='?page=<?php echo $pagination->next ?>'>Next</a>
<?php else: ?>
  Next
<?php endif ?>

SimplePagination は、主にガラケー時代によくあったシンプルなページネーションを実現するものなので、
スマホが増えてモバイルでもリッチなインターフェイスを要求される昨今では使いづらい部分も多いかと思われますが、
世の中に公開されているページャは割りと規模が大きかったり、JSON出力で使うのには向いてなかったりするものが多いので
小規模だったり、HTML以外のものにページャを適用する場合は使ってみてください。

公開されているサンプルだと、aososa/board-adrianが参考になるでしょう。

投稿者: halt

PHPプログラマ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください