Validace formu – input po inputu

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

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
+
0
-

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
+
0
-

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.

sodae
Nette Evangelist | 250
+
0
-

javascript, jestli máš nějaké zkušenosti tak bys mohl napsat vlastní validátor nebo popřípadě zkontroluje ajaxem (třeba signálem)

Patrik Votoček
Člen | 2221
+
0
-

_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…

miira
Člen | 13
+
0
-

Jak to tak pozoruji, tak se prozatím patrně jedná o mission impossible :)

arron
Člen | 464
+
0
-

Ono je to v zasade v rezii rendereru. Ten do stranky vklada InstantClientsScript a neni duvod, aby treba vlozil jeste neco navic:-) Nicmene me zatim moc nenapadla metoda, pomoci ktere by se dalo validovat na strane serveru bez toho, aby clovek psal prilis mnoho kodu:-)

_Martin_
Generous Backer | 679
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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/

o5
Člen | 416
+
0
-

Tusis blbe, to tam neni.

_Martin_
Generous Backer | 679
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

Pravda, i když by se to zvalidovalo při submitu, ale bude to více friendly.

redhead
Člen | 1313
+
0
-

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

Demo zde

Editoval redhead (10. 7. 2009 22:34)