Visual Paginator po odeslání formuláře

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

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
+
0
-

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
+
0
-

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
+
0
-
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
+
0
-

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
+
0
-

@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
+
0
-

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.