Zpracování formuláře v jiném presenteru
- none_
- Člen | 16
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
- none_
- Člen | 16
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
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
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
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
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)