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

Rndoom04
Člen | 75
+
+1
-

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. :)

F.Vesely
Člen | 369
+
0
-

Ten filtr si musíš zaregistrovat do LatteFactory a šablonu pro email vytvářet přes LatteFactory::create().

Rndoom04
Člen | 75
+
0
-

F.Vesely napsal(a):

Ten filtr si musíš zaregistrovat do LatteFactory a šablonu pro email vytvářet přes LatteFactory::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 | 1274
+
0
-

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

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

Rndoom04
Člen | 75
+
+1
-

Super, běhá… Děkuji všem za pomoc! :)

ic
Člen | 430
+
0
-

Jestli se mohu se přidat s podobný dotazem…

Totiž potřeboval bych v emailové šabloně standardní tagy (bývalé makra) a výchozí filtry. Dá se to nějak zařídit?

Při hledání na fóru nacházím jen mnoho let staré postupy, které už nějak nefungují :(

F.Vesely
Člen | 369
+
+2
-

Ano, pouzij TemplateFactory, ktera vsechny defaultni makra a filtry do Latte zaregistruje.

ic
Člen | 430
+
0
-

@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
+
+1
-

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

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.

F.Vesely
Člen | 369
+
0
-

@Felix Ouu, sakra, neklikal jsem na odkaz a predpokladal jsem, ze je to odkaz na nette/application. Timy projectu a jeho tvurcum se samozrejme omlouvam. :)

Felix
Nette Core | 1245
+
+1
-

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