Validuje při odeslání buttonem s setValidationScope(false)

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

V Nette ani JS nejsem žádný profík, ale možná jsem narazil na bug v netteForms.js.

Mám

// ...
$form->addSubmit('cancle', 'Zpět na přehled')->setValidationScope(false);
// ...

to vygeneruje

<input type="submit" formnovalidate class="button" name="cancle" id="frmformEdit-cancle" value="Zpět na přehled">

Nette vygeneruje správně HTML submit tlačítka, které má nastaveno ->setValidationScope(false), s atributem formnovalidate, což zřejmě (jak jsem pochopil) dle kódu v netteForms.js – funkce nette.validateForm (lajna 81 ±) – by mělo přeskočit validaci (resp. vrátit true, jakože prošla v pohodě), avšak selže to na podmínce

if (form['nette-submittedBy'] && form.elements[form['nette-submittedBy']] && form.elements[form['nette-submittedBy']].getAttribute('formnovalidate')) {
		return true;
	}

jelikož form.elements[form['nette-submittedBy']].getAttribute('formnovalidate') je prazdny string, vraci false. Jednoduse to resi test hasAttribute misto getAttribute, avsak (alespon dle netbeansu) to neumi IE 6 a 7. Nebo generovat nejakou neprazdnou hodnotu toho atributu formnovalidate.

Testováno na FF 3.6.10, PHP 5.2.11, Nette Framework 2.0-dev (revision ecc11df released on 2010–09–30), nonprefix

David Grudl
Nette Core | 8218
+
0
-

fixed

Bertram
Člen | 75
+
0
-

Ahoj,

stáhl jsem si Nette Framework 2.0-dev (revision bb2b723 released on 2011–02–06)
a po použítí

