Odeslání formuláře do jiného presenteru

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

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

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

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

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

Nejlepší řešení je vyčlenit kód do samostatné třídy, jako píše @**pilec**. Jenom bych doplnil, nezapomenout volat parent::__construct().

Jan Endel
Člen | 1016
+
0
-

pravda, raděj jsem to tam doplnil.