Různé chování addRule na Control a na Condition
- michal.lohnisky
- Člen | 64
Ahoj,
používám Nette dev verzi.
Pokud nastavím Rule přímo na prvek amount
, dostane tento prvek
filter „filterFloat“:
$this->addText('amount', 'Částka:')
->addRule(Form::FLOAT, 'Zadejte číselnou hodnotu.');
pokud však aplikuji pravidlo na Condition, prvek amount
má
filter prázdný
$this->addText('amount', 'Částka:')
->addCondition(Form::FILLED)
->addRule(Form::FLOAT, 'Zadejte číselnou hodnotu.');
Je to očekávané chování? Já bych očekával, že se druhý případ bude chovat jako první.
- Marek Šneberger
- Člen | 130
@Honza Tvrdík o tom povídal na Poslední sobotě, naštěstí je o tom video na YouTube :) Nicméně doporučuju shlédnout celé video
- frosty22
- Člen | 373
Video jsem zatím neviděl, podívám se, ale jinak v kostce bych řekl, že je to očekávané chování. Protože jednoduše:
- příklad: Přidám textové políčko a přidám mu pravidlo, že je desetinné číslo ⇒ jasný FLOAT
- příklad: Přidám textové políčko A KDYŽ je vyplněné, tak je float ⇒ a když není, tak to je co?
Když si zaměníš addCondition za addConditionOn (kde by to dávalo pro představu větší smysl) na jiný prvek, pak bys mohl být ješte … A KDYŽ není vyplněné, tak to musí být integer
<?php
$this->addCheckbox("currency", "Měna s desetinnou částkou?");
$this->addText('amount', 'Částka:')
->addConditionOn($form["currency"], Form::EQUAL, true)
->addRule(Form::FLOAT, 'Zadejte číselnou hodnotu.');
->elseCondition()
->addRule(Form::INTEGER, "Zadejte celé číslo.");
?>
Příklad není zrovna ideální (= je to kravina), ale tím chci jen ukázat, že tady už nelze přímo definovat filter.
- michal.lohnisky
- Člen | 64
Video jsem stále ještě neviděl.
K Tvému druhému příkladu: tak je to prázdný řetězec. A protože pole není povinné, tak je vše v pořádku.
Představoval jsem si, že jakmile se nastaví value (například od POST
dat), tak se přidá filter. Mým cílem bylo z amount
získat buď
prázný řetězec a nebo float (a díky filteru jak ‚1,2‘, tak i
‚1.2‘).
- michal.lohnisky
- Člen | 64
Ve videu je pouze zmíněno, že to tak je, bohužel ne proč.
Pro ostatní – můj požadavek (viz minulý příspěvek) jsem vyřešil takto:
$this->addText('amount', 'Částka:')
->addFilter(function($s) {
return str_replace(array(' ', ','), array('', '.'), $s);
});