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 formulaire de contact dans le handler


Sujet :

Symfony PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Problème avec formulaire de contact dans le handler
    Bonjour,

    Je cherche à faire un formulaire de contact sous SF2, sans entité, et je galère depuis un moment, la doc et les différents tutos que je peux suivre prêtant à confusion avec des méthodes et syntaxes pas toujours à jour par rapport à la version 2.4.1. que j'utilise.

    Je rencontre l'erreur suivante dans mon handler :

    FatalErrorException: Error: Call to undefined method Open\OpcBundle\Form\Handler\ContactHandler::renderView() in C:\Program Files\wamp\www\sf2\src\Open\OpcBundle\Form\Handler\ContactHandler.php line 75
    Je comprends bien l'erreur mais ne voit pas avec quel objet/instance appeler la méthode renderView, le paramètre $data passé en argument étant un tableau.

    Code de mon handler :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
    // src/Open/OpcBundle/Form/Handler/Handler.php
     
    namespace Open\OpcBundle\Form\Handler;
     
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
     
    class ContactHandler {
       protected $request;
       protected $form;
       protected $mailer;
     
      public function __construct(Form $form, Request $request, $mailer) {
          $this->form = $form;
          $this->request = $request;
          $this->mailer = $mailer;
       }
     
    public function process() {
        if ('POST' == $this->request->getMethod()) {
            // Bind value with form
            // $this->form->bindRequest($this->request);
            $this->form->handleRequest($this->request);
            $data = $this->form->getData();
            $this->onSuccess($data);
            return true;
        }
     
        return false;
    }
     
     
        protected function onSuccess($data) {
     
           $message = \Swift_Message::newInstance()
                       ->setContentType('text/html')
                       ->setSubject($data['sujet'])
                       ->setFrom($data['courriel'])
                       ->setTo('moi@gmail.com')
                       ->setBody($this->renderView('OpcOpenBundle:Opc:Mails/contact.html.twig',
                                                   array('ip' => $request->getClientIp(),
                                                   'nom' => $data['nom'],
                                                   'msg' => $data['msg'])
                                                  )
                                 );
     
           $this->get('mailer')->send($message);
     
           $request->getSession()->getFlash()->add('success', 'Your email has been sent! Thanks!');
     
           return $this->redirect($this->generateUrl('contact'));
        }
    } // -- classe
    Merci pour vos réponses.

    PS : pour ceux qui en auraient noté l'absence, je n'ai pas encore attaqué la validation.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    la méthode renderView est une méthode du controller de base de symfony, c'est un raccourci vers le service de templating (généralement twig donc)
    https://github.com/symfony/symfony/b...oller.php#LC83

    Si tu as besoin de twig dans ton objet, il faut l'injecter via le constructeur pour l'utiliser.

    idem pour le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->get('mailer')->send($message);
    la méthode get est une méthode du controller, elle n'existe pas dans ta classe, en revanche tu as un attribut mailer, il est là pour être utilisé non?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Nouvelle erreur
    Bonjour et merci pour la réponse,

    J'avais commencé à explorer cette piste en ajoutant l'utilisation du composant templating dans mon handler (lignes en gras) :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    <?php
    // src/Open/OpcBundle/Form/Handler/Handler.php
    
    namespace Open\OpcBundle\Form\Handler;
    
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Templating\EngineInterface;
    
    class ContactHandler {
       protected $request;
       protected $form;
       protected $mailer;
       protected $templating;
       
       public function __construct(Form $form, Request $request, $mailer, EngineInterface $templating) {
          $this->form = $form;
          $this->request = $request;
          $this->mailer = $mailer;
          $this->templating = $templating;
       }
      
       public function process() {
           if ('POST' == $this->request->getMethod()) {
               $this->form->handleRequest($this->request);
               $data = $this->form->getData();
               $this->onSuccess($data);
               return true;
           }
           
           return false;
       }
    
       protected function onSuccess($data) {
            $message = \Swift_Message::newInstance()
                       ->setContentType('text/html')
                       ->setSubject($data['sujet'])
                       ->setFrom($data['courriel'])
                       ->setTo('moi@gmail.com')
                       ->setBody($this->templating->renderView('OpcOpenBundle:Opc:Mails/contact.html.twig',
                                                   array('ip' => $request->getClientIp(),
                                                   'nom' => $data['nom'],
                                                   'msg' => $data['msg'])
                                                  )
                                 );
           
           $this->get('mailer')->send($message);
           
           $request->getSession()->getFlash()->add('success', 'Your email has been sent! Thanks!');
           
           return $this->redirect($this->generateUrl('contact'));
        }
    }
    Mais j'ai maintenant une autre erreur qui dit que le service de templating n'est pas instancié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ContextErrorException: Catchable Fatal Error: Argument 4 passed to Open\OpcBundle\Form\Handler\ContactHandler::__construct() must be an instance of Symfony\Component\Templating\EngineInterface, none given, called in C:\Program Files\wamp\www\sf2\src\Open\OpcBundle\Controller\OpcController.php on line 135 and defined in C:\Program Files\wamp\www\sf2\src\Open\OpcBundle\Form\Handler\ContactHandler.php line 18
    J'ai donc passé l'argument templating (en gras) dans l'appel au handler de mon contrôleur :

    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
    <?php
    // src/Open/OpcBundle/Controller/OpcController.php
    
    namespace Open\OpcBundle\Controller;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Open\OpcBundle\Form\Type\ContactType;
    use Open\OpcBundle\Form\Handler\ContactHandler;
    
    class OpcController extends Controller {
         
       public function contactAction(Request $request) {      
          $form = $this->get('form.factory')->create(new ContactType());
                
          $request = $this->get('request');
                
          $formHandler = new ContactHandler($form, $request, $this->get('mailer'), $this->get('templating'));
          
          $process = $formHandler->process();
          
          if ($process) {
             $this->get('session')->setFlash('notice', 'Merci de nous avoir contacté, nous répondrons à vos questions dans les plus brefs délais.');
          }
             
          return $this->render("OpenOpcBundle:Opc:contact.html.twig",
                array("form" => $form->createView(),
                        "hasError" => $request->getMethod() == 'POST' && !$form->isValid()
                )
          );      
       } // -- contactAction()  
    } // -- classe
    et là nouvelle erreur : plus de $request (je précise que le formulaire s'affiche, c'est le post qui ne va pas bien entendu) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ContextErrorException: Notice: Undefined variable: request in C:\Program Files\wamp\www\sf2\src\Open\OpcBundle\Form\Handler\ContactHandler.php line 43
    Une idée ? Je n'ai peut-être pas mis l'appel du service de template au bon endroit ?

    Quoiqu'il en soit j'ai déjà passé énormément de temps sur un simple formulaire de contact, Symfony c'est bien dans les grands principes mais mal documenté je trouve sur les points précis (syntaxe changeant à chaque version du framework, donc sources souvent pas trop à jour dans les tutos sur le web), je vais probablement abandonner cette 'bonne' méthode du form avec un handler et faire comme la doc officielle : formulaire (sans entité) avec tout le traitement dans le contrôleur ou comme dans la plupart des tutos sur le net utiliser une entité 'Contact' mais qui n'a pas de sens puisque ce formulaire n'a pas rien à enregistrer dans la base de données.

Discussions similaires

  1. Réponses: 18
    Dernier message: 12/07/2019, 22h59
  2. Problème avec mon champ date dans le formulaire
    Par PetitChris dans le forum IHM
    Réponses: 4
    Dernier message: 28/08/2014, 09h37
  3. [HTML]Problème avec la touche "entrée" dans un formulaire
    Par WerKa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/06/2007, 20h34
  4. problème avec masque de saisie dans table
    Par porki dans le forum Access
    Réponses: 6
    Dernier message: 13/10/2004, 08h58

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