IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Problème avec getPresentationFor depuis un plugin [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 40
    Points
    40
    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 : 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

  2. #2
    Membre averti
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Points : 396
    Points
    396
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sfContext::getInstance()->getController();
    Je crois que le problème se situe ici, mais ce n'est qu'un hypothèse...

    Cordialement,

    Mathieu

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    sfContext::getInstance()->getController()->actionExists('mail', $action);
    Là, il me dit que l'action existe bien !! :/ étrange étrange !

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    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 !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    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

  6. #6
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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" (/).

  8. #8
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    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...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2006
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    OMG ! je pense savoir pourquoi !
    Je viens de lire cette ligne là dans les log symfony :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GIMP] Problème avec brosse depuis v. 2.8.2
    Par Jon Shannow dans le forum Multimédia
    Réponses: 2
    Dernier message: 12/03/2013, 10h14
  2. Problème avec Windows depuis installation de Linux
    Par maoui05 dans le forum Windows Vista
    Réponses: 1
    Dernier message: 03/06/2010, 19h24
  3. Réponses: 10
    Dernier message: 16/11/2009, 15h14
  4. [PDO] Problème avec PDO depuis migration
    Par XData dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 23/07/2009, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo