Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/01/2012, 16h49   #1
Membre à l'essai
 
Inscription : août 2006
Messages : 30
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2006
Messages : 30
Points : 20
Points : 20
Par défaut 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 &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 :
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 :
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
Black Templar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 19h00   #2
Membre éclairé
 
Inscription : août 2007
Messages : 360
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 360
Points : 334
Points : 334
Bonjour,

As tu essayé de voir ce que contient ton controlleur :

Code :
1
2
 
sfContext::getInstance()->getController();
Je crois que le problème se situe ici, mais ce n'est qu'un hypothèse...

Cordialement,

Mathieu
mathieu44800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 14h41   #3
Membre à l'essai
 
Inscription : août 2006
Messages : 30
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2006
Messages : 30
Points : 20
Points : 20
En effet, c'est ici que se situe le problème.

sfContext::getInstance() marche correctement, m ais dès que je fais un getController(), ça bug... Par contre, je ne sais absolument pas ce que ça signifie, ni comment résoudre ou contourner le probème :/

EDIT : par contre, j'arrive à écrire ça :
Code :
sfContext::getInstance()->getController()->actionExists('mail', $action);
Là, il me dit que l'action existe bien !! :/ étrange étrange !
Black Templar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 14h55   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Quel est le symptôme ? Le message d'erreur ? Dans quel code il beug ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 11h11   #5
Membre à l'essai
 
Inscription : août 2006
Messages : 30
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2006
Messages : 30
Points : 20
Points : 20
Bonjour,

Citation:
Envoyé par Michel Rotta Voir le message
Quel est le symptôme ? Le message d'erreur ? Dans quel code il beug ?
  • Le symptôme : une page blanche, aucun code html généré (que ce soit en dev ou en prod)
  • Le message d'erreur : aucun (j'ai une page blanche en dev !!!)
  • Le bug à lieu lorsque je souhaite récupérer mon mot de passe via le plugin sfGuardUser (sfGuardForgotPassword) : lorsque je renseigne mon mail, que je clique sur le bouton de validation du formulaire, que le mail est présent en base de donnée et que j'essaye donc d'envoyer un mail avec la procédure à suivre... (plus précisement quand je fais un sfContext::getInstance()->getController()->getPresentationFor('mail', $action) )

Black Templar
Black Templar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 11h32   #6
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
Citation:
Envoyé par Black Templar Voir le message
  • Le message d'erreur : aucun (j'ai une page blanche en dev !!!)
Il ne faut pas que t'oublie que toutes les erreurs sont logué dans error.log d'apache, tu as donc forcément un message d'erreur.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 11h40   #7
Membre à l'essai
 
