Paginator – vse jde krom prvni strany

- 14113
- Člen | 33
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
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)

- Ondřej Mirtes
- Člen | 1536
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)