Email jako \Nette\Application\UI\Control?

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

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

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

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.

enumag
Člen | 2118
+
0
-

Na vizuální kontrolu bych si spíše napsal debug panel (možná již existuje) a IMailer nebo aspekt který by místo odesílání ty zprávy vypisoval do toho debug panelu.

Aha, nevšiml jsem si že user je pole a ne Nette\Security\User. Moje chyba.

Myiyk
Člen | 321
+
0
-

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.

enumag
Člen | 2118
+
0
-

@Myiyk: Cool, ještě kdyby to tak mělo composer package a kompatibilitu s Nette 2.1, že ano. :-P

romiix.org
Člen | 343
+
0
-

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

Já ho kdysi zkoušel používat ale musel se upravit aby fungoval ale i tak ten email vypadl jinak než ve skutečnosti …