Validace datumu a zobrazení chyb u polí

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

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

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

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

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

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

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

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)