Překlad pravidel formuláře s Kdyby Translation

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

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

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

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

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

Omlouvám se, na výhodu továrniček už jsem se ptal, jen mi šlo třeba o to, že dělám registrační form, který tam bude jen jednou a nechtělo se mi kvůli tomu psát továrničku :) Takže díky za rady

kleinpetr
Člen | 480
+
0
-

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

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

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

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.