Pravidlo Form::FLOAT nevolá TextBase::filterFloat pokud je toto pravidlo podmíněno
- Casper
- Člen | 253
Zdravím,
pokud na formulářovém prvku zadám podmíněné pravidlo
Form::FLOAT
, nezavolá se filter pro desetinná čísla v TextBase
(TextBase::filterFloat
). Bez podmíněného pravidla vše funguje
jak má. Ukázka:
$form->addText('zero', "Fill 0"); // 0
$form->addText('float_condition', "Float when first is 0") // "32,4" => "32,4"
->addConditionOn($form['zero'], Form::EQUAL, 0)
->addRule(Form::FLOAT);
$form->addText('float', "Float always") // "32,4" => "32.4"
->addRule(Form::FLOAT);
Nette Framework 2.0.3 stabilní, uvolněný 4. 4. 2012
- Casper
- Člen | 253
Hodnota text inputu je řetězec…
O to tady přece vůbec nejde, podmínka se vyhodnotí správně (navíc
toto je pouze ukázkový příklad), jde o to, že po zavolání
addConditionOn se nacházíš v kontextu té podmínky (vrací
Nette\Forms\Rules
) a zde je jiný kód metody addRule než při
kontextu TextBase (aneb nevolá se zmíněná metoda
obsahující str_replace pro transformaci čárky na tečku).
Myslím, že toto by mělo být sjednoceno, i když je workaround poměrně snadný (vlastní filter).
- radas
- Člen | 224
Zdá se, že to vyřešeno pořád není.
A co víc, v poslední verzi Nette 2.1-dev ze dne 8. 7. 2013 už ani nelze použít
->addFilter(callback('Nette\Forms\Controls\TextBase', 'filterFloat'))
Jak tedy nyní řešit to, aby i podmíněné pravidlo vzalo jako validní vstup desetinnou čárku a tato aby byla převedena na des. tečku?
Je jediným možným řešením toto:
->addFilter(function($s) {
return str_replace(array(' ', ','), array('', '.'), $s);
});
Díky
- Casper
- Člen | 253
@radas: Na githubu se to řešilo zde. Existuje dokonce nemergnutý pullrequest. Osobně to vidím jako poměrně otravný bug.
Brání něco řešení tohoto problému?