Email jako \Nette\Application\UI\Control?
- Tomáš Jablonický
- Člen | 115
Ahoj,
je správná cesta využít \Nette\Application\UI\Control jako předka pro šablonu emailu a pak jen přidat metodu send pro odeslání komponenty jako email s vlastním layoutem?
Příklad:
*Exituje BaseEmail
*Existuje interface IEmail
BaseEmail
<?php
namespace App\Email;
use App\Model\Factory\IMessage;
use Nette\Application\UI\Control;
use Nette\Mail\IMailer;
use Nette\Mail\Message;
abstract class BaseEmail extends Control
{
/** @var IMailer $mailer */
protected $mailer;
/** @var Message $message */
protected $message;
/**
* @param \Nette\Application\Application $application
*/
final public function __construct(\Nette\Application\Application $application)
{
$this->setParent($application->getPresenter());
}
/**
* @param IMessage $messageFactory
*/
public function injectMessageFactory(IMessage $messageFactory)
{
$this->message = $messageFactory->create();
}
/**
* @param IMailer $mailer
*/
public function injectMailer(IMailer $mailer)
{
$this->mailer = $mailer;
}
/**
* @param $email
* @param null $name
*/
public function addTo($email, $name=NULL)
{
$this->message->addTo($email, $name);
}
/**
* @param $email
* @param null $name
*/
public function setFrom($email, $name=NULL)
{
$this->message->setFrom($email, $name);
}
/**
* Provede odeslani emailu
*/
protected function execute()
{
$this->mailer->send($this->message);
}
}
?>
IEmail
<?php
namespace App\Email;
interface IEmail
{
function send();
}
?>
A control pro šablonu emailu:
<?php
namespace App\Email\User;
use App\Email\BaseEmail;
use App\Email\IEmail;
class SignUp extends BaseEmail implements IEmail
{
/** @var array $user */
protected $user;
/**
* Nastaveni uzivatele
* @param array $user
* @return SignUp
*/
public function setUser(array $user)
{
$this->user = $user;
return $this;
}
/**
* Odesle email
*/
public function send()
{
$template = parent::createTemplate();
$template->setFile(__DIR__ . '/email.latte');
$template->userEntity = \Nette\ArrayHash::from($this->user);
$this->message->addTo($this->user['user']['s_email'])
->setHtmlBody($template)
->setSubject('Dokončení registrace');
$this->execute();
}
}
?>
- enumag
- Člen | 2118
E-mail nevykresluješ přímo do prohlížeče, nemá to nic společného s ajaxem ani nepotřbeuješ nic dalšího co ti poskytuje Control. Jediné kvůli čemu to dědíš je metoda createTemplate která tak jako tak v třídě Control nemá moc co dělat (imho) a měla by být v samostatné třídě. Raději bych tedy kód této metody zkopíroval a upravil než dědit Control.
Dále ani nevidím důvod k vytváření nějakých IEmail a BaseEmail. Do té třídy SignUp si prostě injectni User a IMailer (případně ještě samostatnou TemplateFactory), metoda send bude vypadat asi takhle:
/**
* Odesle email
*/
public function send()
{
$template = new \Nette\Templating\FileTemplate(); // nebo $this->templateFactory->create();
$template->setFile(__DIR__ . '/email.latte');
$template->userEntity = \Nette\ArrayHash::from($this->user);
$message = new \Nette\Mail\Message();
$message->addTo($this->user['user']['s_email'])
->setHtmlBody($template)
->setSubject('Dokončení registrace');
$this->mailer->send($message);
}
Editoval enumag (12. 11. 2013 15:40)
- Tomáš Jablonický
- Člen | 115
Proč to takto používám bylo právě to usnadnění ohledně vytváření šablony a předání všech maker ještě mě napadlo, že bych si mohl dodatečně vyrenderovat tu šablonu pro email a zkontrolovat ji vizuálně bez nutnosti odeslání.
IEmail jsem tam dal jen proto, abych nezapoměl vložit metodu send() ale asi je to pravda, že je to zbytečná věc navíc.
Nechápu proč bych si měl injectnout User … myslíš tím \Nette\Secured\User ? to tam vůbec nepotřebuji jen nastavuji přes setter array uživatele, který se zrovna registroval.
- Myiyk
- Člen | 321
enumag:
Přesně to co popisuješ již existuje v doplňcích, https://componette.org/search/?….
Ještě jsem to nezkoušel, ale vypadá to dobře.
- romiix.org
- Člen | 343
Doplnok MailPanel síce vyzerá super, ale nefunguje (alebo pred nejakým časom nefungoval) plne korektne. Snažil som sa ho nasadiť, ale po čase som od toho ustúpil. Nepamätám si detaily, ale tusím mi to nejak zahadzovalo flashMessages a nepodarilo sa mi kvôli časovému presu zistiť kde je problém.
- Tomáš Jablonický
- Člen | 115
Já ho kdysi zkoušel používat ale musel se upravit aby fungoval ale i tak ten email vypadl jinak než ve skutečnosti …