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
LatteFactory
a š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 | 1274
@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 | 430
@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 | 1245
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 | 1245
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