普通のPaginationパッケージ作った

  • 6
    Like
  • 0
    Comment
More than 1 year has passed since last update.

ごく普通の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サンプル

それ以外の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とソースを読んで…お願いします。

今後の予定

テストを増やす

テストのカバー率をもう少しあげたいです。さらに実際のプロジェクトに使ってみて、使い勝手やバグ出しが必要と思ってます。

セッションとの密結合

セッションを使ってるのが前提で動いてます。ので、セッションがない場合への対応が必要と思ってます。