[addon live-form-validation] Live Form Validation
- cmelis
- Člen | 26
despiq napsal(a):
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)
- Manny7
- Člen | 67
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
- iguana007
- Člen | 970
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
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.
- redhead
- Člen | 1313
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čí.
- bazo
- Člen | 620
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
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.
- redhead
- Člen | 1313
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
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
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
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
Zde je komplet input co se mi vyrenderuje do stránky:
<input type="text" value="" data-nette-rules="{op:':filled',msg:"Polo\u017eka email je povinn\u00e1."},{op:':email',msg:"Zadejte pros\u00edm platnou emailovou adresu."}" id="frmsubscribeNewsletterForm-email" name="email" class="text">
- David Grudl
- Nette Core | 8218
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
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ě. ;)
- .dan
- Člen | 1
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
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
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)