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 : 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);
	    }
	}
 
?>
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 : 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);
}
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 : 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'));
  }
}
 
?>
Ici, le template 'registerSuccess'
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 &agrave; la b&ecirc;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&eacute;cente &agrave; la b&ecirc;ta du site. Vous pouvez d&egrave;s &agrave; pr&eacute;sent naviguer sur le site.<br />N'oubliez pas de nous faire vos retours, positifs comme n&eacute;gatifs sur le design, l'ergonomie, les fonctionnalit&eacute;s, etc.</p>
	<p style="padding: 7px 10px;margin:0;">L'&eacute;quipe de MonSite vous remercie de votre contribution.</p>
</div>
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
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;">
			&copy; <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 : Sélectionner tout - Visualiser dans une fenêtre à part
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