Metoda onSuccess odesle formular dvakrat…

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

Dříve jsem vytvářel formuláře tak že jsem si na konec konstruktoru formuláře napsal toto:

$this->onSuccess[] = callback($this, 'onSubmit');

A vše fungovalo ok, dnes jsem si na chvili vypnul presmerovani na konci zpracovani formulare, abych si mohl dumpovat data a zjistil jsem, ze se mi formular odesila dvakrat. Proč? Protože v soboru Form na radku 429 je toto:

if ($this->onSuccess) { // back compatibility
	$this->onSubmit($this);

Jenže jak tohle jednoduše vyřešit? Když to udělám po staru bude se odesílat dvakrát, když řádek s odesíláním smažu ( $this->onSuccess[] = callback($this, ‚onSubmit‘); ) tak se to zase neodešle vůbec. Řešením je tedy dát do callbeku nesmyslnou funkci, aby se podmínka ve Form.php ř.429 splnila a me se odeslal formulář. Tedy například:

$this->onSuccess[] = function (){ };

V takovém případe projde vše jak má. Je sice pravda že bychom po zpracování formuláře měli vždy přesměrovat, čímž se dvakrát neodešle, ale i tak mi to přijde jako chyba. Co si o tom myslite?

22
Člen | 1478
+
0
-

to je nějaká kravina, mně se nic 2× neodesílá..
je jasné, že když máš v callbacku redirect, tak se provedou 2 požadavky, v jednom zpracování formu a ve druhém ten redirect.

joe
Člen | 313
+
0
-

Možná to bude tak jak píšeš, ale když tam to přesměrování zase dáš, tak se to provede jen jednou, protože v tom prvním volání callbacku dojde k přesměrování.

Filip Procházka
Moderator | 4668
+
0
-

Je nám líto, chyba je na vašem přijímači. Pořádně si to zkontroluj co se ti kde jak plní a volá.

pawouk
Člen | 172
+
0
-

joe napsal(a):

Možná to bude tak jak píšeš, ale když tam to přesměrování zase dáš, tak se to provede jen jednou, protože v tom prvním volání callbacku dojde k přesměrování.

To sice ano, ale to neznamená že je to vpořádku.

pawouk
Člen | 172
+
0
-

Tak teď jsem si stáhnul uplně nové nette a udělal v něm jeden jednocuchý formulář a dělá mí to zase, tak jestli mi to někdo objasní tak budu rád. Zde ke stažení.

22
Člen | 1478
+
0
-
class TestForm extends \Nette\Application\UI\Form
{
    public function __construct()
    {
	parent::__construct();
	$this->addText('textinmput', 'Text Input');
	$this->addSubmit('send', 'ok');
	$this->onSuccess[] = callback($this, 'onSubmit1');
    }

    public function onSubmit1()
    {
	dump('method onSubmit called');
    }
}

jako v callbacku znova voláš onSubmit, což je to samé, jako onSuccess a proč myslíš, že se ti to provede 2x? :-) stačí přejmenovat metodu na onSubmit1 a volá se to jen 1×.
Jsem zvědav, jaké další hlašení chyby bude tvoje třetí :-)

Editoval 22 (27. 6. 2011 18:15)

pawouk
Člen | 172
+
0
-

Ano, já vím, ale to právě způsobuje ten řádek:

if ($this->onSuccess) { // back compatibility
        $this->onSubmit($this);

Který ještě v nette alpha nebyl. Takže ačkoliv to ještě před měsícem fungovalo vpohodě, tak stejný kód po upgradu na nette beta odesílá formulář dvakrát (samozřejmě pouze v případě, že tam není redirect). A to my prostě přijde, že není v pořadku. Ale máte pravdu, stačí v celé aplikaci přejmenovat všechny metody ve všech formulářích na onSubmit1… :-D

Jan Tvrdík
Nette guru | 2595
+
0
-

Obecně platí, že v potomcích Nette\Forms\Form nesmíš (od jakživa) mít metodu pojmenovanou onSubmit, protože tím naprosto rozbíjíš fungování události onSubmit. V minulosti jsi to prostě měl špatně navržené a teď se to projevilo.