Metoda onSuccess odesle formular dvakrat…
- pawouk
- Člen | 172
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?
- Filip Procházka
- Moderator | 4668
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
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
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
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
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.