Zdravím, udělal jsem vlastní třídu MailMessenger.php využívající mj. Kdyby/Translation. Bohužel potřebuji odesílat email z CZ aminu i do jiných jazyků, a tedy změnit před zavoláním setLocale na konkrétní jazyk za běhu (a pak zpět). Bez volání setLocale všechno šlape parádně.

Ale ve chvíli, kdy nastavím setLocale se email sice pošle, je i správně přeložen, ale stránka skončí s Fatal Error: Maximum function nesting level of ‘100’ reached, aborting! A tak si říkám, jestli není někde nějaká chybka.

>> stránka s chybovou hláškou a kompletní sandbox problému – všechny potřebné zdrojové skripty včetně MailMessgeru – stačí composer update a mělo by jet (testováno na Win64/EasyPhp/PHP 5.5.8 , nejnovější stabilní Kdyby/Translation i Nette)

http://leteckaposta.cz/954629066

>> inkriminovaný kus v lostPasswordPresenter – v kódu komentář s TODO

        ....
$this->trs->setLocale(NULL); // kdyz tam toto nedam, neskonci to fatall error
$this->trs->setLocale('en'); // kdyz tam toto nedam, neskonci to fatall error
    $message = new MailMessenger(
        'test@necneco.cz',
        'Test',
        $email,
        $this->trs->translate('messages.emails.lostPassword.subject'),
        'lostPassword.latte',
        $this->trs,
        $data
    );
    $message->sendMail();
    $this->flashMessage($this->trs->translate('messages.lostPasswordPage.success'));

Předem děkuji za odpovědi

Ahoj, v Kdyby/Translation byla chyba a díky tvému sandboxu jsem ji našel a opravil, díky!

Zkus si nainstalovat nejnovější translator

"kdyby/translation": "~2.2@dev"

a dej vědět, kdyby to pořád ještě zlobilo.


Za odměnu ti poradím pár věcí, co jsi v té ukázce měl špatně :)

Většina toho co máš v BasePresenter, tak vůbec není potřeba, stačí ti

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /** @persistent */
    public $locale;

    /** @var \Kdyby\Translation\Translator @inject */
    public $trs;

}

a tohle z configu taky můžeš vyhodit, protože to extension od nette 2.2 dělá automaticky

latte:
    macros:
        - Kdyby\Translation\Latte\TranslateMacros::install

Co se týče MailMessenger, tak lepší je injectnout si Nette\Bridges\ApplicationLatte\ILatteFactory a použít ho na vytvoření Latte\Engine, protože v něm budeš translator i makro mít už z DI Containeru připravené.

Volat renderDefault ve startup nemá žádný smysl.

Nastavovat translator formuláři, abys mu pak stejně všechny titulky předal přeložené není moc praktické.

Velevřelé díky. I za opravu, i za poznámky.

Jen u předposlední poznámky mi to nějak ne a ne injectnout se ( Call to a member function create() on a non-object). Ale to asi bude tím, že jsem spíše začátečník :) (obejití: @inject v presenteru → konstuktor MailMessenger )

/** @var \Nette\Bridges\ApplicationLatte\ILatteFactory */
protected $latteFactory;
public function injectILatteFactory(\Nette\Bridges\ApplicationLatte\ILatteFactory $latteFactory) {
    $this->$latteFactory = $latteFactory;
}

private function prepareMail() {
    // ..
    $latte = $this->latteFactory->create();
    // ..
}
  • Comments:

  • To bude nejspíš tím že se nepíše $this->$latteFactory ale $this->latteFactory, ne?

    by Filip Procházka at 15.7.2015 13:54
  • No, ten překlep jsem udělal až tady. Ale to nevadí, jeden parametr z presenteru navíc nezabije. Stejně tam posílám i presenter zase kvůli makrům {link} a {plink} :)

    by Petr Fořt at 15.7.2015 23:53

You must first log in to participate in this discussion