Paginator

データリストをページ分割する必要がありますか?ページネーションの計算は厄介な場合があるため、Nette\Utils\Paginator が役立ちます。

インストール:

composer require nette/utils

ページネータオブジェクトを作成し、基本情報を設定します:

$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // 現在のページ番号
$paginator->setItemsPerPage(30); // ページあたりのアイテム数
$paginator->setItemCount(356); // 合計アイテム数(わかっている場合)

ページは1から番号付けされます。これは setBase() を使用して変更できます:

$paginator->setBase(0); // 0から番号付けします

オブジェクトは、ページネータを作成する際に役立つすべての基本情報を提供します。例えば、テンプレートに渡してそこで使用できます。

$paginator->isFirst(); // 最初のページですか?
$paginator->isLast(); // 最後のページですか?
$paginator->getPage(); // 現在のページ番号
$paginator->getFirstPage(); // 最初のページ番号
$paginator->getLastPage(); // 最後のページ番号
$paginator->getFirstItemOnPage(); // ページ上の最初のアイテムのシーケンス番号
$paginator->getLastItemOnPage(); // ページ上の最後のアイテムのシーケンス番号
$paginator->getPageIndex(); // 0から始まる現在のページ番号
$paginator->getPageCount(); // 合計ページ数
$paginator->getItemsPerPage(); // ページあたりのアイテム数
$paginator->getItemCount(); // 合計アイテム数(わかっている場合)

ページネータは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(),
);

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

バージョン: 4.0