Ajaxové vypisování errorů po odeslání formuláře

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

Dobrý den,
mám presenter, na kterém ajaxově načítám formulář a snažím se rozjet errorové hlášky. Kromě errorů formulář jinak funguje dobře. Chtěl bych, aby se mi po odeslání formuláře vypsala errorová hláška, ale místo toho se obnoví celá stránka, nezobrazí se error a už ani nejde vidět ten původní formulář, protože ho předtím načítám ajaxem. Každopádně funkce validateOnlineForm se zavolá, protože to vydumpuje chybovou hlášku.

Jde nějak udělat, aby se po odeslání formuláře neobnovovala stránka a zároveň, aby se error přidal do formu a vykreslil přes ajax?

Prosím poraďte.

public function createComponentOnlineForm()
{
	...
	$form->onValidate[] = array($this, 'validateOnlineForm');
}

public function validateOnlineForm($form)
{
	$form->addError('chybova hlaska');
	$this->invalidateControl('batchSnippet');
	Debugger::barDump($form->errors[0]);
}
{snippet batchSnippet}
...
<form n:name=onlineForm class=form>
	...
	<ul class="errors" n:if="$form->hasErrors()">
    	<li n:foreach="$form->errors as $error">{$error}</li>
	</ul>
</form>
{/snippet}

S úctou,
Lukáš

Editoval crassus (8. 3. 2015 0:24)

ODIS
Člen | 33
+
0
-

Jsi si jistý, že se ten formulář odesílá AJAXově? Pokud používáš nette ajax, tak by formulář měl mít classu „ajax“.

crassus
Backer | 78
+
0
-

Jo používám nette ajax. Takže classu „ajax“ jsem už přidal, ale pořád to nefunguje… Jak mám docílit, aby se mi ten formulář odesílal ajaxově prosím?

Editoval crassus (7. 3. 2015 20:49)

ODIS
Člen | 33
+
0
-

A máš ho inicializován?

$.nette.init();

Zkoušel jsi, jestli funguje např. na normálních odkazech?

crassus
Backer | 78
+
0
-

Jo ajax funguje. Já ten samotný formulář loaduju ajaxem.

ODIS
Člen | 33
+
0
-

Jestli ho loaduješ až po té inicializaci, tak to bude možná důvod, proč ti to nejede. Ta inicializace dělá zjednodušeně řečeno to, že vezme prvky s classou „ajax“ a naváže na ně event, který zajišťuje ajaxovou komunikaci. Takže zkus například po načtení toho formuláře znovu zavolat $.nette.init().

crassus
Backer | 78
+
0
-

A nevíš prosím, jak bych to mohl udělat?

Editoval crassus (7. 3. 2015 21:38)

ODIS
Člen | 33
+
0
-

Pomohlo by, kdybys tady dal více kódu, který je relevantní k tvému problému. Dej si načítání JS, ve kterém voláš nette.init() do snippetu a po překleslení snippetu, ve kterém se objeví formulář, překresli snippet, ve kterém bude zmíněný skript – tím se ti znovu inicializuje nette ajax a mohlo by to jet. Další možností je dát si do templatu, ve kterém je form kousek JS kódu, ve kterém provedeš nette.init(). Pokud ti to stále nebude šlapat, hoď tady více kódu, který se týká práce s tím formulářem.

crassus
Backer | 78
+
0
-

Console: Uncaught Cannot initialize nette-ajax twice. Nezdá se mi to jako správné řešení… Nevím jaký kód přesně by se mohl hodit. Ten formulář je hodně velký má asi 25 řádků :( Má hodně inputů, podmínek…

Editoval crassus (7. 3. 2015 23:21)

crassus
Backer | 78
+
0
-

Díky za rady, už to mám. Stačilo ten formulář obalit ještě jedním vnitřním snippetem, a invalidovat pouze tento snippet…

Editoval crassus (8. 3. 2015 0:25)