Odeslání formuláře do jiného presenteru
- futuretux
- Člen | 24
Zdravím,
mám v podstatě stejný problém jako se řešil Zde,
ale toto řešení nepadá v úvahu.
Mám komponentu (login form), která je v base presenteru. Původně byla na
jedné stránce při vývoji, ale na ostrý web by měla být přístupná
odevšad. Odesílala se callbackem
$form->onSuccess[] = callback($this, 'signInFormSubmitted');
.
Tato metoda je v UserPresenter. Formulář může být přirozeně odeslaný
odkudkoliv.
Ad řešení ve vlákně: Je přece pitomost prohánět uživatelovo heslo GETem, že?
Pokud jde čistě o callback, tak by fungovalo
'UserPresenter::signInFormSubmitted'
, ale na metoda staticky proste
udělat nejde. Tedy je mi jasné, že pokud jde o metodu callback, tak toho moc
nezmůžu, ale jak tohle vyřešit?
- Jan Endel
- Člen | 1016
Ne skutečně heslo uživatele do GET požadavku nepatří.
Řešení jsou v podstatě dvě, buď přesunout továrničku formuláře i s obslužnou metodou do BasePresnteru ze kterého budou všechny ostatní presentery kde chceš mít login form dědit nějak takto:
use Nette\Application\UI\Form;
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
protected function createSignInForm()
{
$form = new Form;
//nadefinovani polozek formulare
$form->onSuccess[] = callback($this, 'signInFormSubmitted');
}
protected function signInFormSubmitted(Form $form)
{
//obsluha odeslaneho formulare
}
}
nebo vyčlenit formulář do samostatné komponenty, nějak takto:
class SignInForm extends Nette\Application\UI\Form
{
public function __construct()
{
parent::__construct();
//nadefinovani polozek formulare
$this->onSuccess[] = callback($this, 'signInFormSubmitted');
}
public signInFormSubmitted(SignInForm $form)
{
//obsluha odeslaneho formulare
}
}
a použití v presenteru takto:
protected function createSignInForm()
{
$form = new SignInForm();
}
Editoval pilec (25. 9. 2011 21:24)
- petr.pavel
- Člen | 535
Protože se tohle téma objevuje ve fóru často, pokusil jsem se řešení doplnit do dokumentace. Teď už to tam není, takže musíš zase hledat ve fóru.
Hodně se to probírá tady, pár z těch „nečistých“ řešení jsem publikoval na svém blogu (a další).
- futuretux
- Člen | 24
No, tak já ještě narazil na tuhle stránku – také se tu tohle řeší.
Velmi mě zaujalo řešení pomocí setAction (první příspěvek úplně dole), ale nějak to zlobí (tedy kód jsem potřebně opravil, ale formulář se nepřijímá úplně správně).
Každopádně problém opravdu vyřeším vyhodnocením v BasePresenteru.
Příspěvek považujte za uzavřený. Děkuji za radu. Já si trochu popletl pár věcí ohledně autorizace, takže ten důvod proč jsem nechtěl toto řešení použít odpadá. Tím pádem je tento topic zbytečný. Ještě jednou děkuji a omlouvám se za plýtvání vaším časem kvůli me hlouposti.
- Filip Procházka
- Moderator | 4668
Nejlepší řešení je vyčlenit kód do samostatné třídy, jako píše
@**pilec**. Jenom bych doplnil, nezapomenout volat
parent::__construct()
.