Předání template filter do latte e-mailu

- Rndoom04
- Člen | 75
Zdravím všechny programátory,
řeším něco, co je pro Vás otázka minuty, ale já si nevím rady. :)
Mám vytvořený filtr, který includuji do BasePresenter do startupu:
$this->template->addFilter('filtr', function ($var) {
/** Some magic **/
return $neco;
});
A e-mail odesílám takto:
$latte = new \Latte\Engine;
$params = [];
$mail = new Message;
$mail->setFrom($email_from)
->addTo($email)
->setHtmlBody($latte->renderToString(__DIR__.'/templates/components/emailTemplate/sablona.latte', $params));
$mailer = $this->createSMTPsession();
$mailer->send($mail);
A já za boha nevím, jak mohu zprovoznit ten filtr v té šabloně. :) Ano, mohu vytvořit nový filtr:
$latte->addFilter('filtr', function ($var) {
/** Some magic **/
return $neco;
});
Ale proč psát jeden filtr dvakrát? Určitě to nějako jde. Popostrčíte mě, prosím? :) Děkuji za rady. :)

- Rndoom04
- Člen | 75
F.Vesely napsal(a):
Ten filtr si musíš zaregistrovat do
LatteFactorya šablonu pro email vytvářet přesLatteFactory::create().
Ahoj, děkuji za odpověď. :)
Mohl bys mi to, prosím, víc přiblížit? Třeba nějakou ukázkou? :)
Dočasně jsem to vyřešil tak, že jsem si vytvořil funkci a ve filtru funkci volám. Pro e-mail template jsem vytvořil filtr přes $latte->addFilter a tam volám tu stejnou funkci. I tak mi to přijde trochu divný. :)

- Marek Bartoš
- Nette Blogger | 1313
@FVesely nejspíš myslí TemplateFactory, tu si vyžádáš z DI
/** @var \Nette\Bridges\ApplicationLatte\TemplateFactory $templateFactory **/
$template = $templateFactory->createTemplate();
$template->renderToString(__DIR__.'/templates/components/emailTemplate/sablona.latte', $params))

- F.Vesely
- Člen | 369
Zaregistrování nového filtru do LatteFactory přes neon
konfiguraci.
namespace App\Latte;
final class Filters
{
public static function foo(string $value): string
{
return $value;
}
}
services:
latte.latteFactory:
setup:
- addFilter('foo', [App\Latte\Filters, 'foo'])
A pak použij TemplateFactory::createTemplate, která ti
vytvoří Template a zaregistruje ti další Nette filtry, jak
psal @Mabar

- ic
- Člen | 431
@FVesely ok, nějak jsem to udělal podle https://github.com/…eFactory.php a vono to funguje ! :)
díky, teď se ještě musím podívat na to co to dělá, je to pro mě nějak moc magicné.

- F.Vesely
- Člen | 369
@ic Ta TemplateFactory je normalni sluzba, stejne jako
sluzby, co davas do configu do sekce services. Takze si ji do sve
sluzby predas pres konstruktor nebo do Presenteru pres konstruktor ci inject.
Pak zavolas metodu createTemplate.
Doufam, zes ten kod z Githubu na prasaka nezkopiroval nekam k sobe. :)

- Felix
- Nette Core | 1271
F.Vesely napsal(a):
Doufam, zes ten kod z Githubu na prasaka nezkopiroval nekam k sobe. :)
Ja doufam, ze jo. xD Je to prvni zminka timy projectu na foru. To si zaslouzi poradny copy+paste.

- Felix
- Nette Core | 1271
ic napsal(a):
FVesely napsal(a):
@FVesely ok, nějak jsem to udělal podle https://github.com/…eFactory.php a vono to funguje ! :)díky, teď se ještě musím podívat na to co to dělá, je to pro mě nějak moc magicné.
Hodim jsem radeji celou ukazku, kdyby to nekdo hledal.
namespace App\Model;
use Nette\Application\UI\Control;
use Nette\Application\UI\ITemplate;
use Nette\Bridges\ApplicationLatte\TemplateFactory as NetteTemplateFactory;
final class TemplateFactory extends NetteTemplateFactory
{
public function createTemplate(Control $control = null): ITemplate
{
$template = parent::createTemplate($control);
// pridat tagy/macra
// pridat filtry
return $template;
}
}
services:
# pokud chceme nahradit puvodni Nette implementaci
latte.templateFactory: App\Model\TemplateFactory
# pokud chceme nasi vlastni implementaci
appTemplateFactory:
class: App\Model\TemplateFactory
autowired: false