[addon live-form-validation] Live Form Validation

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

despiq napsal(a):

https://gist.github.com/504867

Díky moc :)

//Edit: U této verze s namespaces jede vše jak má až na prvky s RadioList – zde se mi validují jednotlivé prvky formuláře a až dojde na prvek RadioList tak se stránka znovu načte a vypíšou se chyby klasicky nad formulářem s novou URL.

Editoval cmelis (2. 8. 2010 19:07)

redhead
Člen | 1313
+
0
-

Mám pocit, že je to spíš problém samotného pluginu. Někdo mi to už reportoval.

Manny7
Člen | 67
+
0
-

Chtěl bych se zeptat, jestli je možné upravit validační pravidla tak, že by se při špatně zadaném obsahu zobrazila jen varovná ikonka a žádný text – u správně vyplněného inputu to tak je. Zkoušel jsem něco takového:

	$form->addText("jmeno", "Jmeno", 35)
->addRule(Form::FILLED, "")
->addRule(Form::REGEXP, "", "/^[a-z]+$/")
->addRule(Form::MIN_LENGTH, "", 4);

Ale je to špatně – vždycky tam musí být nějaký text, jinak se nezobrazí ani ta varovná ikonka… Neřešil někdo podobný problémek? Díky

redhead
Člen | 1313
+
0
-

Si to předělej v JavaScriptu..

Manny7
Člen | 67
+
0
-

@redhead: chvilku po napsání příspěvku mě to trklo… (:

iguana007
Člen | 970
+
0
-

Chtěl bych se zeptat, zda-li jste již někdo neřešili, jak rozchodit tento addon v nové verzi Nette, kde je Unobtrusive JavaScript namísto InstantClientScript a kde již není metoda setClientScript(). Podařilo se mi zatím rozjet klasickou Nette validaci za použití netteForms.js ze složky examples v balíčku Nette.

Více viz. zde: https://forum.nette.org/…clientscript

Zkouším to rozjet na Nette 1.0-dev bcb1369 released on 2010–08–14 – pro PHP 5.2

redhead
Člen | 1313
+
0
-

Samozřejmě to nepůjde, protože to závisí na setClientScript. Ale mám už rozjetou úplně novou validaci. Dá se říct, že se jen upraví onen .js soubor (takže to bude spíš jenom věc javascriptu, než plugin (třída) do Nette). Ale není na to teď moc čas, ale snad to někdy brzo dodělám.

iguana007
Člen | 970
+
0
-

Ok, díky za info

redhead
Člen | 1313
+
0
-

První nástřel tu: https://gist.github.com/552273

Rozhodně to zatím nemá takové možnosti jako ten starý. A navíc se aplikuje na všechny formuláře – plánuju to aplikovat třeba jen na formuláře s určitou class nebo něco podobného. Zatím to snad stačí.

iguana007
Člen | 970
+
0
-

Super! Zítra to zkusím a dám vědět ;) Díky

iguana007
Člen | 970
+
0
-

tak nevím co jsem udělal blbě, ale nic mi ten JS nedělá … nevalidní form v klidu odešlu.

redhead
Člen | 1313
+
0
-

Ono to nemusí být u tebe. Může tam být nějaká chyba, já jsem to zkoušel na 2 formech (v examples a můj vlastní) a šlo to. Zkus debugnout javascript (je akorát blbý, že to tu chybu vyhodí až při odeslání, takže v chrome tu chybu nestačím ani přečíst a stránka se reloadne)

iguana007
Člen | 970
+
0
-

Firebug má feature (myslím, že Chrome má taky Firebug) a tam je v tabu konzole tlačítko „Zachovat“ a když jej aktivuješ, tak se ti konzole po reloadu nevyčistí ;)
Já to taky zkusím zjistit o co tam jde …

iguana007
Člen | 970
+
0
-

Tak mě to teda žádný JS error nehodí, prostě se ten form odešle … a zpracování formuláře proběhne jaksi podivně, protože se mi s těmi daty neprovede vůbec nic – zkoušel jsem si dumpovat ruzné části toho zpracování formu a dumpy se vůbec neprovedou – nechápu to.

redhead
Člen | 1313
+
0
-

:D :D

Podívám se na to až přijdu z práce :) (možná budu odjíždět už večer pryč na víkend, takže když tak v neděli :D)

bazo
Člen | 620
+
0
-

iguana007 napsal(a):

Tak mě to teda žádný JS error nehodí, prostě se ten form odešle … a zpracování formuláře proběhne jaksi podivně, protože se mi s těmi daty neprovede vůbec nic – zkoušel jsem si dumpovat ruzné části toho zpracování formu a dumpy se vůbec neprovedou – nechápu to.

