Validace formu – input po inputu
- miira
- Člen | 13
Zdravím,
chtěl bych vytvořit něco jako je k vidění zde – http://www.rememberthemilk.com/signup/ – tedy formulář,
kde se jednotlivé inputy validují už při přecházení mezi nimi a výsledek
jejich validace se vypisuje vedle nich.
Bohužel příliš nevím kudy do toho, podle nahlédnutí do zdrojáků to
vypadá, že bude potřeba přepsat celý InstantClientScript.
Neřešili jste už někdo něco podobného? Nemáte nějaké rady odkud začít?
Díky
- Patrik Votoček
- Člen | 2221
Pokud to někdo řešil tak by se mě to taky hodilo… Asi se vazne bude
muset prepsat InstantClientScript
… :-( „Zakladní validace“
by nebyla takovej problém horší to bude třeba při ověřovaní existence
uživatelského jména tam už to je o něčem víc než jenom
InstantClientScript
…
- _Martin_
- Generous Backer | 679
vrtak-cz napsal(a):
„Zakladní validace“ by nebyla takovej problém…
Asi by stačilo, kdyby se dalo nastavit, zda má být vyvolán
window.alert()
a nebo se chybová hláška má předat nějakému
callbacku.
…horší to bude třeba při ověřovaní existence uživatelského jména tam už to je o něčem víc než jenom
InstantClientScript
…
Právě, tohle jsou věci, které standardně řeší až vlastní
validátor. Což mě přivádí na myšlenku, že by se Nettí
InstantClientsScript
mohl naučit vlastní validátory kontrolovat
pomocí AJAXu.
- Patrik Votoček
- Člen | 2221
_Martin_ napsal(a):
…horší to bude třeba při ověřovaní existence uživatelského jména tam už to je o něčem víc než jenom
InstantClientScript
…Právě, tohle jsou věci, které standardně řeší až vlastní validátor. Což mě přivádí na myšlenku, že by se Nettí
InstantClientsScript
mohl naučit vlastní validátory kontrolovat pomocí AJAXu.
To vůbec není špatná myšlenka… Do Feature Requests s tím…
- _Martin_
- Generous Backer | 679
arron napsal(a):
Nicmene me zatim moc nenapadla metoda, pomoci ktere by se dalo validovat na strane serveru bez toho, aby clovek psal prilis mnoho kodu:-)
Mno, když myslím, že to by si formulář mohl řešit sám – za předpokladu, že bude definován ve správné metodě, mohl by při svém vytvoření automaticky detekovat AJAXový požadavek, obsloužit jej a ukončit životní cyklus presenteru…?
- o5
- Člen | 416
No neprijde mi to tedy nejak slozite, respektive validace na strane serveru je na vyse uvedenem prikladu jen u policka prihlasovaci jmeno (ta technika toho ajaxu bude na stejnem principu jako naseptavac co je delany na zdrojaku). Zbytek jsou stejne validacni pravidla jako mame v nette, s tim, ze proste misto do alertu jsou vyhodnocovany pekne ve strance. Takze tedy by „stacilo jen“ prepsat do jQuery a bylo by. Hadam ze takovej Honza Marek uz neco podobneho ma :-D
Kazdopadne je to jedna z mnoha veci, kterou chci udelat. Ale mnoho veci ma nyni vyssi prioritu :-)
edit: aha, takze tohle uz napsal martin :D
Editoval o5 (20. 5. 2009 16:20)
- Honza Marek
- Člen | 1664
Hadam ze takovej Honza Marek uz neco podobneho ma :-D
Kdepak, taky jsem ztroskotal na tom InstantClientScriptu. Hrozně jsem to hackoval a nakonec jsem skončil s tim, že místo alertu to dokázalo vypsat červenou hlášku vedle. Ale vždycky jenom jednu a jen při odeslání formuláře, takže to bylo vpodstatě k ničemu.
- miira
- Člen | 13
Honza M. napsal(a):
Kdepak, taky jsem ztroskotal na tom InstantClientScriptu. Hrozně jsem to hackoval a nakonec jsem skončil s tim, že místo alertu to dokázalo vypsat červenou hlášku vedle. Ale vždycky jenom jednu a jen při odeslání formuláře, takže to bylo vpodstatě k ničemu.
Během dnešních pokusů jsem došel k něčemu podobnému, což je bohužel v praxi víceméně nepoužitelné. Jako nejjednodušší ale také nejméně sytémové řešení se mi tedy prozatím jeví JS validaci v Nette vypnout a validovat si to v nějakým vlastním scpriptem. To ale znamená každý input popisovat dvakrát (jednou v Nette a jednou ve scriptu pro JS validaci), což je taky celkem k prdu.
- Roman Ožana
- Člen | 52
miira napsal(a):
Zdravím,
chtěl bych vytvořit něco jako je k vidění zde – http://www.rememberthemilk.com/signup/ – tedy formulář, kde se jednotlivé inputy validují už při přecházení mezi nimi a výsledek jejich validace se vypisuje vedle nich.
Bohužel příliš nevím kudy do toho, podle nahlédnutí do zdrojáků to vypadá, že bude potřeba přepsat celý InstantClientScript.Neřešili jste už někdo něco podobného? Nemáte nějaké rady odkud začít?
Díky
Tuším, že používají tento skript – velice chytré rozšíření jQuery http://jquery.bassistance.de/validate/
- _Martin_
- Generous Backer | 679
o5 napsal(a):
Tusis blbe, to tam neni.
Což tak nevadí, neboť jak toho stejného dosáhnout je tam názorně ukázáno – a o to přeci šlo.
- redhead
- Člen | 1313
Zdravím,
nevím jestli se toto téma vyřešilo, nicméně
také jsem chtěl pro svůj formulář udělat tuhle featururu, tak se se
rozhodl, přepsat InstantClientScript.
Vznikl LiveClientScript, který je až na některé dopsané drobnosti totožný
s Instantem.
Funguje na principu, že každá control má onchange funkci validateFormNameControl(control), a v ní přes switch porovnávám id controlu a poté jeho validaci. Při submitování se ještě provede celková validace.
Zobrazení chyby je děláno přidáním class ‚form_error‘ controlu, a při odstranění chyby je class odebrán. K tomu bylo potřeba přidat trojici JS funkcí pro hledání, přidávání a odebíraní classy. V tuto chvíli by asi nešlo mít 2 a více formů na stránce, bo ty funkce by měli stejné jméno (JS by asi řval; bude se řešit, neví někdo jak zjistit že na stránce se už nějaký form vypisoval??).
Zobrazení chyby se dá upravit přes proměnné doAlert a doRemove.
Tady je prozatím Demo
Zatím zkoušejte, je tam pár nesložitých podmínek.
Na kódu ještě zapracuju a pak pošlu.
Návrhy vítány!
- hrach
- Člen | 1838
redhead napsal(a):
Zobrazení chyby je děláno přidáním class ‚form_error‘ controlu, a při odstranění chyby je class odebrán.
Bylo by fajn, kdyby to ještě někde bokem vypsalo chybu
K tomu bylo potřeba přidat trojici JS funkcí pro hledání, přidávání a odebíraní classy. V tuto chvíli by asi nešlo mít 2 a více formů na stránce, bo ty funkce by měli stejné jméno (JS by asi řval; bude se řešit, neví někdo jak zjistit že na stránce se už nějaký form vypisoval??).
Co includovat tyto funkce bokem a zbytečně je nevypisovat?
- redhead
- Člen | 1313
Bylo by fajn, kdyby to ještě někde bokem vypsalo chybu
To sem zapomněl napsat. Chyba se momentálně vpisuje do title atributu
controlu.
Celé zobrazení chyby se dá upravit, ale nechtělo se mi zatím tvořit nové
elementy (pro nějakou ikonku a popisek), skrývat je a odkrývat je. Tak proto.
Ale časem to nějak pozměnim.
Co includovat tyto funkce bokem a zbytečně je nevypisovat?
Ano šlo by to, ale pak to zavisí na userovi, že to opravdu includne někam
do šablony.
Ještě to pořešim.
- hrach
- Člen | 1838
redhead napsal(a):
Ano šlo by to, ale pak to zavisí na userovi, že to opravdu includne někam do šablony.
No, když programatora nazyvas userem :))) ale chapu, o co ti jde. Jeste mas moznost ty funkce pojmenovat stylem formName_show_control() … jmeno formulare snad neni problem zjistit (nevim, s nette nepracuji)
Editoval hrach (10. 7. 2009 11:09)
- Honza Marek
- Člen | 1664
redhead: Chtělo by to kromě toho onchange přidat i onblur. Takhle ti checkbox, který musí být zaškrtnut, něco ohlásí jedině pokud ho zaškrtneš a zase odškrtneš a podobně. Na pravidlo Form::FILLED je to tudíž téměř nepoužitelné.
Jinak koukal jsi na ten jQuery validate plugin. Mně přijde (takhle z dálky) velice sexy a mám ve vzdáleném plánu se na něj blíže podívat a pokusit se taky ho naroubovat na nějaký ClientScript.
- redhead
- Člen | 1313
No, když programatora nazyvas userem :)))
myslím user jako uživatel toho kódu (nebo Nette).. Ono i například User Data (pro uchování extra dat v nějakém objektu) používá programátor a ne ‚user‘. Ale ano, měl jsem napsat programátor :)
Jeste mas moznost ty funkce pojmenovat stylem formName_show_control()
u toho skrývání a odkrývání určitě, ale s těmi helper funkcemi by byli zbytečný duplikáty naprosto stejnýho kódu.
Chtělo by to kromě toho onchange přidat i onblur. Takhle ti checkbox, který musí být zaškrtnut, něco ohlásí jedině pokud ho zaškrtneš a zase odškrtneš a podobně. Na pravidlo Form::FILLED je to tudíž téměř nepoužitelné.
Jinak koukal jsi na ten jQuery validate plugin. Mně přijde (takhle z dálky) velice sexy a mám ve vzdáleném plánu se na něj blíže podívat a pokusit se taky ho naroubovat na nějaký ClientScript.
pravda, já nějak tajně doufal, že onchange funguje i pro chekbox :D
spíš udělám přes podmínku onblur pro checkbox, a pro ostatní
onchange.
Nepamatuju si nazpaměť pro jaký elementy fungujou jaký eventy, takže když
tak pište, kde by to mohlo haprovat.
Další otázka je, jesli nechat onchange pro textboxy, nebo dát spíš onkeyup, ještě vyzkoušim.
Na ten jQuery jsem se díval, ale ne do kódu. Udělal sem si to po svém jenom proto, že u toho to závisí na 3rd party knihovně.
btw.: já třeba radši používám ze zvyku Prototype, ikdyž už jsem se několikrát snažil si najít čas a kouknout pořádně na jQuery. Právě kvůli tomu, jsem se chtěl pouze nativní chování javascriptu
- Honza Marek
- Člen | 1664
Onchange samozřejmě funguje i u checkboxu, ale tady je ti to právě celkem na nic. A to onblur se samozřejmě bude hodit i u textových elementů. U těch teď taky nezvaliduješ, že je prázdný, aniž bys tam musel něco napsat, kliknout vedle a pak to zase smazat :-D
- redhead
- Člen | 1313
Takže jsem to upravil, nakonec i s ukázkou vlastního doAlert a doRemove kódu, pro zobrazení/schování chyby.
Chtělo by to jen nějak opravdu maximálně otestovat ty podmínky. Nemá někdo nějaký složitý formulář, na kterém by se to mohlo vyzkoušet? Nechce se mi to teď psát ;)
EDIT:
Nakonec jsem to ještě víc přepsal: místo switch je nyní série ifů,
kvůli následující feature.
Pro každý condition typ (např. addConditionOn($form[‚a‘], Form::EQUAL,
TRUE) ) se pro control, který tuto condition dostává, připíše do ifu ||
sender.id = ‚control_na_ktery_condition_odkazuje‘.
To má za následek validaci controlu při splnění podmínky ‚závislého‘ controlu (snad sem to napsal pochopitelně :D )
Ukázka je i v demu, kde je ConditionOn přiřazeno emailovemu poli se závislostí na zaškrtnutém checkboxu
Editoval redhead (10. 7. 2009 22:34)