LogicException Filter ‚translate‘ is not defined v mailu
- Petr Parolek
- Člen | 455
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
(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
@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
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
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)