skus to dumpovat v onInvalidSubmit

David Grudl
Nette Core | 8218
+
0
-

redhead napsal(a):

Samozřejmě to nepůjde, protože to závisí na setClientScript. Ale mám už rozjetou úplně novou validaci. Dá se říct, že se jen upraví onen .js soubor (takže to bude spíš jenom věc javascriptu, než plugin (třída) do Nette). Ale není na to teď moc čas, ale snad to někdy brzo dodělám.

Tak je to přesně zamýšleno, že změny chování validace se docílí zainkludováním jiného js souboru. Jen samotná validační pravidla byl pořešil tak, aby byly pro všechny skripty společné. Ale nad netteForms.js bude ještě dost práce.

iguana007
Člen | 970
+
0
-

bazo napsal(a):
skus to dumpovat v onInvalidSubmit

Máš recht, teď mi to ty chyby dumpuje, ovšem to pořád nemění nic na tom, že mě ten live validační skript nejede :) Klasický neetteForm.js fachá dobře.

redhead
Člen | 1313
+
0
-

David Grudl napsal(a):

Tak je to přesně zamýšleno, že změny chování validace se docílí zainkludováním jiného js souboru.

To byl samozřejmě naprosto správný tah.

Jen samotná validační pravidla byl pořešil tak, aby byly pro všechny skripty společné.

S tím naprosto souhlasím.

Rád bych ti jen nadhodil nápad, že by bylo fajn, mít ty pravidla rozdělené do vlastních metod (funkcí). Například nette.validators.filled(), nette.validators.email(), atd. Dalo by se to pak snáze rozšiřovat i o vlastní validace, případně ajax. callbacky. (nějak pořešit tu dvojtečku na začátku..)

Ale nad netteForms.js bude ještě dost práce.

Jen tak dál, zatím to vypadá, že je to na skvělé cestě. Chtělo by to ještě nějak definovat, pro jaký form se má aplikovat jaká klientská validace (jelikož teď se aplikuje na všechny, já např. mám některé formy se standardní validací, některé s live validací (přes třídy BaseForm, LiveForm)).

redhead
Člen | 1313
+
0
-

iguana007 napsal(a):

Máš recht, teď mi to ty chyby dumpuje, ovšem to pořád nemění nic na tom, že mě ten live validační skript nejede :) Klasický neetteForm.js fachá dobře.

Můžeš mi poslat definici toho formuláře (klidně přes PM)? Jestli to tam neporazí něco specifického..

Editoval redhead (27. 8. 2010 13:16)

iguana007
Člen | 970
+
0
-

tady je:

<?php
class SubscribeNewsletterForm extends AppForm {

    public function __construct($parent, $name) {
        parent::__construct($parent, $name);
        $this->getElementPrototype()->class = 'ajax';
        $this->addText('email',_('Email'))
                ->addRule(Form::FILLED,_('Položka email je povinná.'))
                ->addRule(Form::EMAIL, _('Zadejte prosím platnou emailovou adresu.'));

        $this->addSubmit('registrovat', _('Registrovat'));
        $this->onSubmit[] = array($this, 'subscribeNewsletterFormSubmitted');
        $this->onInvalidSubmit[] = callback($this, 'subscribeNewsletterFormError');

        return $this;
    }
    public function subscribeNewsletterFormSubmitted(AppForm $form) {
        try {
                $values = $form->getValues();
                $this->presenter->flashMessage(_('OK'), 'ok');
                $this->presenter->invalidateControl('overlayNewsletter');
        } catch(IOException $e) {
                $this->presenter->flashMessage($e->getMessage(), 'error');
                $this->presenter->invalidateControl('overlayNewsletter');
        }
    }
    public function subscribeNewsletterFormError(AppForm $form) {
        foreach ($form->getErrors() as $error) {
            $this->presenter->flashMessage($error, 'error');
        }
        $this->presenter->invalidateControl('overlayNewsletter');
    }
}
redhead
Člen | 1313
+
0
-

Tak mě tak napadá, mě to před tím taky nešlo a zjistil jsem že to bylo háčkama a čárkama a tak jsem všechny chybový zprávy psal be nich (myslel jsem, že je to špatným kódováním php souboru, ale asi ne..). Můžeš ověřit ve zdrojáku tý stránky, že v atributech data-nette-rules u inputů je v těch pravidlech msg:null ?

iguana007
Člen | 970
+
0
-

Zde je komplet input co se mi vyrenderuje do stránky:

