Validace: porovnání hodnot inputů
- Casper
- Člen | 253
Dobrý den, lze nějakým jednoduchým způsobem validovat dva inputy na základě porovnání jejich hodnot?
Zkoušel jsem:
$form->addText('min', 'Min')
->addRule(Form::NUMERIC);
$form->addText('max', 'Max')
->addRule(Form::NUMERIC)
->addRule(Form::RANGE, 'Max musí být větší než %d!', array($this["min"]->value, NULL));
ovšem zastaví mě javascriptová validace (kterou nechci
vypnout) protože v době vytváření formuláře se do atributu inputu do
data-nette-rules
vloží napevno momentální(v době
vytváření) hodnota inputu min jako mezní spodní kontrola rozsahu. Bez
defaultní hodnoty tedy prázdný string – pak je jakákoli hodnota
testována na daný rozsah jako FALSE.
Řešit to lze ajaxovým znovunačtením formuláře, ovšem na to nechci
spoléhat. Vypnutí JS validace by také pomohlo, ale to také nechci.
A vypnutí JS validace jen pro konkrétní inputy předpokládám nelze.
Taktéž by to asi šlo řešit vlastním callbackem, který pak porovná obě
ty hodnoty pro konkrétní inputy, ale to mi nepřijde moc čisté řešení,
obzvlášť když v callback funkci získám jen objekt daného inputu a
kontrolu dalšího bych musel dělat stylem
$input->getParent()->getComponent('druhyInput')
.
Jako řešení bych viděl změnu v Nette: možnost dynamických validačních hodnot na základě jiných inputů (ukládání do data-nette-rules). Ovšem nakoukal jsem jak složité by to bylo.
A nebo přemýšlím špatným směrem a lze to řešit jinak?
- Casper
- Člen | 253
redhead napsal(a):
Myslím, že stačí odstranit to->value
Bohužel nestačí, dostávám:
Notice: Object of class Nette\Forms\Controls\TextInput could not be converted to int in /home/path/to/web/libs/Nette/Forms/Rules.php on line 263
Do data-nette-rules se sice místo prázdného stringu
vloží arg:[{control:'min'},null]
, ale s tím si stejně js
validator range neporadí.
Nějaké další návrhy?
Editoval Casper (23. 10. 2011 12:28)