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(),
);
アプリケーションでの使用例は、クックブック データベース結果のページ分割 にあります。