Zpracování formuláře v jiném presenteru

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

Zajímalo by mě, jestli někdo vyřešil problém se zpracováním formuláře v jiném presenteru.
Našel jsem, že se téma rozebíralo na tomto odkazu:
https://forum.nette.org/…in-formulare

Jde mi konkrétně o příklad B, neboli mám formulář vytvořený a zobrazený v BasePresenteru a ten chci odeslat ke zpracovani na MailPresenter.
Ukázalo se, že není problém odeslat ten požadavek ke zpracování, ale následně je problém přesměrovat se někam jinam z daného presenteru. Vlastně kamkoliv.
Odeslání formuláře ke zpracování řeším takto:

<?php
 $form->onSubmit[] = callback(new MailPresenter(), "onSubmitFormHandler");
?>

To zafunguje dobře. Problém nastane, když se dostanu do MailPresenteru a to konkretně sem:

<?php
public function onSubmitFormHandler(AppForm $form) {
        if ($form->isSubmitted() && $form->isValid()) {
            // zpracovani formulare, ktere probehne spravne

        }
	// toto uz nefunguje
        $this->redirect("Homepage:");

    }
?>

Po zpracovaní posledního řádku dojde k vyhození warningu a zamrznutí celé aplikace.
Viz: http://honzatomanek.com/…/warning.jpg

despiq
Člen | 320
+
0
-

proc to delas? a ten redirect bys mel volat na tom spravnym a ne tebou vytvoreym presenteru

Editoval despiq (10. 4. 2010 11:03)

none_
Člen | 16
+
0
-

Trochu jsi to nepochopil.

Nechci si zanášet bordel do BasePresenteru, z kterého dědí všechny ostatní Presentery. Ten formulář jsem tam dal, protože ho potřebuji na každé stránce. A zpracování chci mít na jednom, na to specializovaným, Presenteru.

Odkazoval jsem novou instancí, protože nevím, jak jinak získat instanci Presenteru, či na ní odkázat ve formuláři.

Proto píši sem, aby mi to někdo objasnil…;)

Panda
Člen | 569
+
0
-

Na začátek – podmínka if ($form->isSubmitted() && $form->isValid()) je úplně zbytečná, protože událost onSubmit se u formuláře spustí jen tehdy, pokud byl formulář odeslán a prošel validací (a pokud neprošel validací, zavolá se událost onInvalidSubmit).

K věci – Presenter je hodně zvláštní třída. K tomu, aby fungovala tak, jak si představuješ, musí být správně inicializovaná – například k vytvoření odkazu musí mít k dispozici požadavek presenteru (PresenterRequest), přehled o komponentách a jejich persistentních parametrech, signálech… Je to zkrátka složitější. Pomocí new MailPresenter() vytvoříš instanci, která „neví“ vůbec nic, proto ani nemůže přesměrovávat (k přesměrování je potřeba nejdříve vytvořit odkaz). Presenter by měl být něco jako singleton.

Pokud to mermomocí chceš oddělit, tak tu metodu udělej statickou a instanci presenteru, na kterou budeš volat redirect(), získej pomocí Environment::getApplication()->getPresenter().

//Doplnění: jen ještě dodám, že ten callback pak bude vypadat takto:

callback('MailPresenter', 'onSubmitFormHandler');

Editoval Panda (10. 4. 2010 13:41)

despiq
Člen | 320
+
0
-

tak panda dlouze napsal moji myslenku :) nicmene pokud mas definici formulare v basePresenteru tak submit funkce patri taky do basePresenteru
co je za logiku mit tovarnu na formular v jednom presenteru a jeho submit funkci kompletne v jinem?
ja jsem taky pro statickou funkci kdyz to chces mit nutne nekde jinde ale pokud to zpracovani nepouzivas i jinde tak to nema vyznam

tovarna na formular a funkce na jeho zpracovani evidentne patri k sobe

drakul
Člen | 37
+
0
-

Zdravím,
rád bych se zeptal, jak tedy řešit modelovou situaci: vložení zboží do košíku. Detail zboží s možností vložit do košíku zpracuje presenter Zbozi (actionShowDetail, renderShowDetail, createComponentKosikForm). Ale vlastní vložení zboží do košíku si myslím, že by měl obstarávat presenter Kosik (kosikFormSubmitted, renderShowItems). Příjde mi nelogické, abych v presenteru Zbozi řešil vložení „sebe“ (= produktu) do košíku. Naproti tomu vložení zboží do košíku, ošetřené v presenteru Kosik, tzn. vložení zboží do „sebe“ (= košíku) mi příjde logické. Ale třebas se mýlím :-)
Předem díky za reakce

Mikulas Dite
Člen | 756
+
0
-

Dvě slova: Komponenta košík. : )

Edit: dobře trochu to rozvedu. Komponenta košík se může používat všude (protože její handlery a formy se vyhodnocují v ní, nezávisle na presenteru) a klidně můžeš mít i presenter Košík, kde se kromě třeba počtu položek a ceny zobrazí i ty údaje okolo.

Editoval Mikulas Dite (20. 4. 2011 18:31)