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 objet de validation d'un formulaire


Sujet :

Symfony PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 205
    Points
    205
    Par défaut Problème avec objet de validation d'un formulaire
    Bonjour,

    Je rencontre un problème avec un tuto Symfony 2.

    Je précise qu'il s'agit d'un formulaire de contact donc, avec envoi d'un mail (appel d'un template pour le mail), sans entité puisque pas nécessaire ici. J'essaie de faire les choses proprement mais pas évident de trouver le bon code. Sur certains tutos sur le net les formulaires de contact sont avec une entité et basta, mais au moins ça semble fonctionner, alors que moi je galère à essayer de faire bien.

    J'ai l'erreur suivante quand je poste le formulaire, je comprends bien l'erreur mais n'arrive pas à la résoudre :

    ContextErrorException: Catchable Fatal Error: Argument 1 passed to Test\MyBundle\Form\Handler\ContactHandler::onSuccess() must be an instance of Test\MyBundle\Form\Model\Contact, array given, called in C:\Program Files\wamp\www\sf2\src\Test\MyBundle\Form\Handler\ContactHandler.php on line 28 and defined in C:\Program Files\wamp\www\sf2\src\Test\MyBundle\Form\Handler\ContactHandler.php line 36
    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
    34
    <?php
    // src/Test/MyBundle/Controller/MyController.php
     
    namespace Test\MyBundle\Controller;
     
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Test\MyBundle\Form\Type\ContactType;
    use Test\MyBundle\Form\Handler\ContactHandler;
    use Symfony\Component\HttpFoundation\Session\Session;
     
    class MyController extends Controller {
     
       public function contactAction(Request $request) {     
          $form = $this->get('form.factory')->create(new ContactType());
     
          $request = $this->getRequest();
     
          $formHandler = new ContactHandler($form, $request, $this->get('mailer'), $this->get('templating'));
     
          $process = $formHandler->process();
     
          if ($process) {
             $this->get('session')->getFlashBag('success', 'Merci de nous avoir contacté, nous vous répondrons dans les meilleurs délais.');
             $this->redirect($this->generateUrl('test_my_contact_success'));
          }
     
          return $this->render("TestMyBundle:My:contact.html.twig",
                array("form" => $form->createView(),
                      "hasError" => $request->getMethod() == 'POST' && !$form->isValid()
                )
          );  // -- render   
       } // -- contactAction() 
    } // -- classe
    Ma classe de formulaire :

    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
    <?php
    namespace Test\MyBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
     
    class ContactType extends AbstractType {
       public function buildForm(FormBuilderInterface $builder, array $options) {
          $builder->add('nom', 'text', array('max_length' => 30, 'label' => 'Prénom, nom*', 'required' => false, 'trim' => true, 'attr' => array('size'=>'30')))
          ->add('courriel', 'email', array('max_length' => 255, 'label' => 'Adresse email*', 'required' => false, 'trim' => true, 'attr' => array('size'=>'30')))
     
                ->add('sujet', 'text', array('max_length' => 255, 'label' => 'Objet*', 'trim' => true, 'attr' => array('size'=>'30')))
          ->add('msg', 'textarea', array('label' => 'Message*', 'attr' => array('rows' => '10','cols' => '80')))
          ->add('submit', 'submit');
       } // -- buildForm()
     
       public function setDefaultOptions(OptionsResolverInterface $resolver) {
          return array('data_class' => 'Test\MyBundle\Form\Model\Contact');
      } // -- setDefaultOptions()
     
       public function getName() {
          return 'Contact';
       } // -- getName()
    } // -- classe
    Le formHandler :

    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
    <?php
    // src/Test/MyBundle/Form/Handler/Handler.php
    namespace Test\MyBundle\Form\Handler;
     
    use Symfony\Component\Form\Form;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Templating\EngineInterface;
    use Test\MyBundle\Form\Model\Contact;
     
    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;
       } // --  __construct()
     
       public function process() {
           if ('POST'==$this->request->getMethod()) {
               $this->form->handleRequest($this->request);
     
               if ($this->form->isValid()) {         
                  $contact = $this->form->getData();
                  $this->onSuccess($contact);
                  return true;
               } // -- isValid()     
           } // -- si POST
     
           return false;
       } // -- process()
     
       protected function onSuccess(Contact $contact) {
            $oMessage = \Swift_Message::newInstance()
                       ->setContentType('text/html')
                       ->setSubject($contact->getSujet())
                       ->setFrom($contact->getCourriel())
                       ->setTo('me@toto.com')
                       ->setBody($this->templating->render('@TestMyBundle:My:Mails/contact.html.twig',
                                                   array('nom' => $contact->getNom(),
                                                         'msg' => $contact->Msg()
                                                        )
                                                  )
                                 );
     
           return $this->mailer->send($oMessage);    
        } // -- onSuccess()
    } // -- classe
    Et, enfin, la classe "objet" pour la validation :

    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
     
    <?php
    // src/Test/MyBundle/Form/Model/Contact.php
    namespace Test\MyBundle\Form\Model;
     
    class Contact {
       protected $nom;
       protected $courriel;
       protected $sujet;
       protected $msg;
     
       public function getNom() {
          return $this->nom;
       }
     
       public function setNom($nom) {
          $this->nom = $nom;
       }
     
       public function getCourriel() {
          return $this->courriel;
       }
     
       public function setCourriel($courriel) {
          $this->courriel = $courriel;
       }
     
       public function getSujet() {
          return $this->telephone
       }
     
       public function setSujet($sujet) {
          $this->sujet = $sujet;
       }
     
       public function getMsg() {
          return $this->msg;
       }
     
       public function setMsg($msg) {
          $this->msg = $msg;
       }
    } // -- classe
    Merci d'avance pour vos réponses.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu n'utilises pas d'entité mais tu utilises toujours un model: la classe Contact. Or, rien dans ton controleur ne relie le formulaire à Contact; c'est pourquoi, dans ContactHandler, quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $contact = $this->form->getData();
    le formulaire te renvoie un array, et non un objet. Et comme onSuccess attends une instance de Contact, c'est normal qu'il crie.

    Il faut modifier contactAction de ton controleur pour injecter une instance de Contact dans le FormFactory
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $contact = new Contact();
    $form = $this->get('form.factory')->create(new ContactType(), $contact);

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2015, 17h21
  2. [XHTML] Problème avec les champs obligatoires d'un formulaire
    Par elodie13 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 26/09/2006, 14h45
  3. [PHP-JS] Problème avec un script php d'un formulaire
    Par Dark DJ dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2006, 19h36
  4. problème avec objet Stream
    Par Poussy-Puce dans le forum ASP
    Réponses: 3
    Dernier message: 02/06/2006, 23h30
  5. Problème avec objet fermé
    Par Mvu dans le forum ASP
    Réponses: 4
    Dernier message: 22/09/2005, 10h30

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