Bonjour à tous.
J'ai un petit soucis avec la méthode GetPresentationFor() qui sert à retourner la réponse d'une action.
J'aimerais envoyer des emails html quand certains évènements se produisent. Pour cela, j'ai créé une classe Mailer hérité de Swift_Message. Cette classe permet de renseigner automatiquement le sujet, de créer le rendu avec GetPresentationFor, etc.
Pour envoyer un mail, je n'ai donc qu'a créer un objet Mailer et à appeler la méthode sendMessage dans une action quelconque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 <?php class Mailer extends Swift_Message { static public function getMailSubject($action) { $subject = array(); $subject['register'] = "Bienvenue !"; $subject['forgotPassword'] = "Oubli de mot de passe"; if(isset($subject[$action])) return $subject[$action]; else return 'MonSite'; } public function sendMessage($to, $action, $param) { foreach($param as $key => $value) sfContext::getInstance()->getRequest()->setParameter($key, $value); $this->setFrom(sfConfig::get('app_mailer_from'), sfConfig::get('app_mailer_name')); $this->setTo($to); $this->setSubject(Mailer::getMailSubject($action)); $this->setContentType("text/html"); $this->setBody(sfContext::getInstance()->getController()->getPresentationFor('mail', $action)); //On envoi du mail //sfContext::getInstance()->getMailer()->send($this); } } ?>
Par exemple :
La classe Mailer va donc automatiquement envoyer un email à 'mail@host.com'. Le contenu de ce mail sera la réponse de l'action 'register' du module 'mail'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public function executeIndex($request) { $param = array('id' => 1); //On envoi le mail $mail = new Mailer(); $mail->sendMessage('email@host.com', 'register', $param); }
Voici donc le contrôleur du module 'mail'
Ici, le template 'registerSuccess'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?php class mailActions extends sfActions { public function preExecute() { $this->setLayout('layout_mail'); } public function executeRegister(sfWebRequest $request) { $this->user = Doctrine::getTable('User')->find($request->getParameter('id')); } } ?>
Et enfin, le 'layout_mail' qui encapsule le template register
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6<div style="margin: 0;"> <h2 style="font-size: 12px;background-color: #F6F6F6;border-top: 1px solid #E1E1E1;padding: 5px;margin: 0;color:#000!important;">Inscription à la bêta de MonSite</h2> <p style="padding: 7px 10px;margin:0;">Bonjour <?php echo $user->getName(); ?> et bienvenue sur MonSite !</p> <p style="padding: 7px 10px;margin:0;">Ce mail vous confirme votre inscription récente à la bêta du site. Vous pouvez dès à présent naviguer sur le site.<br />N'oubliez pas de nous faire vos retours, positifs comme négatifs sur le design, l'ergonomie, les fonctionnalités, etc.</p> <p style="padding: 7px 10px;margin:0;">L'équipe de MonSite vous remercie de votre contribution.</p> </div>
L'avantage de ce système est qu'il permet (entre autre) de mettre un décorateur 'layout_mail' commun à tous mes email. ça marche bien lorsque je veux envoyer le mail à partir de n'importe quelle action de mon application.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//FR" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>WeGuide:</title> <style type="text/css"> .ExternalClass {width:100%;} .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div { line-height: 100%;} </style> </head> <body style="-webkit-text-size-adjust:none;-ms-text-size-adjust:none;margin: 0;padding: 0;font: 12px Verdana;"> <div id="mail_wrapper" style="border: 1px solid #E1E1E1;"> <div style="height: 97px;padding:10px;margin: 10px;"> <img src="http://127.0.0.1:8080/images/logo.png" alt="MonSite" style="margin:0;padding:0;height: 97px;display:inline;vertical-align:middle;" /> <h1 style="font-family: Calibri, Arial, Verdana;font-weight: normal;font-size: 50px;margin: 0 25px;color:#333;height: 97px;display:inline;vertical-align:middle;">MonSite</h1> </div> <div> <?php echo $sf_content ?> </div> <div style="border-top: 1px solid #E1E1E1;background-color: #F6F6F6;padding: 3px 0;text-align: center;"> © <a href="http://monsite.fr" style="color: #585;"><b>MonSite</b></a> - 2011 </div> </div> </body> </html>
Le problème, c'est que lorsque j’envoie le mail à partir d'une action d'un plugin (sfGuardForgotPassword), il me met une page blanche (même en frontend_dev).
Après avoir débuggué manuellement, je me rend compte que ça plante au setBody de la méthode sendMessage de la classe Mailer à cause de ce bout de code :
Je ne comprend absolument pas pourquoi il n'arrive pas à exécuter cette méthode getPresentationFor à partir du plugin... Pourtant, je suis bien dans l'application frontend... il ne devrait pas y avoir de problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sfContext::getInstance()->getController()->getPresentationFor('mail', $action)
Avez-vous une idée de où cela peut bien venir ?
Black Templar
Partager