Validace – nekontinualni rozsah
- hra
- Člen | 4
Jak otestovat formularovy prvek, pokud rozsah definuji dve promenne a testovany rozsah nemusi byt kontinualni – napriklad 20–6 hodina, coz odpovida rozsahu 20–23 a 0–6. Tusim ze je treba vyuzit vlastni pravidlo, ale to co jsem nasel ve foru zrejme staci pouze na kontinualni variantu (6–20h).
->addRule(function (Nette\Forms\IFormControl $od, Nette\Forms\IFormControl $do) {
return $od->value > $do->value; // od je vetsi nez do
}, 'od vetsi nez do');
Nebo jen nechapu vyuziti prvku RANGE?
- enumag
- Člen | 2118
Když ti odpadá omezení že od musí být menší než do tak neni co kontrolovat. Leda pokud to nejsou selecty tak zkontroluj že zadané hodnoty jsou mezi 0–23 pomocí RANGE. Validátor nějakého vztahu mezi těmi hodnotami imho nepotřebuješ, leda možná aby nebyly stejné což se dělá přes ~Form::EQUAL.
- hra
- Člen | 4
Jsem se spatne vyjadril, nepotrebuji kontrolovat promenne $od a $do, ty se definuji jinde a mohou byt ruzne. Co kontroluji, je zadani nove promenne, jejiz ciselna hodnota smi byti pouze v rozsahu $od-$do, a to i v pripade, ze $od je vetsi nez $do (napr. 20–6), protoze jinak bych pouzil RANGE.
Editoval hra (13. 2. 2013 12:42)
- Majkl578
- Moderator | 1364
->addRule(function (IFormControl $ctrl) use ($od, $do) {
$val = $ctrl->getValue();
if ($od > $do) {
return ($val >= $od && $val <= 23) || $val >= 0 && $val <= $do); // přesah přes půlnoc
} else {
return $val >= $od && $val <= $do; // normální rozmezí
}
}, 'Hodnota mimo rozmezí.');
Nebo jsem taky nepochopil o co ti jde?
- Majkl578
- Moderator | 1364
Pakliže to jsou inputy, nejspíš by šlo použít něco takového:
$od = $form['od'];
$do = $form['do'];
$ctrl->addRule(function (IFormControl $ctrl) use ($od, $do) {
$odVal = $od->getValue();
$doVal = $do->getValue();
if (!$odVal || !$doVal) {
return FALSE; // nevyplněné od/do
}
$val = $ctrl->getValue();
if ($odVal > $doVal) {
return ($val >= $odVal && $val <= 23) || $val >= 0 && $val <= $doVal); // přesah přes půlnoc
} else {
return $val >= $odVal && $val <= $doVal; // normální rozmezí
}
}, 'Hodnota mimo rozmezí.');
Pole od a do musí být deklarována dříve, resp. musí existovat v době přidávání tohoto pravidla. Nebude ale problém případně pravidlo přidat dodatečně (na konci po nadefinování celého formuláře).