LogicException Filter ‚translate‘ is not defined v mailu

Petr Parolek
Člen | 455
+
0
-

Ahoj, postupuju podle doc https://doc.nette.org/cs/mail#… , ale řve na mě, že nezná filtr pro překlady LogicException Filter ‚translate‘ is not defined, did you mean ‚truncate‘?. Používám https://github.com/…/translation . Kde je prosím zrada?

Ukázku kodu: https://github.com/…tte-mail-bug

Tracy log: https://github.com/…bug/issues/1

David Grudl
Nette Core | 8218
+
0
-

(Jen poznámka: docku každý den měním, takže nemusí tam dnes být co tam bylo ještě včera).

Musíš přidat filtr. Viz třeba https://doc.nette.org/…on/templates#…

Petr Parolek
Člen | 455
+
0
-

@DavidGrudl díky za pomoc

<?php

declare(strict_types=1);

namespace App\Presenters;


use Latte\Engine;
use Nette\Localization\ITranslator;
use Nette\Mail\IMailer;
use Nette\Mail\Message;

final class HomepagePresenter extends BasePresenter
{

    /**
     * @var IMailer
     * @inject
     */
    public $mailer;

    /**
     * @var ITranslator
     * @inject
     */
    public $translator;

	public function renderDefault(): void
	{
        $latte = new Engine();

        $latte->addFilter('translate', [$this->translator, 'translate']);

        $params = [
            'orderId' => 123,
        ];

        $mail = new Message();
        $mail->setFrom('Franta <franta@example.com>')
            ->addTo('petr@example.com')
            ->setHtmlBody(
                $latte->renderToString(__DIR__ . '/templates/email.latte', $params)
            );

        bdump($mail);
        //$this->mailer->send($mail);
    }
}

email.latte

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Test</title>
</head>
<body>
<p>
    {var $text = 'mail.greating'}
    {$text|translate} {* funguje *}
    {_mail.greating} {* nefunguje *}
</p>
</body>
</html>

Jde kod ještě vylepšit, aby fungovalo oboje? Nebo bude stačit funkční pouze přes |translate. Nebylo by ještě lepší, aby se translator do latte v mailu registroval sám, jak to dělá šablona z presenteru? Potom pošlu PR do doc.

Petr Parolek
Člen | 455
+
0
-

Vyřešeno přes https://doc.nette.org/cs/mail#… nefunkční https://doc.nette.org/cs/mail#… . Bylo by fajn tento poznatek zapracovat do doc.

Editoval ppar (4. 8. 2020 13:56)

Petr Parolek
Člen | 455
+
0
-

Poslal jsem i PR do doc https://github.com/…ocs/pull/845 .

Petr Parolek
Člen | 455
+
0
-

Zapomněl jsem tu ještě poslat finální plně funkční řešení:

<?php

declare(strict_types=1);

namespace App\Services;

use Nette\Application\LinkGenerator;
use Nette\Application\UI\ITemplate;
use Nette\Application\UI\ITemplateFactory;
use Nette\Localization\ITranslator;
use Nette\Mail\IMailer;
use Nette\Mail\Message;
use PPIS\Settings\Entities\Settings;
use PPIS\Settings\Repositories\SettingsRepository;

class EmailSender
{

	/**
	 * @var LinkGenerator
	 */
	private $linkGenerator;

	/**
	 * @var IMailer
	 */
	private $mailer;

	/**
	 * @var ITemplateFactory
	 */
	private $templateFactory;

	/**
	 * @var ITranslator
	 */
	private $translator;

	public function __construct(LinkGenerator $linkGenerator, IMailer $mailer, ITemplateFactory $templateFactory, ITranslator $translator)
	{
		$this->linkGenerator = $linkGenerator;
		$this->mailer = $mailer;
		$this->templateFactory = $templateFactory;
		$this->translator = $translator;
	}


	public function send(): void
	{
		$params = [
			'orderId' => 123,
		];
		$template = $this->createMailTemplate();
		$html = $template->renderToString(__DIR__ . '/../templates/email.latte', $params);

		$mail = new Message();
		$mail->setFrom('Franta <franta@example.com>')
			->addTo('petr@example.com')
			->setHtmlBody($html);

		$this->mailer->send($mail);
	}

	private function createMailTemplate(): ITemplate
	{
		$template = $this->templateFactory->createTemplate();
		$template->getLatte()->addProvider('uiControl', $this->linkGenerator);
		return $template;
	}
}

Editoval ppar (4. 8. 2020 15:45)