Inscription : août 2006
Messages : 30
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2006
Messages : 30
Points : 20
Points : 20
Citation:
Envoyé par kenny.kev Voir le message
Il ne faut pas que t'oublie que toutes les erreurs sont logué dans error.log d'apache, tu as donc forcément un message d'erreur.
Voila les logs de symfony (log/frontend_dev.log) a partir du moment où je valide le formulaire de récupération du mdp.

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
Jan 26 10:34:35 symfony [info] {sfPatternRouting} Connect sfRoute "sf_guard_signin" (/guard/login)
Jan 26 10:34:35 symfony [info] {sfPatternRouting} Connect sfRoute "sf_guard_signout" (/guard/logout)
Jan 26 10:34:35 symfony [info] {sfPatternRouting} Connect sfRoute "sf_guard_forgot_password" (/guard/forgot_password)
Jan 26 10:34:35 symfony [info] {sfPatternRouting} Connect sfDoctrineRoute "sf_guard_forgot_password_change" (/guard/forgot_password/:unique_key)
Jan 26 10:34:35 symfony [info] {sfPatternRouting} Match route "sf_guard_forgot_password" (/guard/forgot_password) for /guard/forgot_password with parameters array (  'module' => 'sfGuardForgotPassword',  'action' => 'index',)
Jan 26 10:34:35 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"
Jan 26 10:34:35 symfony [info] {sfFilterChain} Executing filter "sfGuardRememberMeFilter"
Jan 26 10:34:35 symfony [info] {sfFilterChain} Executing filter "sfExecutionFilter"
Jan 26 10:34:35 symfony [info] {sfGuardForgotPasswordActions} Call "sfGuardForgotPasswordActions->executeIndex()"
Jan 26 10:34:35 symfony [info] {Doctrine_Connection_Mysql} exec : SET NAMES 'UTF8' - ()
Jan 26 10:34:35 symfony [info] {Doctrine_Connection_Statement} execute : SELECT s.id AS s__id, s.email_address AS s__email_address, s.username AS s__username, s.algorithm AS s__algorithm, s.salt AS s__salt, s.password AS s__password, s.is_active AS s__is_active, s.is_super_admin AS s__is_super_admin, s.last_login AS s__last_login, s.created_at AS s__created_at, s.updated_at AS s__updated_at FROM sf_guard_user s WHERE (s.email_address = ?) - (ferdinand.piette@gmail.com)
Jan 26 10:34:35 symfony [info] {Doctrine_Connection_Statement} execute : DELETE FROM sf_guard_forgot_password WHERE (user_id = ?) - (1)
Jan 26 10:34:35 symfony [info] {Doctrine_Connection_Statement} execute : INSERT INTO sf_guard_forgot_password (user_id, unique_key, expires_at, created_at, updated_at) VALUES (?, ?, NOW(), ?, ?) - (1, 153ff29cf38d2ccf6388879d733f15b9, 2012-01-26 10:34:35, 2012-01-26 10:34:35)
Jan 26 10:34:36 symfony [info] {sfFrontWebController} Get presentation for action "mail/register" (view class: "")
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfGuardRememberMeFilter"
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfBasicSecurityFilter"
Jan 26 10:34:36 symfony [info] {sfBasicSecurityFilter} Action "mail/register" requires authentication, forwarding to "sfGuardAuth/signin"
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfRenderingFilter"
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfGuardRememberMeFilter"
Jan 26 10:34:36 symfony [info] {sfFilterChain} Executing filter "sfExecutionFilter"
Jan 26 10:34:36 symfony [info] {sfGuardAuthActions} Call "sfGuardAuthActions->executeSignin()"
Jan 26 10:34:36 symfony [info] {sfPHPView} Render "E:/Programmes/wamp/www/WeGuide/plugins/sfDoctrineGuardPlugin/modules/sfGuardAuth/templates/signinSuccess.php"
Jan 26 10:34:36 symfony [info] {sfPartialView} Render "E:/Programmes/wamp/www/WeGuide/plugins/sfDoctrineGuardPlugin/modules/sfGuardAuth/templates/_signin_form.php"
Jan 26 10:34:36 symfony [info] {sfPHPView} Decorate content with "E:\Programmes\wamp\www\WeGuide\apps\frontend\templates/layout.php"
Jan 26 10:34:36 symfony [info] {sfPHPView} Render "E:\Programmes\wamp\www\WeGuide\apps\frontend\templates/layout.php"
Jan 26 10:34:36 symfony [info] {main} Call "menubar->executeMenubar()"
Jan 26 10:34:36 symfony [info] {sfPartialView} Render "E:\Programmes\wamp\www\WeGuide\apps\frontend\modules/menubar/templates/_menubar.php"
Et voila l'erreur du log apache :
Code :
1
2
3
4
[Thu Jan 26 11:32:56 2012] [notice] Child 2976: Starting thread to listen on port 8080.
[Thu Jan 26 11:34:16 2012] [error] [client 127.0.0.1] Empty module and/or action after parsing the URL "/favicon.ico" (/).
[Thu Jan 26 11:34:17 2012] [error] [client 127.0.0.1] Empty module and/or action after parsing the URL "/favicon.ico" (/).
[Thu Jan 26 11:34:17 2012] [error] [client 127.0.0.1] Empty module and/or action after parsing the URL "/favicon.ico" (/).
Black Templar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 12h26   #8
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
tu es bien en dev ?
Et aussi que ton reporting_error avec E_ALL ?

Tu n'as pas fais de spécification dans le vhost sur les logs ?
C'est vraiment bizarre ne rien avoir...
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 13h56   #9
Membre à l'essai
 
Inscription : août 2006
Messages : 30
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : août 2006
Messages : 30
Points : 20
Points : 20
OMG ! je pense savoir pourquoi !
Je viens de lire cette ligne là dans les log symfony :
Code :
Jan 26 10:34:36 symfony [info] {sfBasicSecurityFilter} Action "mail/register" requires authentication, forwarding to "sfGuardAuth/signin"
J'ai protégé mon site si l'utilisateur n'est pas loggué et je ne pense pas avoir laissé le module mail en non sécurisé ...
Je vous dit quoi !

EDIT : problem solved ... ou comment perdre une semaine ... -_-
Merci à vous tous pour votre aide !
Black Templar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h31.


 
 
 
 
Partenaires

Hébergement Web