<input type="text" value="" data-nette-rules="{op:':filled',msg:&quot;Polo\u017eka email je povinn\u00e1.&quot;},{op:':email',msg:&quot;Zadejte pros\u00edm platnou emailovou adresu.&quot;}" id="frmsubscribeNewsletterForm-email" name="email" class="text">
iguana007
Člen | 970
+
0
-

Ještě k té diakritice – ta mi běžela vždy v poho v těch errorech – také gettext beží jak má.

David Grudl
Nette Core | 8218
+
0
-

redhead napsal(a):

Rád bych ti jen nadhodil nápad, že by bylo fajn, mít ty pravidla rozdělené do vlastních metod (funkcí). Například nette.validators.filled(), nette.validators.email(), atd.

Ano, přesně tak to bude :-)

redhead
Člen | 1313
+
0
-

Tak jsem zkoušel tvůj form a nešel mi. Ale! Všiml jsem si, že jsem ho dal omylem do o fous starší verze Nette. Když jsem ho dal do současné verze z GitHubu (pro kterou jsem js soubor dělal), tak fungoval. Zkus upgrade.

iguana007
Člen | 970
+
0
-

Já to testoval na verzi: 1.0-dev 7d7ade7 released on 2010–08–26 – tam by to imho mělo být v pohodě.

redhead
Člen | 1313
+
0
-

Rozchodil si to? Já to teď na gistu upravil podle posledních commitů od Davida. Tak se na to zkus podívat. Jediný co mě napadá je si debugnout ten JS a vykoumat, kde to prostě krachne.. Je klidně možný, že to má i nějaký problém s jQuery.

btw, ty úpravy jsem dělal na gistu, takže nezaručuju, že to bude fungovat celkově, ale snad jsem ten kód upravil správně. ;)

iguana007
Člen | 970
+
0
-

mám teď blázinec, ale zkusím na to dnes mrknout a dám vědět. zatím díky za úpravy

iguana007
Člen | 970
+
0
-

Tak jsem se k tomu konečně dostal a otestoval to, vypadá to, že už se to snaží něco dělat, ale zkrachuje to na řádku 84:

el.parentElement.appendChild(error);

Firebug hlásí chybu: el.parentElement is undefined

iguana007
Člen | 970
+
0
-

Zkusil jsem ten řádek 84 upravit na:

$(el).parent().append(error);

A už to chybu neháže, jen to nevloží error message do toho spanu co to vytvoří.

.dan
Člen | 1
+
0
-

iguana007 napsal(a):

Zkusil jsem ten řádek 84 upravit na:

$(el).parent().append(error);

A už to chybu neháže, jen to nevloží error message do toho spanu co to vytvoří.

S Nette sa este len spoznavam, preto toto riesenie zobrazovania a skryvania error messagu nemusi byt uplne elegantne (budem rad, ked niekto pride s niecim lepsim), ale ako quickfix mi funguje.

na riadku 33 namiesto innerText

(33) error.innerHTML = message;

aby skrylo hlasku pri splneni podmienok pridat za riadok 41

(41) err_el.className = this.options.validMessageClass;
(42) err_el.innerHTML = '';
despiq
Člen | 320
+
0
-

tak sem ted po dlouhe dobe zjistil ze regular na email je naprd pusti dal docela zverinu samozrejme to pak zachyti nette kontrola

pouzil sem jiny treba: /^([\w-]+(?:\.[\w-]+))@((?:[\w-]+\.)\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i

je to radek 377
ale ted mam dejavu jako bych to uz nekdy nekam psal :)

lovec
Člen | 13
+
0
-

Zdravím,
zkouším live validaci. Vše je OK. Ale teď jsem narazil na problém. U selectu mám na eventu onChange odeslání formuláře. Validace ale do onchange vloží volání validační funkce.
Ideálně bych potřeboval, aby se validační funkce přidala za již existující funkci. Ale netuším jak toho docílit. Máte někdo tip?

Problém je v kódu:

<script>
liveForm.setUpHandlers = function(el) {
	var handler = function(el) {
		if(el.target)
			el = el.target;
		nette.validateControl(el);
	};

	el.onchange = handler;
	el.onblur = handler;
	el.onkeyup = function(event) {
		if(event.keyCode !== 9)
			handler(event.target);
	};
};
</script>

Editoval lovec (16. 1. 2011 20:07)

redhead
Člen | 1313
+
0
-

Pokud používáš jQuery, tak bych to viděl na úpravu na jQuery eventy .click(), .change() atd.

lovec
Člen | 13
+
0
-

Jop, to je ono, díky.
Taky mě to napadlo, ale neuvědomil jsem si, že jquery je inteligentni a misto přemazání nový event přidá :-)

Editoval lovec (16. 1. 2011 21:59)