LoginSignup
7

More than 5 years have passed since last update.

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

Posted at

ごく普通の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とソースを読んで…お願いします。

今後の予定

テストを増やす

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

セッションとの密結合

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7