Použití komponenty v šabloně emailu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Dismember
Člen | 50
+
0
-

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

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

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

@Lexi v 2.3 to fungovat nebude

Asi jak pise @Šaman, respektive $this->createTemplate(), ale komponenty nejsou pro toto urceny

vitkutny
Člen | 73
+
0
-

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

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
+
0
-
<?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
+
+1
-

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

@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!