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() メソッドは、LIMITOFFSET 句で使う値を返します。

$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(),
);

アプリケーションでの使用例は、クックブックのデータベースの結果のページ分けにあります。

バージョン: 4.x