Ajax a více po sobě jdoucích oprací – formulář se nezpracuje

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

Zdravím, řeším zrovna jednu ajaxovou aplikaci, která funguje následovně:

  • uživatel má nějakou tabulku s výpisem záznamů z db
  • na každém řádku je tlačítko k úpravě (ajax), standardně v presenteru mám handle metodu, která kliknutí v pořádku zpracuje
  • po kliknutí se ověřuje, jestli má uživatel k záznamu přístup, apod. a pokud se splní všechny podmínky pro úpravu záznamu, provede se něco takového:
$this->template->editForm = $this->createComponentForm($id);
$this->redrawControl('editForm');

Tzn. překreslí se snippet editForm, ve kterém se vytvoří formulář z proměnné $editForm.

  • v presenteru je pak ještě metoda processForm($form), která zpracovává formulář opatřený třídou ajax, který počítá s tím, že uživatel napíše nevalidní hodnoty, apod. (validace neprobíhá na úrovni createComponentForm, ale až na základě dalších dotazů do databáze, takže to vše řeším v processForm($form) (další snippet, ve kterém je proměnná s aktuální chybou, který se při chybě překreslí).

Vše funguje do bodu, kdy se formulář odešle. Prakticky nic se totiž nestane, jen se obnoví stránka, takže asi selže i ajax. Je možné, že je to tím, že vytvoření formuláře závisí na metodě handleX, která už se při odeslání formuláře nevolá?
Problém je hlavně v tom, že metoda processForm($form) se po odeslání formuláře vůbec nezavolá.

Nenapadá vás, kde hledat příčinu?

Editoval nettolog (25. 8. 2015 16:54)

iguana007
Člen | 970
+
+1
-

Jelikož ten ajax formulář vykresluješ znovu ajaxem, tak bych si tipoval, že se ti už na něj nenavěsí ten event listener, který by ti ten nově vykreslený form udělal opět ajaxovým … na fóru se to řešilo už xkrát, hledej ve vláknech typu „nefunguje ajax po invalidaci“ apod.

Ještě bych si ověřil v debuggeru browseru, co se ti po tom submitu vlastně volá a s jakými parametry, tam by mohl být taky zakopaný pes.

Poslední co mne napadá, aby sis ověřil, zda-li se ti zpracovává ve správném pořadí v presenteru, tj. podle životního cyklu: https://doc.nette.org/…n/presenters#…

David Matějka
Moderator | 6445
+
+1
-

Je možné, že je to tím, že vytvoření formuláře závisí na metodě handleX, která už se při odeslání formuláře nevolá?

Ano, tim to je. Pro takovehle veci nemuzes pouzivat signal, takze si bud vytvor akci nebo alespon pouzij parametr v ramci stejne akce, kterym reknes, kterou polozku chces editovat.

Druhy problem je v pouzivani komponent, nikdy nevolej createComponent* metody primo. V createComponent si zjisti to ID z parametru, kratce: