Vlastní validátor reagující na jiný input

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

Chci se zeptat, jak byste šli na následující. Máme 2 inputy (Datum od a Datum do). Uživatel vyplní datum přes datepicker, nebo ho sám zadá ve formátu mm.dd.yyyy. Chci zkontrolovat, jestli náhodou není datum DO menší než datum OD.

Vím, jak by se to porovnalo. Vím, jak by se to dalo ošetřit po odeslání formuláře. Zajímá mě ale, jak by se psal vlastní validátor. V examples a tak různě jsou vždy, jednoduché validátory typu sudé číslo a podobně. Tady bych porovnával 2 hodnoty z formuláře. Takže asi bych to viděl na napsání vlastní metodu typu Form::EQUAL. Nevím si ale rady.

Jak byste na to šli?

Editoval Martin Mates (27. 4. 2009 15:14)

insider
Člen | 31
+
0
-

snad ti pomuze tohle

Jod
Člen | 701
+
0
-

Najjednoduchšie sa mi to robilo takto:

if($form->isSubmitted() && $form->isValid()) {
    $data = $form->values;
    if($this->model->validateRange($data['min_age'], $data['max_age'])) {
        $this->model->save($data);
        $this->redirect('');
    }
    else {
        $form->addError(@BAD_RANGE);
    }
}

Alebo cez custom rule:

$form->addText('text', 'text')
	->addRule(array($this, 'validateText'), 'Text');

function validateText(TextInput $input) {
	$form = $input->form;
	$values = $input->values;
	$value = $input->value;

	$text2 = $values['text2'];
	// ...
}

Iné riešenie som zatiaľ neriešil, nemám čas si pridávať zbytočnú prácu nad hlavu, keď to takto funguje.

Editoval Jod (27. 4. 2009 16:52)

LM
Člen | 206
+
0
-

A co takhle:

<?php
function validate(TextInput $control, TextInput $control2)
{
	return $control->value > $control2->value;
}
?>

Pak stačí jen:

<?php
$form['date']->addRule('validate', 'text', $form['date2']);
?>