Paginator – vse jde krom prvni strany

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

Ahoj, nemuzu prijit na to, proc mi paginator normalne funguje az na zobrazeni prvni strany. Kdyz v url nastavim rucne &page=1 tak to jde ale kdyz kliknu na jednicku tak se persistentne nezobrazuje page vubec.

tady je jak tvorim komponentu

<?php
$vp = new VisualPaginator($this, "dg");
        $p = $vp->GetPaginator();
        $p->itemsPerPage = 1;
        $p->setBase(1);
        $p->itemCount = $dataSource->count();
        $this->template->articles  = $dataSource->
            applyLimit($vp->paginator->itemsPerPage, $vp->paginator->offset)->fetchAll();

        return $p;
?>

a v template se snazim vypsat hodnotu takto: <? print_r($articles); ?>
bohuzel mi to hlasi chybu: Notice: Undefined variable: articles in D:\programs\VertrigoServ\www\chic\app\temp\c-Nette.Template\_129884f600dfa03f1e659135783f9642.default.phtml.php on line 50

jestli nekdo vi jak na to tak prosim o radu. Predem dik :)

Ondřej Mirtes
Člen | 1536
+
0
-

Vytvoření paginatoru dej do továrničky:

protected function createComponentPage() {
	return new VisualPaginator;
}

A takto musí vypadat render* metoda:

public function renderDefault() {
	$dataSource = ??; //dosaď volání metody modelu

	$paginator = $this['page']->paginator;
	$paginator->itemsPerPage = 1;
	$paginator->itemCount = count($dataSource);

	$dataSource->applyLimit($paginator->length, $paginator->offset);

	$this->template->articles = $dataSource; //nemusí být ->fetchAll(), pokud to pak házíš do foreache, DibiDataSource si provede fetchnutí položek sám
}

Editoval LastHunter (4. 11. 2009 18:37)

14113
Člen | 33
+
0
-

Mel jsi pravdu. Dekuji za radu!! :)

iguana007
Člen | 970
+
0
-

LastHunter napsal(a):

Vytvoření paginatoru dej do továrničky:

Chtěl bych se zeptat, čemu říkáte tovarníčka? V dokumentaci jsem nic takového nenašel …
Jsem v Nette nový…

Díky za info
igi

Ondřej Mirtes
Člen | 1536
+
0
-

Továrnička je metoda Controlu (či samozřejmě Presenteruu, který od Control dědí) která ti líným způsobem (až když je třeba) vytvoří instanci objektu, nejčastěji formuláře (AppForm) nebo komponenty (potomek Control). Vypadá takto:

protected function createComponentSomeComponent() {
	$someComponent = new SomeComponent;

	//libovolná nastavení
	$someComponent->set...
	$someComponent->set...
	$someComponent->set...

	return $someComponent;
}

A komponentu získáš přes $this->getComponent('someComponent'), případně zkratku $this['someComponent']. Dokonce ji nemusíš ani přiřazovat pomocí proměnné do šablony, stačí v ní zavolat {control someComponent} a ona se vykreslí.

Nemusíš se starat o to, že přistupuješ ke komponentě, která ještě nebyla vytvořena či na ni nebyla aplikována potřebná nastavení, při prvním zavolání $this->getComponent('someComponent') se provede vše, co v továrničce napíšeš a při dalších zavoláních se ti vrátí už existující objekt ve stavu, jak jsi s ním do té doby manipuloval. O továrničkách se píše v manuálu.


Vznikly z historických důvodů, kdy ještě Presentery měly metody prepare*(). V té době jsi musel mít pro každou komponentu private property Presenteru, pro každou komponentu jsi musel v těchto prepare*() metodách psát jejich založení a v render*() metodách je přiřazovat do šablony, abys je mohl vykreslit. Bylo to neelegantní a bylo s tím příliš psaní.

Navíc lidi dělali např. to, že formulář zakládali až v render*() metodě, což bylo špatně a navíc pozdě, protože renderování předchází zpracování signálů a pokud člověk odeslal formulář, tak Presenter zařval, že komponentu s tímto názvem nezná – protože zkrátka v té době ještě neexistovala. Nyní si zavolá její továrničku a člověk-vývojář se o to vůbec nemusí starat :)

Editoval LastHunter (4. 11. 2009 19:58)

iguana007
Člen | 970
+
0
-

Hezky vysvětleno, díky :)