Formulare a fitr filterFloat

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

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

Dá se to považovat za chybičku.

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

Filip Procházka
Moderator | 4668
+
0
-

Chyba je v tom, že objekt Rules s tím nepočítá.