Formulare a fitr filterFloat
- bene
- Člen | 82
Nevím jestli je tohle chyba. Pokud se nastaví u položky pravidlo, že
musí být float
tak dochází k převodu čárky na tečku. Pak
s tím mohu pracovat jako s float
, paráda.
Jenže, pokud je to až za podmínkou, tak se filtr nenastaví. Zjistil jsem to teď nedávno, a vlastně mám všude v aplikaci, kde se toto pravidlo oběvuje za podmínkou, chybu :-(
use Nette\Forms\Form;
$form = new Form;
// obsahuje fitr 'filterFloat'
$form->addText('key1', 'Polozka1')
->addRule(Form::FLOAT, 'Polozka1 musi byt cislo.');
// neobsahuje fitr 'filterFloat'
$form->addText('key2', 'Polozka2')
->addCondition(Form::FILLED)
->addRule(Form::FLOAT, 'Polozka2 musi byt cislo.');
Nešlo by to nastavovat i pokud je pravidlo za podmínkou? Už je to dávno, co jsem zkoumal zrojáky formulářů, ale předpokládám že přes parent bych se měl dostat až k formulářovému prvku.
S tím souvisí další věc. Už jsem to tu jednou navrhoval, ale nikdo se k tomu nevyjádřil.
Bylo by super, kdybych si formulářové prvky definoval jako
->addFloat()
, popřípadě
->addText('key', 'Name', Form::FLOAT, null)
nebo
->setType(Form::FLOAT, null)
. Tím bych si určil, že když
chci aby při zavolání ->getValues()
mi to přetypovalo na
float (zde by proběhl i filterFloat
), pokud by položka nebyla
vyplněna, dostal bych null
. Takto bych si mohl určovat výchozí
hodnoty už při definici formuláře a nemusel to podmínkovat až když
s prvky pracuji. Můžu je rovnou poslat třeba do databáze.
Teď je třetí parametr u ->addText()
tuším velikost
inputu. Pokud to ovlivňuje pouze velikost zobrazeného inputu, tak to dle mého
názoru patří až do šablon.
Asi nejsnadnější cesta je:
$form->addText('key2', 'Polozka2')
->setType(Form::FLOAT, null) // ->setType(Form::FLOAT, 0.0), ...
->addCondition(Form::FILLED)
->addRule(Form::FLOAT, 'Polozka2 musi byt cislo.');
- bojovyletoun
- Člen | 667
Dá se to považovat za chybičku.
- v první případě voláš addRule na objektu TextInput
< TextBase
< BaseControl –
addRule u Textbase zajistí, pokud je pravidlo „float“, přidá filter;
dál volá basecontrol, která pomocí
$this->rules->addRule()
voláRules::addRule
- v druhém případě voláš addRule na na objektu Rules,
v tom případě dojde jen k
Rules::addRule
.
Nevím jak to tedy přesně zařídit: manuálně přidat filtr
TextBase::filterFloat
, pouze, když je vyplněno. Problém je, kdy
v kódu najít ten okamžik, ještě něž se budou číst hodnoty.
Editoval bojovyletoun (24. 11. 2011 20:38)