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 :

Champ message d'un formulaire tronqué lors de l'envoi de mail [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 21
    Points
    21
    Par défaut Champ message d'un formulaire tronqué lors de l'envoi de mail
    Bien le bonjour,

    Je viens chercher de l'aide auprès de vous. (mes recherches sur le net concernant mon problème étant infructueuse).

    Je suis actuellement en fin de stage en développement web. Je dois migrer un site déjà existant sous Symfony 1.4 et je rencontre un soucis au niveau de mon envoie de mail.

    On va dire que tout fonctionne car le mail est bien envoyé, il est bien reçu également avec les bons champs, sauf que le corps du message ne contient que la première ligne. A partir du moment où je fais un retour à la ligne, le reste n'est pas transmis.. Il me faut donc trouver un moyen pour que la variable contenant le message retienne tout le champ et non juste la première ligne, et c'est la que je coince :s

    Voici quelques morceaux de mon code pour tenter de vous éclairer

    Mon formulaire est créé(voici les widgets de mon formulaire, je vous épargne tout le reste ^^)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $this->setWidgets(array(
      'pseudo'      => new sfWidgetFormInputText(array('default' => 'Pseudo'), array('onclick' => 'this.value = "";')),
      'email'       => new sfWidgetFormInputText(array('default' => 'Email'), array('class' => 'email','onclick' => 'this.value = "";')),
      'desti'       => new sfWidgetFormSelect(array('choices' => self::$destinataire)),
      'sujet'       => new sfWidgetFormInputText(array('default' => 'Titre'), array('onclick' => 'this.value = "";')),
      'message'     => new sfWidgetFormTextarea(array(), array('size' => '20x5')),
    ));

    Voici le code envoyant le mail présent dans mon contrôleur (le formulaire est appelé dans l'action index, qui envoie le résultat s'il est passé par POST à l'action d'envoie contenant ce code)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $email = $this->getMailer()->compose(
      array($request->getParameter('email') => $request->getParameter('pseudo')),
      $request->getParameter('desti'),
      $request->getParameter('sujet'),
      $request->getParameter('message')
    );
     
    $this->getMailer()->send($email);
    Et la partie vue contenant l'appel de mon formulaire (c'est la vue de l'action index, où le formulaire est appelé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form action="<?php echo url_for('contact/index') ?>" method="POST">
     <table>
       <?php echo $formulaire ?>
       <tr>
        <td colspan="2">
        <input type="submit" />
        </td>
       </tr>
      </table>
    </form>
    Lors de mes recherches, j'avais vu cette fonction PHP nl2br() qui insère un retour à la ligne HTML à chaque nouvelle ligne. Mais je ne vois pas vraiment comment l'appliquer sur le champ d'un formulaire :/ (et je suis pas sur que ca résoudra mon problème :p)

    J'ai continué de mon côté pour tenter de trouver d'où ca peut venir, et j'ai peut-être trouver le soucis. Je m'explique :

    Quand je regarde dans la debug toolbar de Symfony, dans config/request au moment où je me rends sur la page contact, j'ai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parameterHolder:
      action: index
      module: contact
    Ce qui est normal, car pour le moment n'est rien envoyé.

    Une fois que je remplis mon formulaire et que je l'envoie en POST (il renvoit vers l'action index et son controleur vérifie si les informations viennent de la méthode POST, et si oui, il valide le formulaire). Et voici ce que ca donne une fois le formulaire envoyé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    parameterHolder:
      action: index
      contact:
        pseudo: 'Mon pseudo test'
        email: <une adresse mail>
        desti: <une adresse mail>
        sujet: 'Mon sujet test'
        message: "Mon message test,\r\nbonjour\r\nblabla\r\nmerci"
        _csrf_token: 7150b60b8374600f3e2545379ba5670f }
      module: contact
    Donc l'envoie du formulaire contient bien toutes les informations. Une fois qu'il est validé, il est envoyé vers la seconde action qui envoit le mail et qui affiche un récapitulatif des informations envoyées, mais voici ce qu'il ressort de la debug toolbar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    parameterHolder:
      action: merci
      desti: <une adresse mail>
      email: <une adresse mail>
      message: 'Mon message test,'
      module: contact
      pseudo: 'Mon pseudo test'
      sujet: 'Mon sujet test'
    Tout est envoyé correctement sauf pour le champ "message". Il semblerait donc que le \r soit ce qui pose problème..

    Je suppose que Symfony ne doit pas accepter qu'il y ait de \ qui se balade dans les champs(d'ailleurs, si je me trompe pas, il y a les protections XSS de Symfony qui sont en action, peut-être pour ca que tout ce qui est après le \ soit supprimé?)

    Je ne sais pas si je suis sur la bonne piste, mais ca me semblerait logique. Si quelqu'un a une idée pour résoudre ce problème, je suis prenneur ^^


    Bonne fin de journée

    Thony alias l'Hardy

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    pourquoi n'utilises tu pas des balises html <br />?
    EDIT: après petite recherche je vois que c'est seulement si on spécifie que le mail est au format html qu'on peut utiliser la mise en forme html, je vais voir si je trouve d'autres pistes (j'ai jamais eu ce soucis mais je suis un des rares utilisateurs de ce forum :p essaye aussi \\n)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    C'est un formulaire de contact. Donc la personne indique son pseudo, son adresse mail et son message.

    Ce n'est pas moi qui rédige le message qui sera envoyé. Je ne fais que le récupérer via le formulaire qui, s'il est valide, envoie le mail avec les données saisies dans les champs.

    Je ne vois pas trop comment mettre des <br> dans le message à la place de la personne :/

    EDIT : Merci quand même d'essayer de m'aider, mais je sèche entièrement ^^ Je ne vois toujours pas comment mettre des <br> ou des \n pour les retour à la ligne d'un message que je ne rédige pas ^^

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    j'ai une remarque de bonne pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'pseudo'      => new sfWidgetFormInputText(array('default' => 'Pseudo'), array('onclick' => 'this.value = "";')),
    Il vaut mieux éviter de mettre du javascript dans les form.php, c'est chiant a débuguer si ton code javascript ce balade a plusieurs endroit


    alors, ca fait longtemps que j'ai pas utiliser de textarea mais quand l'utilisateur fait un retour a la ligne ca le stock avec les \n\l (a vérifier).
    ducoup nl2br (comprendre: \n\l to <br/> ) permet lors de la transmission de la variable, de remplacer les retour a la ligne par des retours html.
    Ducoup meme si l'utilisateur a juste appuyé sur entré, on peut avoir les <br />.
    Il me semble que la pluspart des mails sont envoyés en html pour les avantages de mise en forme

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    Je t'ai écouté pour la règle de bonne pratique, j'ai enlevé ce qui faisait appel aux javascript de mon formulaire.

    Concernant \n \l qui apparaissent dans le corps du message lors d'un retour à la ligne, je suis au courant et c'est justement ca qui me pose problème :/

    D'ailleurs, comme je l'ai cité, avec l'analyse de la debug toolbar qui m'indique ce qui est passé dans la requête, on voit bien que le paramètre 'message' a comme valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      message: "Mon message test,\r\nbonjour\r\nblabla\r\nmerci"
    lorsque le formulaire est envoyé. Mais qu'une fois qu'il est validé pour être envoyé par mail, il passe à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      message: 'Mon message test,'
    Donc c'est les \ qui pose problème, d'où ma recherche m'ayant amené à la fonction nl2br pour remplacer ces \r et \n avec des <br>. Mais comme je l'ai dit, mon soucis, c'est que je vois pas où je peux faire appel à cette fonction pour l'appliquer aux données du champ 'message'.

    Pour te montrer, voici mon controleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function executeIndex($request)
    {
    	$this->formulaire = new ContactForm();
     
    	if ($request->isMethod('post'))
    	{
    		$this->formulaire->bind($request->getParameter('contact'));
    		if ($this->formulaire->isValid())
    		{
    			$this->redirect('contact/merci?'.http_build_query($this->formulaire->getValues()));
    		}
    	}
    }
    Donc lors de l'appel de l'action index, il crée le formulaire. Si le visiteur appuye sur la soumission, le formulaire est renvoyée à cette même action et teste si le formulaire est passé en POST, si oui il le valide et renvoie vers l'action "merci" avec les valeurs en paramètre

    Donc comme tu peux le voir, je vois pas trop où je peux travailler sur le champ. J'avais essayé d'envoyer directement le mail dans la partie de code avant le $this->redirect, mais quand je fais ca, j'ai une exeption de swift mailer qui me dit que le champ pseudo n'est pas une adresse mail

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    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
    public function executeIndex($request)
    {
    	$this->formulaire = new ContactForm();
     
    	if ($request->isMethod('post'))
    	{
                    $values = $request->getParameter('contact');
                    $values['content'] = nl2br($values['content']);
    		$this->formulaire->bind($values);
    		if ($this->formulaire->isValid()
    		{
    			$this->redirect('contact/merci?'.http_build_query($this->formulaire->getValues()));
    		}
    	}
    }

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 13
    Points : 21
    Points
    21
    Par défaut
    T'es un chef !

    J'ai suivi ta solution, ca m'a quand même posé un petit soucis car en fait, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->redirect('contact/merci?'.http_build_query($this->formulaire->getValues()));
    empechait le module de fonctionner correctement. La fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http_build_query($this->formulaire->getValues()))
    crée l'URL de redirection avec dans l'URL tous les champs et leur valeur. Du coup, avec le nl1br, des tag HTML (les <br>) apparaissent dans l'URL et la redirection n'était pas possible.

    Du coup, j'ai agit autrement tout en suivant ta logique. Au lieu de faire la partie envoie de mail dans l'action "merci", je l'ai directement fait dans l'action "index" une fois que les données sont validées.

    Ca permet d'avoir le message en entier, sans devoir utiliser la fonction nl2br() et de plus, vu que le mail se fait sur l'action index suivi d'une redirection immédiate vers l'action "merci", si la personne actualise la page "merci", il n'y aura pas de renvoi de mail (alors qu'avant, si on actualisait la page 10 fois, ca envoyait 10 mails) et si on actualise la page avec l'action "index", il n'y aura pas d'envoie de mail car il faut que les infos soient passées en POST avec le bouton submit du formulaire pour que l'envoie soit fait.


    Je remets ma solution complète pour les gens qui auraient eu le même soucis. (comme ca ils auront toute la solution complète ^^)

    Pour commencer, dans le dossier /lib/form, j'ai un formulaire nommé ContactForm.class.php :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php 
     
    class ContactForm extends BaseForm
    {
    	//variable pour faire une liste déroulante des différents services
    	protected static $destinataire = array('contact@lanup.be' => 'Général', 'paiement@lanup.be' => 'Paiement', 'sponsoring@lanup.be' => 'Sponsoring');
     
    	public function configure()
    	{
    		$this->setWidgets(array(
    		  'pseudo'    	=> new sfWidgetFormInputText(),
    		  'email' 		=> new sfWidgetFormInputText(),
    		  'desti' 		=> new sfWidgetFormSelect(array('choices' => self::$destinataire)),
    		  'sujet'    	=> new sfWidgetFormInputText(),
    		  'message' 	=> new sfWidgetFormTextarea(),
    		));
     
    		$this->widgetSchema->setNameFormat('contact[%s]');
     
    		$this->widgetSchema->setLabels(array(
    		  'pseudo'  => 'Votre pseudo',
    		  'email'   => 'Votre adresse mail',
    		  'desti'   => 'Service de destination',
    		  'sujet'   => 'Sujet du message',
    		  'message' => 'Votre message',
    		));	
     
    		$this->setValidators(array(
    		  'pseudo' 	=> new sfValidatorString(array('required' => true),array('required' => 'Vous devez indiquer votre pseudo.')),
    		  'email'   => new sfValidatorEmail(array(),array(
    				'required' => 'Vous devez indiquer votre adresse mail.', 
    				'invalid' => 'Votre adresse mail est invalide.'
    				)),
    		  'desti' 	=> new sfValidatorChoice(array('choices' => array_keys(self::$destinataire))),
    		  'sujet' => new sfValidatorString(array('min_length' => 4),array(
    				'required' 		=> 'Vous devez écrire un sujet à votre message.',
    				'min_length' 	=> 'Le sujet du message doit comporter au moins %min_length% caractères.'
    				)),
    		  'message' => new sfValidatorString(array('min_length' => 4),array(
    				'required' 		=> 'Vous devez écrire un message.',
    				'min_length' 	=> 'Le message doit comporter au moins %min_length% caractères.'
    				)),
    		));
    	}
    }
    Dans mon contrôleur /apps/frontend/modules/contact/actions.class.php, mes deux actions. La première, l'action "index" qui crée une instance du formulaire "contact". Si la requête est acquise par POST, c'est que le formulaire a été soumis par l'utilisateur via le bouton submit, on récupère dans la variable $mail le contenu du formulaire. On passe ensuite le formulaire en état lié et non initial (via la fonction bind() )avec les valeurs soumises par l'utilisateur.
    On teste si le formulaire est valide et s'il est valide, j'envoie le mail avec swift mailer.
    Une fois le mail envoyé, je redirige vers l'action "merci" (en passant les champs et les valeurs associées dans l'URL pour les récupérer dans l'action "merci"). L'action "merci" remercie l'utilisateur et lui confirme que le mail a été envoyé.

    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
    class contactActions extends sfActions
    {
    	public function executeIndex($request)
    	{
    		$this->formulaire = new ContactForm();
     
    		if ($request->isMethod('post'))
    		{
    			$mail = $request->getParameter('contact');
    			$this->formulaire->bind($mail);
     
    			if ($this->formulaire->isValid())
    			{
    				$email = $this->getMailer()->compose(
    				  array($mail['email'] => $mail['pseudo']),
    				  $mail['desti'],
    				  $mail['sujet'],
    				  $mail['message']
    				);
    				$this->getMailer()->send($email);
     
    				$this->redirect('contact/merci?'.http_build_query($this->formulaire->getValues()));
    			}
    		}
    	}
     
    	public function executeMerci($request)
    	{
    	}
    }
    Voici la vue de l'action "index"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <p class='titre_contact'>Par E-Mail:</p>
    <fieldset><legend>Contact</legend><br>
    	<form action="<?php echo url_for('contact/index') ?>" method="POST">
    	  <table>
    		<?php echo $formulaire ?>
    		<tr>
    		  <td colspan="2">
    			<input type="submit">
    		  </td>
    		</tr>
    	  </table>
    	</form>
    </fieldset>
    Et la vue de l'action "merci"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php use_stylesheet('contact.css') ?>
     
    <p> Bonjour <?php echo $sf_params->get('pseudo') ?> <br>
    Votre message a bien été envoyé.<br>
    Nous vous répondrons dans les plus bref délais à l'adresse <?php echo $sf_params->get('email') ?>.<br><br>
     
    Le Staff LanUp </p>
    Ne pas oublier que si on utilise swift mailer (fourni avec sa librairie dans Symfony), il faut le configurer dans le fichier apps/frontend/config/factories.yml :
    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
    all:
      mailer:
        class: sfMailer
        param:
          logging:           %SF_LOGGING_ENABLED%
          charset:           %SF_CHARSET%
          delivery_strategy: realtime
          transport:
            class: Swift_SmtpTransport
            param:
              host:       localhost
              port:       25
              encryption: ~
              username:   ~
              password:   ~
    Ne pas oublier de mettre la valeur "realtime" dans la stratégie d'envoie pour que le mail soit envoyé réellement et non fictivement comme par défaut.

    Encore un grand merci à toi pour ton aide !

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

Discussions similaires

  1. Champ qui se rempli tout seul lors de l'envoi formulaire
    Par LhIaScZkTer dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/07/2008, 18h59
  2. Caractère bizarre lors de l'envoi de mail depuis un site : é à la place de é
    Par Dsphinx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 16/04/2007, 13h41
  3. Réponses: 4
    Dernier message: 19/03/2007, 12h03
  4. [VB.NET 2005] Erreur lors d'un envois de mail
    Par mimil77210 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2006, 14h00
  5. [Mail] Erreur lors de l'envoi de mail
    Par PAYASS59 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2006, 14h34

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