DatePicker – validace datumu

- koren
 - Člen | 59
 
Zajimalo by me, zda lze pomoci dosavadni implementace Nette/Form nejak validovat datumy z DatePickeru..
Konkretne – mam formular, kde uzivatel zadava zacatek a konec nejake udalosti a nevim zda lze odchytit jako chybu, ze
- zacatek akce je mensi nez dnesni datum…
 - koncove datum predchazi zacatku…
 

- JakubJarabica
 - Gold Partner | 184
 
addRule() môže prijať ako prvý parameter callback na vlastnú funkciu, ktorej bude ako argument predaný príslušný formulárový prvok. Ak vytváraš formulár továrničkou v presenteri, môžeš napísať napr:
<?php
$form->addText('datum', 'Datum')->addRule(callback($this, 'validujDatum'), 'Text chybovej hlasky');
?>
a v presenteri mat funkciu
<?php
public function validujDatum($formularovy_prvok) {
	$hodnota = $formularovy_prvok->getValue();
	// samotna validacia hodnoty
	// return false ak chyba, inak true
}
?>
Nerátaj ale s tým, že sa ti vygeneruje Javascriptová validácia :)

- JakubJarabica
 - Gold Partner | 184
 
Na strane PHP mať signál na takýto štýl:
<?php
public function handleValidateDate($datum) {
	if(!$this->isAjax()) {
		// ak ratas len s AJAXovym poziadavkom, zrejme flashMessage warning a redirect niekam prec :)
	}
	$this->sendResponse(new JsonResponse(array(
		'result' => $this->validujDatum($datum) // vrati true alebo false; ak sa pouzije callback z predchadzajuceho postu, treba jeho zaciatok upravit na instanceOf test - raz mu pride IFormControl a raz string
	)))
}
?>
V šablóne by si ho mohol vyvolať pri onSubmit formulára(neviem ako by to kolidovalo s netteForms.js) alebo onChange/onBlur daného formulárového prvku.
Ja validujem v registračnom formulári existenciu mailu nasledovne:
<script>
var $mail = $("#"+{$control['registracnyForm']['mail']->getHtmlId()}); // ziskanie aktualneho IDcka konkretneho formcontrolu
$mail.change(function() {
	$.getJSON({link existujeMail!}, {'mail': $(this).val()}, function(data) { // volanie signalu handleExistujeMail s parametrom mail, response je asociativne array v premennej data
        	if(data.existuje == false) {
                	$text.text('V poriadku').addClass('success');
                } else {
                	$text.text('E-mail je už zaregistrovaný!').addClass('failure');
                }
        });
});
</script>
// je to písané z hlavy, niečo nemusí fungovať, ide mi o princíp :)

- Jan Tvrdík
 - Nette guru | 2595
 
Částečně to dokáže řešit DatePicker+.
	protected function createComponentAddEventForm($name)
	{
		$form = new AppForm($this, $name);
		$form->addDatePicker('startDate', NULL, new DateTime('today'))
			->addRule(Form::VALID, 'Entered date is not valid!');
		$form->addDatePicker('endDate', NULL, $form['startDate']->value)
			->addRule(Form::VALID, 'Entered date is not valid!');
		// ...
	}
Aby to fungovalo dokonale, muselo by se to doskriptoval na straně klienta.