public function createComponentPTPForm ($name)
          {
            $form = new AppForm ($this,$name);

            ...

	    $form->addSubmit('cancel', 'Cancel')
                 ->setValidationScope(FALSE)
               ->onClick[] = array($this, 'cancelClicked');

            return $form;

je po stisknutí tlačítka Cancel validace stále funkční.

Poradíte někdo prosím?

kapcus
Člen | 3
+
0
-
->setValidationScope(FALSE)

stale nefunguje v posledni aktualni verzi.

V netteForms.js je jakesi form[‚nette-submittedBy‘], ktere se nenastavi, proto se validace neustale provadi. Pouzivam standardni formulare s ajaxem. Nejake reseni ?

David Grudl
Nette Core | 8218
+
0
-

Zjistit, proč se nenastaví (jaký máš prohlížeč?).

Matúš Matula
Člen | 257
+
0
-

Rovnaky problem u mna, pouzivam 1.0-dev 3fe360f released on 2010-08-25.
Vo funkcii Nette.initForm v netteForms.js sa na submit tlacitku nespusti onclick event a preto sa nenastavi ani form['nette-submittedBy']. Testovane v Chrome 10 a Firefox 4.
(Vo vseobecnosti ked kliknem na submit tak sa onclick event na formulari nespusti)
Skusal som googlit, ale nic relevantne som nenasiel, any ideas?

22
Člen | 1478
+
0
-

mi to akorát na poslední verzi vypne JS validaci, ale server validujé dál.

Editoval 22 (3. 6. 2011 19:09)

dasim
Člen | 9
+
0
-

22 napsal(a):

mi to akorát na poslední verzi vypne JS validaci, ale server validujé dál.

Je to tak stále, v té současné verzi „Nette Framework 2.0-beta ze dne 28. 05. 2011“, která je ke stažení na tomto webu. Ví se, kde je ta chyba? Případně jak ji opravit/obejít?

22
Člen | 1478
+
0
-

pořád je to nefunkční i v poslední verzi, viz. examples/CD-collection z ditribuce

David Grudl
Nette Core | 8218
+
0
-

fixed

duke
Člen | 650
+
0
-

Právě se mi stal tentýž problém, jak píše Kapcus: form[‚nette-submittedBy‘] se nenastavil a cancel tlačítko, s vypnutou validací si vesele validovalo dál.
Nakonec to bylo tím, že formulář byl vykreslován ručně (přes form makro) a v šabloně byl přebytečný uzavírající tag </fieldset>. Byl celkem oříšek to najít, takže pokud se někomu stane tento problém, počítejte s tím, že příčinou může být také chyba v html.

uestla
Backer | 799
+
0
-

Zdravím!

Narazil jsem na zajímavý problém, na stránce používám pro klientovou validaci právě skript netteForms.js. V něm se na formuláře navěšují 2 eventy, a sice submit a click.

A teď nastává ten průšvih: Vypadá to, že se event „submit“ volá dříve než event „click“ (testováno v Google Chrome)!

Jaké jsou následky?

Kliknu-li na nevalidační tlačítko (ověřeno, že skutečně má atribut „formnovalidate“), spustí se event „submit“, jenže v tu chvíli se spouští i validace – neboť tlačítko, kterým byl formulář odeslán a podle čehož se tedy v submit eventu určuje, zda se má validovat, se nastavuje až v eventu click.

Jak sto hoven?

EDIT:

Přidám ještě jeden poznatek, a sice že o správnosti svého tvrzení jsem se přesvědčil také tak, že po opětovném kliknutí na ono nevalidační tlačítko se již validace neprovede, neboť to už má formulář správně nastaveno odesílací tlačítko (právě z oné předešlé neúspěšné interakce). Je třeba ovšem kliknout dvakrát po sobě, nikoli jednou, pak jinam do formuláře a podruhé, jinak se nastavení tlačítka ztratí.


<OT> K čemu je property noValidate</OT>

Editoval uestla (26. 8. 2011 3:11)

22
Člen | 1478
+
0
-

není to náhoudou ajaxSubmit? novalidate je HTML5 validace OFF

uestla
Backer | 799
+
0
-

V jakém smyslu onen „ajaxSubmit“? Jestli ho používám? Ano, používám, ale o tom ten problém není. Při prvním kliknutí se JS validace provede, při druhém dojde k AJAXovému odeslání se správnou detekcí odesílacího tlačítka.

Čili problém skutečně je v pořadí volaných eventů. Bohužel jsem nepřišel na to, jakým způsobem se to dá změnit :-(

22
Člen | 1478
+
0
-

a nedá se teda dát ten submit až do toho click eventu??

uestla
Backer | 799
+
0
-

No jo, to samozřejmě jde, jenže pak se zase nevaliduje javascriptem při odeslání formuláře enterem (právě kvůli absenci „submit“ eventu…). Je to začarovaná kružnice :-(

22
Člen | 1478
+
0
-

nejsem si jistej, jestli teda chápu správně problém, nemáš někde kus kódu na ukázku?

uestla
Backer | 799
+
0
-

Omlouvám se, zkusil jsem osekat na nutné minimum, a ukázalo se, že problém je v mém navěšování vlastního click submitu na všechny submit buttony.

Omlouvám se za umělou globalizaci problému.

Nicméně budu muset problém vyřešit po svém, a sice přepsat navěšování ajaxSubmitu (zde jsem narazil na pár odkazů, tak to zkusím pofackovat…).

22
Člen | 1478
+
0
-

proto jsem se ptal na ten ajaxSubmit(), říkal jsem si, že je divné, že jsi na to nenarazil…
Problém je, že klasický ajaxSubmit nepodporuje callback, ale dá se to obejít ted nevím od které verze jQuery přes:

$('form').ajaxSubmit().success(function(){
	//callbacks
	...
});
uestla
Backer | 799
+
0
-

Počkej, teď mluvíš o kterém ajaxSubmit()? Já osobně o tom Honzově

Hlavní problémek, který jaksi zůstává, je detekce tlačítka při Enterovi :-(

22
Člen | 1478
+
0
-

jo, ten mám na mysli, pokud tam vrazím nějakou funkci, tak mi to vytuhne, nějak jsem to nezkoumal, možná nějaká blbost u mě, ale mohla by tě zajímat ta diskuse pod tím doplňkem asi..

Editoval 22 (26. 8. 2011 21:41)

uestla
Backer | 799
+
0
-

Netuším, nakonec jsem ale (huff) dospěl ke zdárnému konci.

Díky slepení HosipLanových pastebin skriptů a drobných zásahů do nich.

zelenomodrypes
Člen | 11
+
0
-

Pracuji s verzí 2.0-dev d5b50dc released on 2011-06-03 a mám podobný problém:

$form->addSubmit('cancel', 'Zpět')
			->setValidationScope(false);
$form->onSuccess[] = callback($this, 'onSuccessForm');

Po kliknutí na tlačítko Zpět je JS validace sice vynechána, ale v PHP již proběhne a dojde ke znovu zobrazení formuláře s chybovými hláškami.

Můžete někdo potvrdit, že tento problém nemám jenom já, tj. že jsem něco nepřehlédnul? Případně jak toto řešit?

22
Člen | 1478
+
0
-

Mám pocit, že tohle už bylo vyřešené.. stáhni si novější Nette.