Výchozí chybové zprávy a nepředávání názvu prvku
- norbe
- Backer | 405
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)
- norbe
- Backer | 405
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 3x), 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ř
- Člen | 1662
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 | 405
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 | 405
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 | 8227
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 | 405
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 | 8227
Přidal jsem do 1.0-dev
podporu pro placeholdery
%label, %name a %value
, testujte ;)