Pravidlo Form::FLOAT nevolá TextBase::filterFloat pokud je toto pravidlo podmíněno

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

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

uestla
Backer | 799
+
0
-

Hodnota text inputu je řetězec, čili já bych zkusil

->addConditionOn($form['zero'], Form::EQUAL, '0')
Casper
Člen | 253
+
0
-

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

Zkus použít

->addFilter(callback('Nette\Forms\Controls\TextBase', 'filterFloat'))
Casper
Člen | 253
+
0
-

Zkus použít…

Ano, jak jsem již psal, workaround je snadný, ale myslím, že o tohle by se měl starat framework. Řeknu že chci FLOAT a on by se měl postarat o vše s tím spojené a ne že se o to jednou postará a podruhé ne.

David Grudl
Nette Core | 8218
+
0
-

Tohle bude vyřešeno v další (nesetinkové) verzi.

radas
Člen | 224
+
0
-

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);
});

Řešilo se to i tady a tady.

Díky

Casper
Člen | 253
+
0
-

@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?