Validace datumu a zobrazení chyb u polí
- Croc
- Člen | 270
Zdravím,
Nette teprve poznávám a zjišťuji jeho možnosti. Mám již realizované
svoje stránky s fórem, ale z Nette bych chtěl použít tvoření a validaci
formulářů.
Nyní si zkouším udělat vzorový formulář. Narazil jsem na problém s validací datumů (zda-li datum existuje, zda-li je větší/menší než jiné datum). Je na to v Nette funkce?
Druhou věcí je zobrazení validačních hlášek u jednotlivých polí. V Nette používám pouze formuláře (nepoužívám latte/MVC strukturu), je tedy možné toto zobrazení do formuláře dodělat? Popřípadě jak?
Díky moc…
- David Matějka
- Moderator | 6445
1. Jako validacni pravidlo nemusis pouzivat preddefinovane (jako
Form::FILLED
apod), muzes tam dat nejaky callback, ktery to
zvaliduje, viz doc
takze treba
$form->addText('date')
->addRule(function($control) {
$value = $control->value;
return ...; //true nebo false dle toho, jestli je validace ok
}, 'Doslo k chybe!');
2. Ke vsem validacnim chybam se dostanes skrz
$form->getErrors()
, k chybam vazanym primo na form (a ne na
nektery prvek) skrz $form->getOwnErrors()
. K chybam konkretniho
prvku pomoci $form['nazev_prvku']->getErrors()
Vsechny relevatntni metody hledej v api doc formu nebo
controlu
- Croc
- Člen | 270
Díky za odpověď.
Bod 1: Odzkoušeno a funguje :)
EDIT:
Bod 2: Našel jsem tento Live Form Validation: https://gist.github.com/Robyer/7948399 – Vypadá to že funguje.
Editoval Croc (20. 12. 2014 13:20)
- Croc
- Člen | 270
Narazil jsem na problém zprovoznění validace datumu v Live-Form-Validation a DatePicker. Problém je, že validace pole pro datum, se spustí dříve, než se datum vloží do daného pole.
Zobrazení DatePicker a spuštění validace mám řešené dle tohoto postu
EDIT: Upřesnění – validace se při vložení datumu z DatePicker vůbec nespustí… Klikem na datum v DatePicker se zruší focus do inputu – tím se zvaliduje a pak se tam teprve vloží vybraný datum…
Nějaké nápady jak toto vyřešit?
Editoval Croc (25. 12. 2014 13:55)
- Croc
- Člen | 270
Už jsem to vyřešil. Nelze použít setRequired, ale musí být použito ->addRule(Form::FILLED, ‚Datum není vyplněn!‘).
Validace nyní funguje perfektně Live-Form-Validation a DatePicker
zároveň. Dal jsem dohromady následující funkce pro validaci správnosti
data a jestli je ve zvoleném intervalu.
Správný formát data ověřuji takto:
->addRule(Form::PATTERN, 'Datum musí být ve formátu 15.10.2011', '[0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4}')
<script>
Nette.validators.validateDateRange = function(elem, args, val) {
var from = val.split(".");
var date = new Date(from[2], from[1] - 1, from[0]);
var inputDate = date.getTime();
var date = new Date( 1970, 0, 1);
var minDate = date.getTime();
var date = new Date();
var maxDate = date.getTime();
if (inputDate > minDate && inputDate < maxDate){
return true;
}
else{
return false;
}
};
Nette.validators.validateDate = function(elem, args, val) {
var from = val.split(".");
var yearToCheck = from[2];
var monthToCheck = from[1] - 1; // 0-11
var dateToCheck = from[0];
var dateObj = new Date(yearToCheck, monthToCheck, dateToCheck);
if (dateObj.getFullYear() == yearToCheck && dateObj.getMonth() == monthToCheck && dateObj.getDate() == dateToCheck){
return true;
}
else{
return false;
}
};
</script>
Editoval Croc (26. 12. 2014 11:38)
- Marek Šneberger
- Člen | 130
@Croc Ten regex ti funguje? Chybí ti tam závorky, správně má být
([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})
.
Nicméně i to je špatně, protože ti projde datum 54.13.2014 :-)
- Croc
- Člen | 270
jj funguje, ale pro jistotu jsem tam ty závorky doplnil, díky :)
Já vím, projde (kontroluje pouze formát data), proto tam mám další funkci na kontrolu existence datumu :) viz funkce validateDate
Celkově na datu kontroluju postupně: správný formát, existenci a potom jestli je ve zvoleném intervalu.
Editoval Croc (26. 12. 2014 14:09)