Výchozí chybové zprávy a nepředávání názvu prvku

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

Ahoj,

chtěl bych docílit toho, abych nemusel pro každý formulářový prvek definovat chybovou zprávu. Kouknu se do třídy Rulues a co nevidím, je tam statické pole $defaultMessages, které by se pro tento účel dalo použít.

Celé to je ale nepoužitelné, jelikož název formulářového prvku se nepředává jako parametr a tím pádem nemohu dát uživateli najevo, ke kterému prvku se chybová zpráva vztahuje.

Čeho přesně chci dosáhnout:

Rules::$defaultMessages = array(
	Form::EMAIL => "Field '%s' must be valid email",
	Form::FILLED => "Field '%s' must be filled.",
);

//nyní už stačí jen nastavit pravidlo a připojí se defaultní zpráva
$form->addText('heading', 'Heading', 50, 255)
	->addRule(Form::FILLED); // vygeneruje zprávu "Field 'Heading' must be filled."

Nějaký typ jak toho jednoduše docílit? Myslím, že tohle by určitě uvítalo více lidí.

Díky

Editoval norbe (26. 1. 2010 9:46)

romansklenar
Člen | 655
+
0
-

Ono by to tak fungovat mělo, mrkni do kódu.

norbe
Backer | 401
+
0
-

Což to funguje, problém je právě v tom, že se v těch zprávách nedá využít název formulářovýho prvku. Tím pádem je to nepoužitelný (alespoň pro mne teda).

Edit: V současným stavu bych to musel do každého pravidla psát název prvku(při 2 pravidlech bych musel zadat název formulářového prvku 3×), což jde docela dost proti DRY (jedna z předností nette):

$form->addText('heading', 'Heading', 50, 255)
        ->addRule(Form::FILLED, NULL, 'Heading');

Editoval norbe (26. 1. 2010 13:36)

Honza Kuchař
Backer | 1660
+
0
-

Samo o sobě to asi bude použitelné jen trochu, ale pokud by to spolupracovalo i spřekladačem, tak to je jednoznačně použitelné a to dobře. ;)

norbe
Backer | 401
+
0
-

Na příkladu co jsem uvedl to použitelné je (obejduli se bez překladu jak psal Honza Kuchař), ale co když se bude jednat např. o pravidlo Form::RANGE? To pak je výše uvedený zápis nemožný, jelikož v InstanntClientScriptu se nepočítá s tím, že tam budu název předávat.

Příklad:

Rules::$defaultMessages = array(
        Form::RANGE => "Field '%s' must be in range from %d to %d",
);

$form->addText('value', 'Value')
// nebude fungovat (rozsah hodnot je na indexu 1 a 2, v kódu se počítá s indexy 0 a 1)
        ->addRule(Form::RANGE, NULL, array('Value', 10, 100));
// fungovalo by, ale hláška ve stylu "Je povolen pouze rozsah 10-100 pro pole Value" zní divně
        ->addRule(Form::RANGE, NULL, array(10, 100, 'Value'));
norbe
Backer | 401
+
0
-

Teďka jsem si chvíli hrál s InstantClientScriptem a upravil jeden řádek, který celý problém vyřeší. Jedinou podmínkou je, že místo %s se použije %name :-)

Úprava

InstantClientScript z Nette verze 0.9.2

@@ -158,7 +158,7 @@
 				} else {
 					$res .= "$script\n\t"
 						. "if (" . ($rule->isNegative ? '' : '!') . "res) { "
-						. "message = " . json_encode((string) vsprintf(str_replace("%name", $rule->control->translate($rule->control->caption), $rule->control->translate($rule->message)), (array) $rule->arg)) . "; "
+						. "message = " . json_encode((string) vsprintf($rule->control->translate($rule->message), (array) $rule->arg)) . "; "
 						. $this->doAlert
 						. " return false; }\n\t";
 				}

Příklad

Rules::$defaultMessages = array(
        Form::FILLED => "Field '%name' must be filled.",
);

$form->addText('heading', 'Heading', 50, 255)
        ->addRule(Form::FILLED); // vygeneruje zprávu "Field 'Heading' must be filled."

Teď už jen aby se to líbilo i Davidovi a hodil to do distribuce :-)

David Grudl
Nette Core | 7469
+
0
-

To by šlo přidat, jen místo %name bych použil %label, resp. klidně obojí, ale name by byl název komponenty a label popiska s odříznutou dvojtečkou. Stále ale váhám nad tím, jestli prvně nahradit a pak translator, nebo naopak…

norbe
Backer | 401
+
0
-

To %label by bylo asi lepší, s tím souhlasím. Ohledně té dvojtečky, být to tam může, ačkoliv je to možná zbytečné (na doplnění dvojtečky mi přijde vhodnější používat suffix – nedochází pak ke zbytečným duplicitám v překladu jako jednou s dvojtečkou, podruhé bez).

Co se týče pořadí, tak já bych byl pro translator a až potom nahrazení. Jako hlavní důvod bych uvedl to, že takhle budu mít v překladu jednu zprávu (Field '%label' must be filled.Položka '%label' musí být vyplněna), místo X zpráv, kde X je počet názvů polí. Nehledě na to, že v opačném případě by se asi blbě automatizovalo hledání vět pro překlad.

David Grudl
Nette Core | 7469
+
0
-

Přidal jsem do 1.0-dev podporu pro placeholdery %label, %name a %value, testujte ;)

norbe
Backer | 401
+
0
-

Supr :-) Až budu mít chvilku tak na to kouknu.

norbe
Backer | 401
+
0
-

Teďka jsem prozkoušel %label a %name a zdá se, že to funguje přesně tak, jak jsem potřeboval :)