Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony3 form parameter

Envoyer un parametre dans un form Symfony 3

    20 octobre 2016 à 16:30:04

    Chers tous,

    J'ai un vrai problème pour envoyer un paramètre dans un formulaire sous Symfony3. J'obtiens l'erreur suivante :

    Warning: Missing argument 1 for FrontOfficeBundle\Form\ReservationType::__construct(), called in C:\wamp\www\inde\vendor\symfony\symfony\src\Symfony\Component\Form\FormRegistry.php on line 85 and defined

    Comment faire pour passer un paramètre dans un formulaire - içi une id  - sous Symfony 3 ? Voici le code de mon formulaire:

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\IntegerType;
    use Symfony\Component\Form\Extension\Core\Type\EntityType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use FrontOfficeBundle\Entity\Price;
    use FrontOfficeBundle\Repository\PriceRepository;
    
    class ReservationType extends AbstractType
    {
        protected $id;
    
        public function __construct($id)
        {
            $this->id=$id;
        }
    
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $id=$this->id;
    
            $builder
                ->add('price', EntityType::class, array('label'=>'Choisissez la catégorie de votre voyage',
                                                        'class'=>'FrontOfficeBundle:Price',
                                                        'choice_label'=>'category',
                                                        'multiple' =>false,
                                                        'query_builder'=> function(PriceRepository $er) use($id)
                                                                          {
                                                                              return $er->getPricesByTrip($id);
                                                                          },
                                                        'attr' =>array('class'=>'form-control')))
                ->add('numberPersons', IntegerType::class, array('label'=>'Choisissez la catégorie de votre voyage',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('name', TextType::class, array('label'=>'Nom',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('firstname', TextType::class, array('label'=>'Prénom',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('mail', TextType::class, array('label'=>'Mail',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('adress', TextType::class, array('label'=>'Adresse',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('city', TextType::class, array('label'=>'Ville',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('postcode', TextType::class, array('label'=>'Code Postal',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('comment', TextareaType::class, array('label'=>'Commentaire',
                                                                 'attr' =>array('class'=>'form-control')))
                ->add('save', SubmitType::class, array('label'=>'Réservez',
                                                       'attr' =>array('class'=>'btn btn-success')))
                
            ;
        }
        
        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'FrontOfficeBundle\Entity\Reservation',
                'id'         => ''
            ));
        }
    }
    

    Et voici celui où je crée mon formulaire dans le controller:

    $reservation=new Reservation();
    			$form=$this->createForm(ReservationType::class, $reservation, array('id'=>$id));
    

    Où est-ce que j'ai fais une erreur ?

    Merci d'avance,

    Christophe


    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2016 à 17:59:53

      Bonjour,

      Dans la méthode BuildForm :

      $this->id = $options['id'];

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        20 octobre 2016 à 18:08:01

        J'ai essayé ça:

        public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $this->id = $options['id'];
        
                $builder
                    ->add('price', EntityType::class, array('label'=>'Choisissez la catégorie de votre voyage',
                                                            'class'=>'FrontOfficeBundle:Price',
                                                            'choice_label'=>'category',
                                                            'multiple' =>false,
                                                            'query_builder'=> function(PriceRepository $er) use($id)
                                                                              {
                                                                                  return $er->getPricesByTrip($id);
                                                                              },
                                                            'attr' =>array('class'=>'form-control')))
                    ->add('numberPersons', IntegerType::class, array('label'=>'Choisissez la catégorie de votre voyage',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('name', TextType::class, array('label'=>'Nom',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('firstname', TextType::class, array('label'=>'Prénom',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('mail', TextType::class, array('label'=>'Mail',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('adress', TextType::class, array('label'=>'Adresse',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('city', TextType::class, array('label'=>'Ville',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('postcode', TextType::class, array('label'=>'Code Postal',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('comment', TextareaType::class, array('label'=>'Commentaire',
                                                                     'attr' =>array('class'=>'form-control')))
                    ->add('numberPersonSingle', ChoiceType::class, array('label'=>' Nombre de Personnes seules ? (Si plus de 4 nous consulter)',
                                                                         'choices'  => array(1 => 1,
                                                                                             2 => 2,
                                                                                             3 => 3,
                                                                                             4 => 4),
                                                                         'attr' =>array('class'=>'form-control')))
                    ->add('numberPersonCouple', ChoiceType::class, array('label'=>'Nombre de Personnes en chambre double ? (Si plus de 4 nous consulter)',
                                                                         'choices'  => array(2 => 2,                                                   
                                                                                             4 => 4),
                                                                         'attr' =>array('class'=>'form-control')))
                    ->add('save', SubmitType::class, array('label'=>'Réservez',
                                                           'attr' =>array('class'=>'btn btn-success')))
                    
                ;
            }
            
            /**
             * @param OptionsResolver $resolver
             */
            public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults(array(
                    'data_class' => 'FrontOfficeBundle\Entity\Reservation',
                    'id'         => ''
                ));
            }

        Toujours la même erreur !!

        Merci pour ton aide en tout cas, je désespère;

        • Partager sur Facebook
        • Partager sur Twitter
          20 octobre 2016 à 18:16:05

          As tu enlevé ton construct ?

          A+

          • Partager sur Facebook
          • Partager sur Twitter
            20 octobre 2016 à 18:19:11

            Après l'avoir enlevé, j'ai maintenant :

            Notice: Undefined variable: id

            à la ligne ou j'appelle le querybuilder dans mon form

            Que faire ???

            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2016 à 18:26:00

              Tu peux vérifier que lorsque tu passes l'id dans ton contrôleur, il y a bien une valeur ?

              Dans le configure option mettre null au lieu de ''.

              Tu as aussi enlevé le protected $id ?

              A+

              -
              Edité par monkey3d 20 octobre 2016 à 18:29:09

              • Partager sur Facebook
              • Partager sur Twitter
                20 octobre 2016 à 18:29:55

                J'ai bien mis à null dans le configure options, et j'ai une valeur à mon "id" (7).

                Même message d'erreur:

                Notice: Undefined variable: id

                • Partager sur Facebook
                • Partager sur Twitter
                  20 octobre 2016 à 18:32:40

                  Tu as aussi enlevé le protected $id ? (j'avais édité après).

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 octobre 2016 à 18:47:32

                    Malheureusement oui, toujours le même problème !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 octobre 2016 à 18:50:05

                      Très bizarre car cela fonctionne ainsi chez moi et plusieurs fois.

                      Tu as vidé le cache ?

                      Tu peux remettre l'extrait de code de ton contrôleur et le form actuel ?

                      A+

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 octobre 2016 à 19:07:39

                        Voilà le controller complet : en parametre j'envoie l'ID de Trip, qui est celle que je recupère dans mon form pour le query_builder:

                        public function showAction(Request $request, $id)
                        	{
                        		$em=$this->getDoctrine()->getManager();
                        		$session=$request->getSession();
                        		$trip=$em->getRepository('FrontOfficeBundle:Trip')->find($id);		
                        		$affich=0;
                        
                        		if($trip->getPrice() != null)
                        		{
                        			$affich=1;			
                        			$message=new Message();
                        			$reservation=new Reservation();
                        			$form=$this->createForm(ReservationType::class, $reservation, array('id'=>$id));
                        
                        			$form->handleRequest($request);
                        
                        			if($form->isValid() && $form->isSubmitted())
                        			{
                        				$data=$form->getData();
                        				$priceSelected=$data['price'];
                        				$customer=$data['name'] . $data['firstname'];
                        				$mail=$data['mail'];
                        				$completeAdresse=$data['adress'] . $data['city'] . $data['postcode'];
                        
                        
                        				// Hydratation de l'objet Message
                        				$subject='Demande d\'achat ferme d\'un séjour !';
                        				$author=$customer;
                        				$email=$mail;
                        				$main='Un séjour est reservé par '. $customer . ' dont le mail est ' . $mail . '. Veuillez voir la réservation correspondante en Back-office.';
                        				$dateSended=new \DateTime('now');
                        				$origin=3;
                        
                        				$em->persist($message);
                        				$em->flush();
                        			}
                        
                        			
                        			return $this->render('FrontOfficeBundle:Price:show.html.twig', 
                        				array('trip'=>$trip, 
                        					  'price'=>$price, 
                        					  'form'=>$form->createView(), 
                        					  'affich'=>$affich));
                        		}
                        		else
                        		{
                        			$session->getFlashBag()->add('prices','Ce voyage n\'a pas de prix attribué, veuillez vous addresser directement à l\'agence via l\'onglet Contact');
                        			return $this->redirectToRoute('front_office_underlineTrip_oneUnderlineTrip', array('id'=>$trip->getId()));
                        		}
                        
                        	}

                        Voilà le code de mon form:

                        <?php
                        
                        namespace FrontOfficeBundle\Form;
                        
                        use Symfony\Component\Form\AbstractType;
                        use Symfony\Component\Form\FormBuilderInterface;
                        use Symfony\Component\OptionsResolver\OptionsResolver;
                        use Symfony\Component\Form\Extension\Core\Type\IntegerType;
                        use Symfony\Component\Form\Extension\Core\Type\EntityType;
                        use Symfony\Component\Form\Extension\Core\Type\TextType;
                        use Symfony\Component\Form\Extension\Core\Type\TextareaType;
                        use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
                        use Symfony\Component\Form\Extension\Core\Type\SubmitType;
                        use FrontOfficeBundle\Entity\Price;
                        use FrontOfficeBundle\Repository\PriceRepository;
                        
                        class ReservationType extends AbstractType
                        {
                        
                            /**
                             * @param FormBuilderInterface $builder
                             * @param array $options
                             */
                            public function buildForm(FormBuilderInterface $builder, array $options)
                            {
                                $this->id = $options['id'];
                        
                                $builder
                                    ->add('price', EntityType::class, array('label'=>'Choisissez la catégorie de votre voyage',
                                                                            'class'=>'FrontOfficeBundle:Price',
                                                                            'choice_label'=>'category',
                                                                            'multiple' =>true,
                                                                            'query_builder'=> function(PriceRepository $er) use($id)
                                                                                              {
                                                                                                  return $er->getPricesByTrip($id);
                                                                                              },
                                                                            'attr' =>array('class'=>'form-control')))            
                                    ->add('name', TextType::class, array('label'=>'Nom',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('firstname', TextType::class, array('label'=>'Prénom',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('mail', TextType::class, array('label'=>'Mail',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('adress', TextType::class, array('label'=>'Adresse',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('city', TextType::class, array('label'=>'Ville',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('postcode', TextType::class, array('label'=>'Code Postal',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('comment', TextareaType::class, array('label'=>'Commentaire',
                                                                                     'attr' =>array('class'=>'form-control')))
                                    ->add('numberPersonSingle', ChoiceType::class, array('label'=>' Nombre de Personnes seules ? (Si plus de 4 nous consulter)',
                                                                                         'choices'  => array(1 => 1,
                                                                                                             2 => 2,
                                                                                                             3 => 3,
                                                                                                             4 => 4),
                                                                                         'attr' =>array('class'=>'form-control')))
                                    ->add('numberPersonCouple', ChoiceType::class, array('label'=>'Nombre de Personnes en chambre double ? (Si plus de 4 nous consulter)',
                                                                                         'choices'  => array(2 => 2,                                                   
                                                                                                             4 => 4),
                                                                                         'attr' =>array('class'=>'form-control')))
                                    ->add('save', SubmitType::class, array('label'=>'Réservez',
                                                                           'attr' =>array('class'=>'btn btn-success')))
                                    
                                ;
                            }
                            
                            /**
                             * @param OptionsResolver $resolver
                             */
                            public function configureOptions(OptionsResolver $resolver)
                            {
                                $resolver->setDefaults(array(
                                    'data_class' => 'FrontOfficeBundle\Entity\Reservation',
                                    'id'         => null
                                ));
                            }
                        }
                        

                        Merci de ton aide en tout cas. Voila, j'essaie dans mon formulaire de récuperer toutes les différentes formules de prix d'un voyage - entity Trip. En même temps, j'envoie un message, ne t'en préoccupe pas, cela n'a rien à voir avec le form. La fin du controller n'est pas encore développée, je veux d'abord afficher le formulaire et m'assurer qu'il fonctionne.

                        A +

                        Et voici mon repository:

                        public function getPricesByTrip($id)
                        	{		
                        
                        		$qb=$this->createQueryBuilder('q');
                        		$qb->select('p')
                           		   ->from('FrontOfficeBundle:Price', 'p')
                           		   ->where('p.trip = :tripId')
                           		   ->setParameter('tripId', $id);
                        			
                        		return $qb;
                        	}



                        -
                        Edité par GermainH 20 octobre 2016 à 19:14:25

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 juillet 2020 à 17:24:35

                          Je ne sais pas s'il est approprié de déterrer ce sujet (il me semble que oui car il m'a personnellement aidé), mais il n'a jamais été résolu alors que le dernier message est la bonne solution au problème à une ligne près:

                          Dans le form l.26, il suffit d'écrire$id = $options['id'];

                          et le tour est joué !

                          -
                          Edité par Steelboy 5 juillet 2020 à 17:24:52

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Symfony3 form parameter

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown