Mohl by (Visual)Paginator vracet offset bez nastaveneho itemCount?
- mcl
- Člen | 2
Zdravím, mám jednu připomínku k (visual)paginatoru.
Všechny příklady užití paginatoru (např. https://doc.nette.org/…tion/routing) předpokládají, že model má jednu metodu na vracení celkového počtu výsledků a jednu na samotná, limitovaná, data. To ale není moc efektivní. Jsou to dva dotazy do databáze na informaci, která by se dala získat jedním dotazem.
Např. v MySQL existuje konstrukce „SELECT SQL_CALC_FOUND_ROWS …“ která jedním SELECTem získá data i celkový počet nalezených položek. Ale neomezoval bych model jen na databáze. Hodně používám v modelech Sphinx Search a tam je samozřejmostí, že součástí limitovaného výsledku je i celkový počet nalezených položek bez limitu.
Takže potřebuji modelu předat offset dříve, než paginatoru předám itemCount. Dokud ale paginatoru nedám itemCount, tak vrací v offsetu nulu. Takže začarovaný kruh. Přitom ten itemCount k výpočtu offsetu, podle mě, nepotřebuje. Může ho spočítat z itemsPerPage a čísla aktuální stránky.
Nebylo by možné, aby bez nastavení itemCount, byl paginator schopen vracet offset?
Tradicni pristup ke strankovani:
<?php
public function renderDefault()
{
$vp = $this['vp'];
$paginator = $vp->paginator;
// 1. dotaz modelu
$paginator->itemCount = $this->model->count();
// Nastaveni limitu
$this->model->setLimit($paginator->offset, $paginator->itemsPerPage);
// 2. dotaz modelu
$result = $this->model->data();
...
...
}
?>
A takhle by se mi to libilo:
<?php
public function renderDefault()
{
$vp = $this['vp'];
$paginator = $vp->paginator;
// Nastaveni limitu (offset uz musi neco vracet)
$this->model->setLimit($paginator->offset, $paginator->itemsPerPage);
// Jediny dotaz modelu
$result = $this->model->data();
// Teprve nakonec nastavit itemCount, ktery uz se ale znovu
// nepocita, je to jen ulozena informace ziskana predchozim dotazem
$paginator->itemCount = $this->model->lastItemCount();
...
...
}
?>
- hrach
- Člen | 1838
Upravil VisualPaginator, aby jako paginator pouzival tohoto potomka:
<?php
/**
* Umoznuje definovat pocet stran pozdeji, az po nahrati konkretnich dat
* @author Jan Skrasek
*/
class LatePaginator extends Paginator
{
protected $page;
public function setPage($page)
{
$this->page = (int) $page;
return $this;
}
protected function getPageIndex()
{
return max(0, $this->page - $this->base);
}
}
?>
Editoval hrach (17. 1. 2011 21:47)