Paginator a duplicitní url

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jiří Nápravník
Člen | 710
+
-1
-

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
+
0
-

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
+
0
-

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)

besanek
Člen | 128
+
0
-

V action by mělo stačit komponentu pouze vytvořit a obsluhovat až v render.

Myslím že to nefunguje, protože v render metodách by se už neměli posílat žádné hlavičky, takže ani redirect.