Překlad pravidel formuláře s Kdyby Translation
- kleinpetr
- Člen | 480
Ahoj,
řeším takový problém a asi mi došli nápady, pravděpodobně nad tím tak dlouho přemýšlím, že ve finále to bude triviální, ale i tak se ptám.
Mám lokalizační soubor kde mám překlady pro různá formulářová pravidla
alert:
required: "%element% musí být vplněn"
minLength: "%element% musí mát minimálně %count% znaků"
atd..
Nyní vytvářím formulář:
class RegisterForm extends UI\Form
{
public function __construct(IContainer $parent = null, $name = null)
{
parent::__construct($parent,$name);
$this->addText('name','label.name')->addRule(Form::MIN_LENGTH, ..?.. ,10);
}
}
Prostě nemůžu přijít na to, jak předat parametry do překladu, šlo by to jedině takto:
$this->translator->translate('alert.minLength',['element'=>'label.name','count'=>10]);
Nicméně mi píše, call member function translate() on null
..
jelikož ho nevytvářím v presenteru
Zkoušel jsem už snad všechny různé varianty, ale výsledek žádný.
Předem díky za pomoc.
Editoval kleinpetr (12. 11. 2015 19:44)
- Felix
- Nette Core | 1270
Problem s call member...
bych vyresil nejakou tovarnickou na
formy, ktera ti tam translator bude automaticky setovat.
Problem s prekladama. Takhle jak to pises by to melo fungovat.
Defaultne se berou zde – https://api.nette.org/…tor.php.html#…
Ale pokud ty chces jeste %element%
do toho, tak si budes muset
zavolat fci $translator->translate
sam.
$this->addText('name','label.name')
->addRule(Form::MIN_LENGTH, $this->translate(.., 10),10);
PS: Tedka me napada, u input validatoru jsou promenne %name%, %label% a %value%. Tak zkus ty.
Editoval Felix (12. 11. 2015 20:59)
- David Matějka
- Moderator | 6445
Jestli se nepletu, tak tam muzes poslat instanci Phrase, takze nejak
->addRule(Form::MIN_LENGTH, new Kdyby\Translation\Phrase('alert.minLength', [....]), 10)
- kleinpetr
- Člen | 480
Díky, je fakt, že %label funguje, jenže jelikož mu pošlu jako label
opět nějaký langKey tak ten už se nepřeloží jen se dosadí za %label.
Nicméně bych se chtěl zeptat napadlo mě nevytvářet formular
v konstruktoru, ale udelat si metodu render. takze bych v presenteru vlastne
nejdriv vytvoril instanci pote setnu translator a pak az render. V tu chvily by
$this->trnaslator->translate()
mělo fungovat. Ale chtěl
bych použít tu nejlepší cestu a pořád mi všichni cpou ať si udělám
továrnu. OK, ale v čem jsou lepší ? že si přes ně můžu předávat
přes DI ? v čem je to pro mě lepší ? přijde mi, že je to spíš práce
navíc. Moc díky za rady :)
- kleinpetr
- Člen | 480
Jen se ještě zeptám na jednu věc. Když dědím od UI\Form tak musím
zavolat parent::__construct()
který přijíma IContainer a name
k čemu to je ? Když nastavím parent::__construct(null,null)
tak
vse bude fungovat stejne.. neboli kdyz budu chtit napojit rodice pro komponentu
tak si sam zavolm $this->addComponent($komponenta).. a name slouzi
k cemu ?
- Aurielle
- Člen | 1281
Jakoukoliv komponentu bys měl připojovat buď při vytvoření (používalo
se dřív), nebo se připojí sama, jakmile ji vrátíš z továrničky
(preferováno teď). Volat manuálně addComponent()
ve většině
případů není třeba, $name
je pak jméno identifikující danou
komponentu ve stromu.
- kleinpetr
- Člen | 480
Ok, díky a teď se ještě na jednu věc. Měl jsem za to, že když chci vytvořit továrnu na komponentu třeba na ten form tak mam soubor RegisterForm.php a potom IRegisterFormFactory.php kdy ten IFace pridam do sluzeb do configu, ale ted koukam na cisty nette/sandbox kde je signInFormFactory.php a zadnej IFace k nemu neni.. takze jsou ty IFaces potreba nebo ne ?
- duke
- Člen | 650
Někdy je třeba v továrničce komponentu i nějak nastavit a toto nastavení může být závislé na něčem, co se do komponenty plní až po připojení do stromu komponent.
Typický příklad je formulářová komponenta UI\Form, u které nebude fungovat metoda isSubmitted, dokud komponentu nepřipojíš. A připojit ji můžeš právě buď přes ty parametry konstruktoru nebo voláním addComponent. Pak můžeš např. podmíněně plnit výchozí hodnoty formuláře (netřeba je pak např. načítat z databáze v případě, že je formulář již odeslaný). Viz příklad.