Form + AJAX – problém s onSubmit

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

Ahoj. Možná mě ukamenujete, protože už se to třebas někde řešilo. Včera jsem strávil snad 5 hodin procházením fór a zkoušení různých možností, ale ne a ne s tím hnout.

Jde o tohle:

 ...
$form->addSubmit('continue', 'Pokračovat');
        $form->onSubmit[] = array($this, 'CreateComponentCompetitionAddQuestionForm_onSubmit');
...



if($round['questionType'] == 'textAnswer')
{
     $form->addTextArea('question', 'otázka:');
     $form->addText('textAnswer', 'správná odpověď');
     $form->removeComponent($form['continue']);
     $form->addSubmit('continue', 'Odeslat');
}

Celý form je obsluhován přes AJAX. V okamžiku kdy tedy kliknu na Pokračovat a v slectboxu mám questionType == ‚textAnswer‘ viz podmínka tak se vše provede jak má. Přidá se textare, input odstraní starý button a přidá nový. Ale takto nově vytvořený form již nemůžu odeslat.

Je možné že pomocí removeComponent odstraním nějako akci onSubmit?
PS: volám vždy stejnou fci, kde jsou podmínky podle kterých se upraví form či uloží atd.

Možná je celé mé řešení špatně. Možná bych ani nepotřeboval AJAX, jenom chci nějako jednoduše bez ztráty dat upravit form a pak případně odeslat. (V určitém případě je potřeba form upravit 2* po sobě a teprve pak až odeslat).

Předem díky za jakoukoliv radu.

Mikulas Dite
Člen | 756
+
0
-

Tohle vypadá podezřele:

$form->onSubmit[] = array($this, 'CreateComponentCompetitionAddQuestionForm_onSubmit');

jednak to má být createComponent s malým c, ale hlavně je to callback onSubmit a né továrnička. To sice není ten problém, ale stejně mi to nedalo.

K věci: addSubmit a onSubmit spolu vůbec nesouvisí. První je input, druhé callback na serveru. Vymazáním tlačítka se onSubmit nevymaže. Co myslíš nedá odeslat? Ajax vrací chybu/submit nic nedělá/…? Jestli můžeš, pošli na nějaký pastebin celou (ne nutně úplně celou) továrničku – třeba se z nějakého důvodu při ajaxu nezaregistruje do stromu komponent.

Flipajs
Člen | 29
+
0
-

Kód je tady (upravil jsem to tam. Továrna to vskutku není, vlastně to může být klidně „nejakaFce“

Mikulas Dite
Člen | 756
+
0
-

Tak měl bych pár nápadů

  • registruj formulář rovnou: $form = new AppForm($this, $name); kde $name získáš jako argument protected function createComponentCompetitionAddQuestionForm($name)
  • tu metodu, která se volá po submitu vyčisti a zkontroluj, že bez změn jde formulář odesílat
  • – jestli ano (a nevidím důvod, proč by nešel), zkusil bych si pro jistou dumpnout $form->onSubmit[], jestli se někde náhodou neztrácí

A co se stane, když klikneš na ten nový submit (po ajax změně)?

Flipajs
Člen | 29
+
0
-

Z nějakého neznámho důvodu se mi neprovede toto:

$values = $form->getValues(); (když odešlu změněný form)

Tak pracuju s $_POST[‚…‘] a to se zdá že funguje. Nic moc elegantního, ale potřebuju jenom něco celkem rychle napsat a asi to nebudu moc hrotit a zůstanu u neelegantního řešení, protože s laděnkou se nějako nekamarádím a nejde mi dumpovat když používám AJAX (což je asi normální)… Přes FireBug jsem alespoň zjistil jestli mi form odesílá vše jak má – a to odesílá. Jenom při každé změně zapomene ty předešlé, takže je pak musím předávat pomocí addHidden, ale i to jsem schopen překousnout :-x (prasátko =D )

tu metodu, která se volá po submitu vyčisti a zkontroluj, že bez změn jde formulář odesílat

Toto jsem moc nepochopil…

Každopádně díky za radu