Visual Paginator po odeslání formuláře
- zimmi
- Člen | 94
Zdravím,
ve formuláři volím oblast, z níž chci vypsat data. Po zvolení oblasti
formulář odešlu pomocí submit tlačítka, a když je počet dat vyšší
než max. počet zobrazený na stránce, zobrazí se VP (vytvořený
továrničkou). Problém je, že po kliknutí na další stránku VP zmizí,
volám ho totiž v metodě zpracování formuláře.
Potřeboval bych ho nějak volat už v render, ale aby čekal na data z formuláře. Lze toho nějak dosáhnout?
- besir
- Člen | 170
No to skoro zní, jak kdybys spracoval form, v metodě kerá jej spracovává vytvořil vp a duplicitně získával data pro paginator… ? Nebo jak řešíš vrácení správných dat pro Presenter, resp. render metodu?
Já mám na jednom projektu řešený form (komponentu) pro vyhledávání tak, že ji směřuju na akce presenteru…
$form->setMethod('get');
// get je kvuli moznosti poslat nekomu link s vyhledaným obsahem
$form->setAction($this->getPresenter()->link('Search:search'), $name.'-submit');
- Jan Mikeš
- Člen | 771
Posli kod, kde a jak vytvaris ten VP, samozrejme ze toho docilit jde, je jen potreba ve spravny moment vytvorit komponentu. Nemusis vytvaret visualPaginator pomoci tovarnicky ale pomoci
$this['vp'] = new VisualPaginator; // priklad
A az v dobe kdy budes potrebovat (ty to potrebujes v renderu) jej naplnis spravnymi a potrebnymi daty.
- zimmi
- Člen | 94
public function searchFormSent(Form $form)
{
$values = $form->getHttpData();
unset($values["send"]);
if ($values["kraje"] === "0" && $values["orp"] === "0" && $values["obce"] === "0") {
$this->flashMessage('Hledání nelze provést.', 'warning');
$this->redirect('Search:default');
die();
}
$condition = array();
$kraj_uid = (int)$values["kraje"];
$orp_uid = (int)$values["orp"];
$obec_uid = (int)$values["obce"];
$delka = (int)$values["delka"];
if ((bool)$kraj_uid) {
$condition["kraje"] = $kraj_uid;
}
if ((bool)$orp_uid) {
$condition["orp"] = $orp_uid;
}
if ((bool)$obec_uid) {
$condition["obce"] = $obec_uid;
}
$condition["delka"] = $delka;
$vp = $this->getComponent("visualPaginator");
$itemsPerPage = $vp->getPaginator()->itemsPerPage;
$offset = $vp->getPaginator()->offset;
$this->template->rivers = $this->search->filterRivers($condition, $itemsPerPage, $offset);
$vp->getPaginator()->itemCount = $this->search->filterRivers($condition)->rowCount();
}
Metoda pro zpracování formuláře, která volá model a do šablony pak předá výsledek z db.
- Jan Mikeš
- Člen | 771
Mas to pravdepodobne spatne namyslene, protoze fce
searchFormSent
se ti vola pouze po odeslani formulare, navrhuji ti
tedy v te funkci redirectovat na nejakou jinou stranku, kde pomoci get
parametru si predas udaje ktere potrebujes v tvem pripade to vypada na
$condition
.
Timhle zpusobem ti to totiz nebude fungovat nikdy.
Pripadne si muzes vysledky ukladat do sessions a nasledne pracovat s nimi, ale kazdopadne obsluhu paginatoru vysunout uplne mimo tuto funkci.
Editoval Lexi (8. 1. 2013 22:51)
- zimmi
- Člen | 94
@Lexi mohl bys to prosím trochu rozvést? Teď je jasné, že Paginator funguje jen po odeslání formuláře, protože se volá právě až v té funkci pro zpracování. Když ho budu chtít volat v render funkci, jak do něj dostanu výsledek dotazu na DB? Napadlo mě například searchFormSent redirectovat na renderDefault($foo), kde $foo by byl výsledek toho dotazu, ale jestli jsem to správně pochopil, renderům lze předávat jen skalární proměnné.
- duke
- Člen | 650
Co potřebuješ, je řešit VisualPaginator jako persistentní komponentu. Při zpracování formuláře pak tuto komponentu nastavit a provést přesměrování (ostatně jako bys měl po každém úspěšném odeslání formuláře – snad s výjimkou GET fomulářů, ale ty zde nejspíš nemáš důvod používat). Řešit přístup k modelu a filtrování přímo v handle metodě formuláře je vzhledem k požadovanému persistentnímu chování špatný nápad. To řeš v rámci action či render metod presenteru či render metod komponent.
A k vytváření té komponenty vždy používej tovární metodu
createComponentVisualPaginator
a přistupuj k ní
z presenteru přes:
$vp = $this['visualPaginator'];
nebo alternativně (jde jen o jiný zápis téhož):
$vp = $this->getComponent('visualPaginator');
Jinak ti ta persistentnost nebude fungovat.