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.