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 Control
u (či samozřejmě
Presenteru
u, 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ě Presenter
y měly
metody prepare*()
. V té době jsi musel mít pro každou
komponentu private property Presenter
u, 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)