Paginator a duplicitní url
- Jiří Nápravník
- Člen | 710
Hlídá nějak Paginator v Nette duplicity u první a poslední stránky? Když jsem zkoušel example Micro-blogu a dam examples.nette.org/micro-blog/page-1 , tak mě to správně přesměruje bez toho zbytečného page-1. Bohužel když dám pak třeba page-200 – tak mi to tedy nehodí na poslední stránku, či ještě lépe 404.
Nicméně hlavní otázka směruje, je to nějak podporováno automaticky? Protože pokud použiju já tento kód:
$vp = new VisualPaginator($this, 'paginator');
$paginator = $vp->getPaginator();
$paginator->setItemsPerPage(20);
$paginator->setItemCount(100);
a dám: …/?paginator-page=1 – tak mi zůstane v url a nijak mě nepřesměruje.
- duke
- Člen | 650
Aby to fungovalo, musíš zajistit aby si komponentu VisualPaginator dokázal presenter v případě potřeby sám vytvořit (tzn. musíš poskytnout tovární metodu createComponentXyz). Nicméně podpora pro kanonikalizaci pro persistentní komponenty není zcela bezproblémová (viz tato issue).
Edit: Teď jsem si uvědomil, že tvůj příklad se týká Micro-frameworku. Takže tam to budeš muset řešit nejspíš ještě jinak.
Editoval duke (17. 7. 2013 2:55)
- Jiří Nápravník
- Člen | 710
díky za radu, týkalo se to „full-frameworku“, ten micro-framework jsem ukazoval, že tam to dobře funguje.
Nicméně problém jsem už zjistil v čem byl. Já to měl v renderDefault, a musí to být v actionDefault, pak se to přesměruje v pořádku. Týká se to pouze toho page=1, když dám page nějakou vysokou, tak tam to bohužel podporované není.
Edit:
Nicméně když to musí být v action. Tak to zase není moc pěkné, protože
tam posílám i data do view, a tak logičtěji by to mělo být spíše
v render. či-li jak by to mělo správně být? Odeslat tu kolekci games, bych
měl správně asi v render, ale ten paginator musí být v action.
public function actionDefault()
{
$perPage = 10;
$vp = $this->getComponent('paginator');
$paginator = $vp->getPaginator();
$page = $paginator->getPage();
$games = $this->gameFacade->getGamesPaginatorForAdmin($page, $perPage);
$paginator->setItemsPerPage($perPage);
$paginator->setItemCount(count($games));
$this->template->games = $games;
}
public function createComponentPaginator()
{
$vp = new VisualPaginator($this, 'paginator');
return $vp;
}
Editoval Jiří Nápravník (17. 7. 2013 12:14)