Paginator
データの一覧をページ分けしたいですか。ページ分けの計算はややこしくなりがちなので、Nette\Utils\Paginator が助けてくれます。
インストール:
composer require nette/utils
paginator のオブジェクトを作り、基本的な情報を設定しましょう。
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // 現在のページ番号
$paginator->setItemsPerPage(30); // 1 ページあたりの項目数
$paginator->setItemCount(356); // 項目の総数(分かっていれば)
ページ番号は 1 から始まります。setBase() でこれを変えられます。
$paginator->setBase(0); // 0 から数える
これでオブジェクトは、ページ分けの操作部品を作るのに必要な情報をすべて提供します。たとえばテンプレートに渡してそこで使えます。
$paginator->isFirst(); // 最初のページか?
$paginator->isLast(); // 最後のページか?
$paginator->getPage(); // 現在のページ番号
$paginator->getFirstPage(); // 最初のページ番号
$paginator->getLastPage(); // 最後のページ番号
$paginator->getFirstItemOnPage(); // ページ内の最初の項目の通し番号
$paginator->getLastItemOnPage(); // ページ内の最後の項目の通し番号
$paginator->getBase(); // ページ番号の基準(既定は 1)
$paginator->getPageCount(); // ページの総数
$paginator->getItemsPerPage(); // 1 ページあたりの項目数
$paginator->getItemCount(); // 項目の総数(分かっていれば)
paginator は SQL クエリの組み立てにも役立ちます。getLength() と getOffset()
メソッドは、LIMIT と OFFSET 句で使う値を返します。
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
逆順にページ分けする必要があるなら(つまり 1
ページ目が最も大きなオフセットに対応する場合)、getCountdownOffset() を使います。
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
アプリケーションでの使用例は、クックブックのデータベースの結果のページ分けにあります。