Odesílání emailu s využitím latte template z Orchestrace

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

Zdravíčko,

snažím se odeslat email z Orchestrace (Fasady/Service vrstvy, chcete-li).

/**
 * Prepare email for use after registration
 * @param \Model\Orchestration\Model\Entity\User $user
 * @return \Nette\Mail\Message
 */
public function afterRegistration(\Model\Entity\User $user) {
    // Tady vygeneruji email pro nově zaregistrovaného uživatele
    $template = new \Nette\Templating\FileTemplate(EMAIL_TEMPLATES . '/registration.latte');
    $template->registerFilter(new \Nette\Latte\Engine());
    $template->registerHelperLoader('\Nette\Templating\Helpers::loader');
    $template->user = $user;

    $mail = new \Nette\Mail\Message();
    $mail->setFrom('Foo <hello@bar-baz.com>')
         ->addTo($user->email)
         ->setHtmlBody($template->render());
    return $mail;
}

jenže dostávám chybu Notice Undefined variable: _control problém je v tom, že používám v těle emailu makro link (když jej odstraním, vše je ok), takže nejspíš je potřeba nějakým způsobem předat FileTemplatingu i kolekci maker se kterými měl pracovat – jak na to?
Nebo se pletu a chyba vzniká jinak?

Editoval Mesiah (24. 12. 2013 16:54)

Mesiah
Člen | 240
+
0
-

Mesiah napsal(a):

Ok, tak už vím, že problém je že nemám nastavený presenter pro šablony, což mi říká tenhle post.

Otázka ale stále zůstává, jak odesíláte emaily?
To jako fakt všichni sestavujete email v presenteru? :O
Jako ani předávat presenter třídě MailOrchestration skrz setter mi nepříjde úplně košér a vytvářet uvnitř MailOrchestration DummyPresenter jen abych mohl vytvářet email s odkazy taky ne…
Proč jej vlastně tady potřebuji? Tady by mi teoreticky stačil jen router, ne?

David Matějka
Moderator | 6445
+
0
-

jo, jeden z (velkych) problemu v nette – linky se daji snadno vytvaret jen na presenteru/komponente

snadne reseni: injectni si application, z toho si vytahnes presenteru

slozite reseni (ale hezci): injectni si router, nekde si sezen referencni URL (v http modu url z http request, v cli si ji musis nejak vytvorit), vytvor si Nette\Application\Request a sestav si url

optimalizace predchoziho: vytvor si sluzbu (UrlGenerator treba), ktera bude linky vytvaret. muze to vypadat treba takhle (je to v podstate z metody presentercomponent v controlu – jen trochu osekany)

Editoval matej21 (25. 12. 2013 0:00)

Mesiah
Člen | 240
+
0
-

Díky za nápady!
Trošku mi vadí, že musím buď link sestavit v kódu nebo registrovat(instalovat) nové makro, aby bylo možné jej sestavit v šabloně, ale pořád je to lepší než mít odkaz natvrdo v template.
Prosím tě, ta služba na githubu je pod jakou licencí? V současnosti je to pro mě just enough řešení a nechci mi mít pocit, že jsem to ukradl…

David Matějka
Moderator | 6445
+
+1
-

novemu makru se muzes vyhnout, staci do sablony UrlGenerator poslat:

$template->urlGenerator = $this->urlGenerator;

a v sablone jen

<a href="{$urlGenerator->link('Homepage:default')}">

k licenci: jen jsem vypreparoval kus kodu z nette a udelal jsem z toho sluzbu. nevim, co by se tam v tomhle pripade melo psat za licenci.. jestli ti tam fakt chybi, tak ti tam muzu neco pripsat :)