Paginator bude defaultně zobrazovat poslední stránku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Bernard Williams
Člen | 207
+
0
-

Nazdárek,

už celý den se snažím upravit Paginator (VisualPaginator) tak, aby mi jako defaultní stránku zobrazoval poslední stránku.

Příklad:
Celkem mám 100 novinek po 10 novinkách na stránku. Když přijdu na stránku s novinkami, tak by mi měl můj Paginator zobrazit poslední (10. stránku) – defaultně se však zobrazuje 1. stránka.

Jak toho, prosím, docílím?

Děkuji
Bernard

pave.kucera
Člen | 122
+
0
-

Nestačilo by obrátit pořadí zobrazených novinek?

Bernard Williams
Člen | 207
+
0
-

@JannBaill bohužel nestačilo.

Majkl578
Moderator | 1364
+
0
-

Ukaž současnou implementaci paginátoru v presenteru/komponentě.

pave.kucera
Člen | 122
+
0
-

Napadá mě dát defaultní hodnotu page třeba –1 a pak v metodě loadState, popřípadě v konstruktoru (dát si pozor na volání předka a předání správných argumentů) při téhle hodnotě nastavit page na číslo poslední stránky.

Bernard Williams
Člen | 207
+
0
-

@Majkl578 Nic závratného tam nemám. Z původního Paginator jsem upravil jen metodu getOffset a přidal jednu vlastní a ve VisualPaginator upravuji jen metodu render. Ani jedna z těchto změn se ale mého problému netýká.

@JannBaill Něco podobného jsem zkoušel, ale bez úspěchu.

Nejjednodušší by bylo změnit metodu loadState z VisualPaginator a to z:

	public function loadState(array $params)
	{
parent::loadState($params);
	    $this->getPaginator()->page = $this->page;
	}

na

	public function loadState(array $params)
	{
if (empty($params['page']))
    $params['page'] = <CELKOVY_POCET_STRANEK>;
parent::loadState($params);
	    $this->getPaginator()->page = $this->page;
	}

Ale bohužel jsem nepřišel na způsob, jak této metodě předat onen <CELKOVY_POCET_STRANEK>.

pave.kucera
Člen | 122
+
0
-

Ten celkový počet stránek by jsi tam mohl načíst z databáze (nebo kde ukládáš novinky), nemusí být nutně v render fázi, ne? :)

Bernard Williams
Člen | 207
+
0
-

@JannBaill Řešení to je, ale dost neefektivní, protože bych si musel pro každé stránkování na webu napsat nový VisualPaginator (nebo spíš upravit tu jednu metodu), aby mi celkový počet zjišťovala z patřičné tabulky. Navíc by to vedlo dost k chybám, kdybych si nevzpomněl, že uvnitř zrovna této třídy přistupuji k nějaké tabulace a je nutno ji změnit..

Blizzy
Člen | 149
+
0
-

Bernard Williams napsal(a):

@JannBaill Řešení to je, ale dost neefektivní, protože bych si musel pro každé stránkování na webu napsat nový VisualPaginator (nebo spíš upravit tu jednu metodu), aby mi celkový počet zjišťovala z patřičné tabulky. Navíc by to vedlo dost k chybám, kdybych si nevzpomněl, že uvnitř zrovna této třídy přistupuji k nějaké tabulace a je nutno ji změnit..

Můžeš si tu třídu přepsat jen jednou (udělat nějaký MyPaginator), a to tak, aby se v ní dala nastavit ta hodnota, kterou potřebuješ.

Bernard Williams
Člen | 207
+
0
-

@Blizzy Svůj „MyPaginator“ taky mám a taky jsem se ji snažil upravit tak, abych ji tuto hodnotu mohl podstrčit, ale bohužel marně. Napadá tě nějaký konkrétní způsob, tak toho docílit? Dělám už na tom celý den a nic..

Blizzy
Člen | 149
+
0
-

Asi už vím, co tím myslíš… Není to tak jednoduché, ale jak už psal JannBaill, mohlo by to jít pomocí konstruktoru.

class MyPaginator extends VisualPaginator {

	public $defaultPage;

	public function __construct(IComponentContainer $parent = NULL, $name = NULL, $defaultPage = 1) {
		$this->defaultPage = $defaultPage;
		parent::__construct($parent, $name);
	}

	public function loadState(array $params) {
		$params['page'] = $this->defaultPage;
		parent::loadState($params);
		$this->getPaginator()->page = $this->page;
	}

}

Při vytváření komponenty v Presenteru předáš konstruktoru parametr z modelu (resp. přepočítaný Paginatorem), a je to.

EDIT: Protože budeš využívat asi nějaký Paginator pro spočítání poslední stránky, mohl bys to také udělat možná trochu čistěji:

class MyPaginator extends VisualPaginator {

	public function __construct(IComponentContainer $parent = NULL, $name = NULL, Paginator $paginator = NULL) {
		if (!is_null($paginator)) $this->paginator = $paginator;
		parent::__construct($parent, $name);
	}

	public function loadState(array $params) {
		$params['page'] = $this->getPaginator()->lastPage;
		parent::loadState($params);
		$this->getPaginator()->page = $this->page;
	}

}

V presenteru pak připravíš obyč. paginator, a ten pak injektneš tvému vizuálnímu paginátoru konstruktorem.

Editoval Blizzy (31. 7. 2010 1:32)

Bernard Williams
Člen | 207
+
0
-

@Blizzy Bomba! Moc děkuji, funguje to parádně. Druhou metodu se mi sice nepodařilo rozchodit, ale první funguje perfektně.

Jen doplním. Není potřeba vytvářet nový MyPaginator, ale stačí patřičné změny provést přímo ve VisualPaginator. V metodě loadState je potřeba kontrolovat nulovost $params[‚page‘], jinak bude každá stránka defaultní.

	public function loadState(array $params)
	{
if (empty($params['page']))
    $params['page'] = $this->defaultPage;
parent::loadState($params);
	    $this->getPaginator()->page = $this->page;
	}

Ještě jednou moc díky!!