Validace – nekontinualni rozsah

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

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

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

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

voda
Člen | 561
+
0
-

Co RANGE a negace:

->addRule($od > $do ? ~Form::RANGE : Form::RANGE, '...', array(min($od, $do), max($od, $do)));
enumag
Člen | 2118
+
0
-

Dle prvního příspěvku jsou $od i $do instance IFormControl, tedy formulářové prvky, nikoli nějaké předdefinované proměnné. Tzn. řešení od @voda použít nelze a řešení od @Majkl578 bude potřebovat úpravu.

Majkl578
Moderator | 1364
+
0
-

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

hra
Člen | 4
+
0
-

Diky vsem!
priklad s RANGE negaci funguje, stacilo pridat pred jeste jednu podminku

<?php
->addRule(Form::RANGE, 'hod. v rozmezi od %d do %d', array(0, 23))
?>

Ostatni reseni jsem zjevne diky sve neschopnosti nerozjel (Laděnka, zajicova smrt).