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

před 10 lety

norbe
Backer | 404
+
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)

před 10 lety

romansklenar
Člen | 657
+
0
-

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

před 10 lety

norbe
Backer | 404
+
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)

před 10 lety

Honza Kuchař
Backer | 1655
+
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. ;)

před 10 lety

norbe
Backer | 404
+
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'));

před 10 lety

norbe
Backer | 404
+
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 :-)

před 10 lety

David Grudl
Nette Core | 6884
+
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…

před 10 lety

norbe
Backer | 404
+
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.

před 10 lety

David Grudl
Nette Core | 6884
+
0
-

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

před 10 lety

norbe
Backer | 404
+
0
-

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

před 10 lety

norbe
Backer | 404
+
0
-

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