Paginator
Veri listesini sayfalamanız mı gerekiyor? Sayfalama matematiği yanıltıcı olabileceğinden, Nette\Utils\Paginator size yardımcı olacaktır.
Kurulum:
composer require nette/utils
Bir sayfalayıcı nesnesi oluşturalım ve temel bilgileri ayarlayalım:
$paginator = new Nette\Utils\Paginator;
$paginator->setPage(1); // mevcut sayfa numarası
$paginator->setItemsPerPage(30); // sayfa başına öğe sayısı
$paginator->setItemCount(356); // toplam öğe sayısı (biliniyorsa)
Sayfalar 1'den başlar. Bunu setBase()
kullanarak değiştirebiliriz:
$paginator->setBase(0); // 0'dan numaralandırıyoruz
Nesne şimdi sayfalayıcı oluştururken yararlı olan tüm temel bilgileri sağlayacaktır. Örneğin, onu bir şablona aktarabilir ve orada kullanabilirsiniz.
$paginator->isFirst(); // ilk sayfada mıyız?
$paginator->isLast(); // son sayfada mıyız?
$paginator->getPage(); // mevcut sayfa numarası
$paginator->getFirstPage(); // ilk sayfa numarası
$paginator->getLastPage(); // son sayfa numarası
$paginator->getFirstItemOnPage(); // sayfadaki ilk öğenin sıra numarası
$paginator->getLastItemOnPage(); // sayfadaki son öğenin sıra numarası
$paginator->getPageIndex(); // 0'dan başlayan mevcut sayfa numarası
$paginator->getPageCount(); // toplam sayfa sayısı
$paginator->getItemsPerPage(); // sayfa başına öğe sayısı
$paginator->getItemCount(); // toplam öğe sayısı (biliniyorsa)
Sayfalayıcı, SQL sorgusu oluştururken yardımcı olur. getLength()
ve getOffset()
metotları,
LIMIT ve OFFSET yan tümcelerinde kullanacağımız değerleri döndürür:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getOffset(),
);
Ters sırada sayfalamamız gerekiyorsa, yani sayfa no. 1 en yüksek ofsete karşılık geliyorsa,
getCountdownOffset()
kullanırız:
$result = $database->query(
'SELECT * FROM items LIMIT ? OFFSET ?',
$paginator->getLength(),
$paginator->getCountdownOffset(),
);
Uygulamada kullanım örneğini Veritabanı sonuçlarını sayfalama tarifinde bulabilirsiniz.