Použití komponenty v šabloně emailu
- Dismember
- Člen | 50
Ahoj,
vytvořil jsem objednávkový formulář, kde mám použitých několik komponent pro výpis detailů uživatele a objednaných služeb. Na konci procesu chci zákazníkovi zaslat emailem ten stejný souhrn, který vidí na konci objednávkového procesu a na který mám připravené komponenty, které si najdou všechna potřebá data jen podle id objednávky.
Jenže latte mi hlásí:
Latte\CompileException
Unknown macro {control} in …/email/email_orderOverview.latte:9
Email:
<?php
public function emailOrderOverview($orderId) {
$latte = new \Latte\Engine;
//$order = $this->orderRepository->findById($orderId)->fetch();
$this->orderId = $orderId;
$email = "karel@drogy.nebere"
$message = new Message;
$message->addTo($email)
->setFrom('<noreply@company.cz>')
->setSubject('company - order overview')
->setHtmlBody($latte->renderToString(__DIR__ . '/../presenters/templates/components/email/email_orderOverview.latte'));
$this->mailer->send($message);
}
?>
V šabloně emailu jsem použil makro
<?php
{control customerInfo}
?>
Komponenta:
<?php
public function createComponentCustomerInfo() {
$control = new \App\Components\OrderCustomerInfo($this->orderId, $this->orderRepository);
return $control;
}
?>
Jsem schopen do šablony pro email dostat komponentu?
Díky
- Šaman
- Člen | 2659
Jestli to máš v presenteru (nebo v komponentě), tak můžeš
použít:
$latte = clone $this->template;
$latte = $this->createTemplate();
Mimo presentery a komponenty ti asi používat komponenty nepůjdou(?) protože pro použití komponenty musí být tato připojena do stromu komponent, který má jako kořen presenter.
(?) pokud vím
Editoval Šaman (10. 1. 2016 17:07)
- Jan Mikeš
- Člen | 771
Napada me workaround
$latte->customerInfo = new \App\Components\OrderCustomerInfo($this->orderId, $this->orderRepository);
A v sablone pak zkus {control $customerInfo}
a nebo
{$customerInfo->render()}
Nejakou dobu dozadu jsem to takhle pouzival v emailech a fungovalo mi to.
Neni to samozrejme plnohodnotna komponenta, takze ti ASI nebudou fungovat persistentni parametry, signaly atd.. ale komponenta by se mela vykreslit spravne.
Editoval Lexi (10. 1. 2016 14:49)
- David Matějka
- Moderator | 6445
@Lexi v 2.3 to fungovat nebude
Asi jak pise @Šaman, respektive
$this->createTemplate()
, ale komponenty nejsou pro
toto urceny
- vitkutny
- Člen | 73
problém je že vytváříš Latte\Engine přes new a macro control tam neregistruješ (https://github.com/…UIMacros.php#L28), vytvoř šablonu přes továrničku (https://api.nette.org/…ory.php.html#49) a jako parametr $control použij komponentu/presenter ve kterém se nachází komponenta customerInfo
- Dismember
- Člen | 50
Díky za odpovědi pánové…Jen to nefunguje.
Mám to právě mimo presenter v modelu, který se stará o zasílání emailu (třída Nette\Object).
Zkusil jsem si do funkce pro odeslání emailu přímo poslat vytvořenou komponentu
<?php
class OrderPresenter extends BasePresenter {
...
$this->email->emailOrderOverview(new \App\Components\OrderCustomerInfo($this->orderId,$this->orderRepository));
?>
a v template emailu dát {$customerInfo->render()}
ale dostávám chybku
Nette\InvalidStateException
Component '' is not attached to
‚Nette\Application\UI\Presenter‘
A ta nastane při hledání template pro tu komponentu:
<?php
class OrderCustomerInfo extends Nette\Application\UI\Control {
..
public function render() {
$this->template->setFile(__DIR__ . '/orderCustomerInfo.latte');
?>
- Martk
- Člen | 661
<?php
class OrderPresenter extends BasePresenter {
protected function createComponentOrderCustomerInfo() {
return new \App\Components\OrderCustomerInfo($this->orderId,$this->orderRepository);
}
...
$this->email->emailOrderOverview($this['orderCustomerInfo']);
?>
Editoval Antik (10. 1. 2016 16:24)
- Šaman
- Člen | 2659
Komponenty vytvářej vždy pomocí továrničky. Komponenta ke svému životu potřebuje presenter (aby mohla třeba příjímat signály apod.) a továrnička zajistí právě to připojení k presenteru.
Otázkou je, jestli opravdu potřebuješ plnohodnotnou komponnetu? Nestačil by nějaký prostý objekt? Modelová třída?
- Dismember
- Člen | 50
@Antik super! Takto to funguje :-)
@Šaman jj, s tím prezenterem jsem to chápal, jen jsem nevěděl,
jak ho tam dostat. A tak jak to napsal @Antik to funguje.
No já tu komponentu používám při zobrazení souhrnu na konci objednávky,
tak je vhodné, aby to stejné zákazník dostal i na email a já nemusel ty
dotazy na zákazníka, objednávku a produkt tahat znovu, ale použil jsem to
stejné, co se zrovna zobrazuje.
Takže problem solved :-) Díky moc!