ごく普通のPaginationパッケージを作ったので、Qiitaで公開してみます。フレームワークやORMと密結合していない、オフセットとリミットを使うことを想定したページネーション用パッケージです。
特徴は、
- ページ番号などをセッションに保存して、使い勝手を向上、
- HTMLの生成オブジェクトを使って、柔軟性をもたせている。
- PSR-7オブジェクトも使える、
といったところです。
ライセンスなどについてはGitHub参照してもらって…
何故作ったのかというと、Doctrine2を単独で使うプロジェクトがあったのですが、独立して使いやすいページネーションライブラリが見つからなかったからです。昔作ったコードを引っ張りだして作りなおしました。肝心のプロジェクトには間に合わなかったので、いまだ実際に使ったことのないパッケージなので注意して下さい。まだアルファ状態です。
簡単な使い方
HTMLフォーム
こんなフォームを作って下さい。無くてもOKです。
<form action="find">
<input type="text" name="type" />
<input type="integer" name="num" />
<input type="submit" />
</form>
ただし、_page
という変数は使わないで下さい。
Pagination
オブジェクト
Pagination
というオブジェクトで、フォームからの入力からSQLなどを操作します。
use Tuum\Pagination\Inputs;
use Tuum\Pagination\Pagination;
$pages = Pagination::forge()->call(
$request, // PSR-7 ServerRequestInterface object
function(Inputs $inputs) use($pdo) {
// sample query using PDO
$found = $pdo->prepare("SELECT * FROM tbl WHERE type=? and num>? OFFSET ? LIMIT ?")
->execute([
$inputs->get('type'),
$inputs->get('num'),
$inputs->getOffset(),
$inputs->getLimit(),
])
->fetchAll();
$inputs->setList($found);
});
$found = $pages->getList();
$type = $pages->get('type');
クロージャーを渡しておいて、その中でPDOやORMを操作してもらう形になります。オフセットとリミット、あるいはフォームからの入力はInputs
オブジェクトから読み出します。結果もInputs
オブジェクトに突っ込んで、後で読み出します。
フォームの入力やページ番号はセッションに保存され、この後のリクエストに備えます。なお、セッションに保存するのは_page
変数が存在しない場合のみです。
ページ番号指定
_page
変数を使ってページ番号を指定します。
GET /find?_page=2
最初と同じコードが走りますが、フォーム入力はセッションから読み出します。オフセットだけ、ページ番号から計算した値を渡します。
ページ番号未指定
_page
変数は渡しますが、ページ番号を未指定にします。
GET /find?_page
すると、ページ番号も含めて全ての変数をセッションから読み出します。最後のページと同じ条件でクエリを走らせることが出来ます。
HTMLの生成方法
Pagination
オブジェクトではデフォルトで、Bootstrap3用のHTMLを生成します。
echo $pages->__toString();
それ以外のHTMLを作りたい場合は、PaginateInterface
あるいはToHtmlInterface
を実装したオブジェクトを使って下さい。
use Tuum\Pagination\Paginate\PaginateInterface;
use Tuum\Pagination\ToHtml\ToHtmlInterface;
class MyPaginationClass implements PaginateInterface {...}
class MyToHtmlClass implements ToHtmlInterface {...}
$pages = Pagination::forge(
new MyPaginationClass,
new MyToHtmlClass
);
-
PaginationInterface
は、ページネーション用の配列を作ります。 - その配列を受け取って、HTMLに変換するのが
ToHtmlInterface
になります。 - 実装方法は、GitHubとソースを読んで…お願いします。
今後の予定
テストを増やす
テストのカバー率をもう少しあげたいです。さらに実際のプロジェクトに使ってみて、使い勝手やバグ出しが必要と思ってます。
セッションとの密結合
セッションを使ってるのが前提で動いてます。ので、セッションがない場合への対応が必要と思ってます。