DatePicker – validace datumu

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

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

  1. zacatek akce je mensi nez dnesni datum…
  2. koncove datum predchazi zacatku…
JakubJarabica
Gold Partner | 184
+
0
-

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 :)

koren
Člen | 59
+
0
-

moc pekne je ta trida Form udelana, nemuzu se toho nabazit :)

s vygenerovanim javascriptu v tomhle pripade samozrejme nepocitam, ale moc by se mi tam libil… jakou cestu zvolit nejlepe ?

JakubJarabica
Gold Partner | 184
+
0
-

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

Čá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.