[filetemplate] Nerendrovani sablon v mailu

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

Ahoj,

chtel bych odeslat html mail, generovani sablony pouzivam:

<?php
$template = new FileTemplate(APP_DIR . '/templates/mail/signin.phtml');
$template->link = $link;
$template->name = $name;
$template->title = 'Registrace: ' . Environment::getConfig('const')->project;
?>

Ale kdyz mi mail prijde, vyrazy {$link} zustanou nezmeneny. Pokud ale zavolem metodu render sablona mailu si mi nejakym zpusobem prida do hlavni sablony..

Jeste prilozim sablonu mailu:

		<div>
			Vážený uživateli,

			<p>Registrace účtu byla úspěšná.</p>
			<p>Prosím klikněte na níže uvedený odkaz: <a href="{$link}">aktivaci účtu</a></p>

			{$name}
		</div>

Jak teda sablonu vyrendrovat a jako retezec ji predat do setHtmlBody. Dekuji.

Nelibi se mi jeste jakym zpusobem nacitam sablonu, neda se to nejak zjednodusit?

Aurielle
Člen | 1281
+
0
-
$template->registerFilter(new Nette\Templates\LatteFilter);
neznalek
Člen | 60
+
0
-

Registrace filteru nic neudelala..

$template = new FileTemplate(APP_DIR . '/templates/mail/singin.phtml');
$template->registerFilter(new Nette\Templates\LatteFilter);
$template->link = $name;
$template->name = $title;
$template->title = 'Registrace: ' . Environment::getConfig('const')->project;

Zjistil jsem ze ani $template->render() nefunguje.. a vypise {$name} misto hodnoty promenne..

Editoval neznalek (1. 4. 2011 21:44)

newPOPE
Člen | 648
+
0
-

Zjednodusit, asi uz velmi nie ale skus (s tymto som problem nikdy nemal)

<?php
	$template = $this->getTemplate();  //pokial si v Presenteri
?>

ale mozno nieco ako

<?php
	$mail->setHtmlBody( (string) $template );	//mozno $template->__toString() bez pretypovania
?>
neznalek
Člen | 60
+
0
-

Hmm dekuji :) uz to funguje..

Ale chova se to divne setBody maily posila, ale pokud pouziji setHtmlBody email se neposle. Nevite proc?

Jeste bych rad v sablone vygeneroval odkaz na potvrzeni registrace, to delam pomoci: {link //confirm!, 'hash' => $hash}, hlasi mi to ze nezna link, ale pritom nacitam filter latte to musim jeste zvlast pridat helper?

Editoval neznalek (2. 4. 2011 1:16)

Aurielle
Člen | 1281
+
0
-

Musíš do proměnné $presenter (pro plink) a $control (pro link) předat instance presenteru/controlu, který se má použít pro generování odkazů.

Jakub Lédl
Člen | 55
+
0
-

Tyto proměnné se do šablony vloží automaticky, pokud ji vytvoříš metodou createTemplate:

<?php

  $template = $this->createTemplate();
  $template->setFile(...);
  $mail->setHtmlBody($template);

?>

Metoda je definovaná v Nette\Application\Control, čili ji můžeš použít jak v presenteru, tak v controlech.

Ad přetypování na string: Pokud předáš metodě setHtmlBody přímo objekt Nette\Templates\ITemplate, tak to taky funguje.

Editoval Jakub Lédl (2. 4. 2011 11:36)

neznalek
Člen | 60
+
0
-

Ja ale nejsem v presenteru ale v modelu..

Jakub Lédl
Člen | 55
+
0
-

V tom případě musíš šabloně předat presenter, jak píše gmvasek.

Jsi si jistý, že kód pro odesílání mailů patří do modelu? Nestálo by za to vyčlenit jej do nějaké mezivrstvy?

neznalek
Člen | 60
+
0
-

No myslim ze by tam mel byt, jedna se o registraci uzivatale a volam metodu signIn(...), kde se vsechno zpracuje i vygeneruje overovaci kod, ktery se posle mailem. Nebo napada ne nejake jine reseni? Cim myslis vrstvu?

Jakub Lédl
Člen | 55
+
0
-

https://doc.nette.org/…n/presenters

Jestli jsi to už četl, tak se velmi omlouvám. V podstatě by to mělo být takto:

Předpokládám, že registrační formulář (nějaký AppForm) vytváříš v presenteru. Tudíž máš v presenteru určitě také nějakou metodu jako registrationFormSubmitted, prostě něco, co obslouží odeslání formuláře. Při jednoduchém návrhu by v této metodě měla být většina logiky, čili by měla obstarávat vložení dat do databáze (přes model), vytvoření mailu a jeho odeslání.

Model by v tomto jednoduchém návrhu měl naopak pouze obstarávat vložení nového záznamu do databáze, maximálně tak generování ověřovacího kódu, který vrátí presenteru. Ve výsledku tedy:

<?php

// presenter
public function registrationFormSubmitted(AppForm $form) {
  $values = $form->getValues();

  // případná úprava dat, převzatých z formuláře

  $code = $usersModel->insert($values); // může vracet ověřovací kód, nebo jej vytvoří presenter

  $template = $this->createTemplate();

  // předám položky šabloně

  $mail = new Nette\Mail\Mail;
  $mail->setHtmlBody($template);
  $mail->send();

  $this->redirect('...'); // abychom dodrželi princip Post-Redirect-Get
}

?>

Editoval Jakub Lédl (2. 4. 2011 13:37)