Různé chování addRule na Control a na Condition

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

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

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

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:

  1. příklad: Přidám textové políčko a přidám mu pravidlo, že je desetinné číslo ⇒ jasný FLOAT
  2. 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
+
0
-

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

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