Problème avec getPresentationFor depuis un plugin
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.
Code:
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);
}
}
?> |
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.
Par exemple :
Code:
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);
} |
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'
Voici donc le contrôleur du module 'mail'
Code:
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'));
}
}
?> |
Ici, le template 'registerSuccess'
Code:
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> |
Et enfin, le 'layout_mail' qui encapsule le template register
Code:
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> |
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.
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 :
Code:
sfContext::getInstance()->getController()->getPresentationFor('mail', $action)
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.
Avez-vous une idée de où cela peut bien venir ?
Black Templar