JS validace data v Nette 0.9
- HappyBear
- Člen | 10
Dobré odpoledne,
ve formuláři potřebuji ověřit, zda uživatelem zadané datum splňuje nějaké podmínky. Server-side validace podle příkladů („addRule(MyClass::MyValidator…“) už mi funguje, ale rád bych zprovoznil i javascriptovou validaci, aby se všechna pole chovala stejně. Můžete mě někdo nasměrovat správným směrem, kudy do toho? Ideálně v rámci možností původní Nette 0.9 – s novou verzí (2.0-dev released on 2011–02–06) mi nějak formulář vůbec neběhá…
Ď.
- studna
- Člen | 181
Jaký máš problém u Nette dev?
Nette si generuje svou javascriptovou validaci, ale když si tam dáš vlastní callback, tak je problém. Buď si musíš napsat pro daný control vlastní JS validaci a v továrničce ji jenom šikovně navěsit a nebo formuláře odesílat ajaxově a validovat formulář na serveru.
Editoval studna (27. 2. 2011 10:44)
- HappyBear
- Člen | 10
Jaký máš problém u Nette dev?
Můj základní problém je ten, že jsem – co se PHP a Nette týče – naprostý amatér a začátečník. :-( Problém s Nette dev už jsem ale vyřešil (názvy prvků formuláře mi začínaly číslicí, což javascriptu z v0.9 nevadilo, leč javascript z v2.0 na tomto havaroval), přesto nejsem řešení svého problému o nic blíže.
Buď si musíš napsat pro daný control vlastní JS validaci a v továrničce ji jenom šikovně navěsit
Ano, toto už jsem _teoreticky_ pochopil, ale potřeboval bych asi nějakou _praktickou_ ukázku podobného kódu, neb na teoretické rovině se nějak stále nechytám…
a nebo formuláře odesílat ajaxově a validovat formulář na serveru.
Tak do těchto výšin zatím opravdu neaspiruji… :-)
- HappyBear
- Člen | 10
Život holt není ideální… :-) Já jsem potřeboval hlavně nějak spáchat několik různých přihlašovacích formulářů, což je s Nette/Forms rozhodně snazší než bez nich…
Pokud se najde někdo, kdo má po ruce potřebný kus kód a bude se ochoten podělit, budu mu velice zauzlován, případně za odkaz na nějaký veřejně dostupný příklad, kde se toto řeší… Zde na fóru i v Nette dokumentaci už jsem pátral pár hodin, ale stále na správný postup nepřišel… :-(
- Chbox
- Člen | 125
nevím, jestli to tp pomůže ale po zadání do rozšířeného vyhledávaní „Vlastní validační pravidlo“ je jako 2. odkaz: https://forum.nette.org/…typ-pravidla
- studna
- Člen | 181
HappyBear napsal(a):
Ano, toto už jsem _teoreticky_ pochopil, ale potřeboval bych asi nějakou _praktickou_ ukázku podobného kódu, neb na teoretické rovině se nějak stále nechytám…
V javascriptu si napíšeš kousek kódu, který se aktivuje například
událostí blur na inputu s id
#validate
. To snad zvládneš. V jQuery by to vypadalo
asi takto:
<script>
$("#validate").blur(
function(){
// kod pro samotnou validaci
}
);
</script>
více máš tady: http://api.jquery.com/blur/
V továrničce na formulář pak si pomocí
getControlPrototype()
vytáhneš HTML daného controlu a nastavíš
mu atribut id.
<?php
$form['control']->getControlPrototype()->id = "#validate";
?>
více máš tady: https://doc.nette.org/cs/forms
Tak do těchto výšin zatím opravdu neaspiruji… :-)
AJAX není výšina, pořád je to PHP a javascript. :)
- HappyBear
- Člen | 10
Děkuji uctivě. :-) Zatím se kupodivu chytám, přesto mám obavu můj problém trvá. Ve formuláři nepoužívám live validaci, pole se validují „klasicky“ v okamžiku kliknutí na submit button, čili při použití výše uvedené konstrukce by se pole s vlastním validátorem stále chovalo jinak než všechna ostatní – akorát by nebylo „pozadu“ jako dosud (standardní Nette server-side validace s výpisem chyby nad formulář), ale pro změnu „napřed“… Opravdu neexistuje možnost, jak vlastní javascriptovou validaci nějak „zařadit“ mezi ostatní („Nette-generované“) validační fce, aby se volala společně s nimi a uživatel nepozoroval žádný rozdíl?
- HappyBear
- Člen | 10
Omlouvám se za odmlku a děkuji za všechny tipy. Nakonec jsem zvolil variantu brod a vykašlal se na custom validaci přímo v javascriptu, alébrž nechám normálně proběhnout server-side validaci a pouze jsem na onLoad navěsil jednoduchou fci, která chyby Nette vypsané nad formulář ještě navíc vyhodí jako alert, aby je uživatel nepřehlédl a nedivil se, proč klikl na Odeslat a nic se nestalo… Určitě to není košer postup, ale celá ta aplikace je jeden velký bastl, takže se to již ztratí…