Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony post_set_data

    7 avril 2021 à 15:39:44

    bonjour à tous

    je travail actuellement sur un formulaire de demande de devis, cette entité devis est relié à une entité ville, j'ai fais en sorte que qu'une ville peut etre relié a plusieurs devis comme ça je n'ai pas la même ville 20 fois en bdd, par contre j'ai eu un souci lors de la modification du devis, la ville changeait aussi ce qui faisait que tous les devis relié à la même ville, leur ville changeait aussi, du coup j'ai fais en sorte que le champs ville du formulaire ne soit plus mappé et je set la ville dans le controller en fonction des data renvoyé par le formulaire

    tout marche correctement sauf que lors de la modification d'un devis la ville et le code postal n'apparaissent plus, et je sais pas comment faire, on m'a parlé de post_set_data mais je ne comprend pas du tout comment ça marche 

     public function newBallon(Request $request, QuotePriceRepository $quotePriceRepository, VilleRepository $villeRepository, GeolocCity $geolocCity): Response
        {
            $quoteIndividual = new QuoteIndividual();
            $quoteIndividual->setTypeIntervention('installation');
            $quoteIndividual->setMaterial('ballon d\'eau chaude');
            
            $quotePrice = $quotePriceRepository->findBy(['name'=>'Ballon']);
            $quotePrice = $quotePrice[0];
            $quoteIndividual->setPrice($quotePrice);
            $quoteIndividual->setValidation(false);
            $quoteIndividual->setPurchaseNumber(0);
    
            if($this->isGranted('ROLE_ADMIN')){
                $form = $this->createForm(AdminQuoteIndividualBallonType::class, $quoteIndividual);
            } else {
                $form = $this->createForm(QuoteIndividualBallonType::class, $quoteIndividual);
            }
    
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
    
                $cityName = $form["ville"]->getData();
                $postalCode = $form["codePostal"]->getData();
                
                $city = $villeRepository->findOneBy(['nom' => $cityName, 'codePostal' => $postalCode]);
                
                if ($city != Null) {
                    $city->addQuoteIndividual($quoteIndividual);
                } else {
                    $newCity = new Ville();
                    $newCity->setNom($cityName);
                    $newCity->setCodePostal($postalCode);
                    $quoteIndividual->setCity($newCity);
                    
                }
    
                if ( ! $quoteIndividual->getCity()->getLat() || ! $quoteIndividual->getCity()->getLng()) {
                    $cityGeo = $quoteIndividual->getCity();
    			    $geolocCity->generate($cityGeo);
                }
                
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($quoteIndividual);
                $entityManager->flush();
    
                $this->addFlash(
                    'success',
                    'Votre demande de devis à été traitée avec succès !'
                );
    
                return $this->redirectToRoute('quote_individual_ballon_new');
            }
    
            return $this->render('quote_individual/new.html.twig', [
                'quote_individual' => $quoteIndividual,
                'form' => $form->createView(),
            ]);
        }
    class QuoteIndividualGazType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('typeHousing', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'choices'   => [
                        'maison'        => 'maison',
                        'appartement'   => 'appartement'
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false,
                ])
                ->add('seniorityHousing', ChoiceType::class, [
                    'label'         => false,
                    'required'  => true,
                    'placeholder'   => '',
                    'choices'       => [
                        'Moins de 2 ans'    => 'Moins de 2 ans',
                        'Plus de 2 ans'     => 'Plus de 2 ans'
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false,
                ])
                ->add('areaSize', IntegerType::class, [
                    'label' => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: 75',
                        ],
                ])
                ->add('typeMaterial', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'choices'   => [
                        'chaudière gaz murale' => 'chaudière gaz murale',
                        'chaudière gaz au sol' => 'chaudière gaz au sol',
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false
                ])
                ->add('brand', ChoiceType::class, [
                    'label'         => false,
                    'required'      => false,
                    'placeholder'   => 'Pas de marque spécifique',
                    'choices'       => [
                        'Saunier Duval' => 'Saunier Duval',
                        'De Dietrich' => 'De Dietrich',
                        'Frisquet' => 'Frisquet',
                        'AUER' => 'AUER',
                        'Atlantic' => 'Atlantic',
                        'ELM Leblanc' => 'ELM Leblanc',
                        'Vaillant' => 'Vaillant',
                        'Chappee' => 'Chappee',
                        'Oertli' => 'Oertli',
                        'Buderus' => 'Buderus',
                        'Domusa' => 'Domusa',
                        'Chaffoteaux' => 'Chaffoteaux',
                        'Riello' => 'Riello',
                        'Bosch' => 'Bosch',
                        'Viessmann' => 'Viessmann',
                    ]
                ])
                ->add('timeLimit', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'placeholder'   => 'Selectionnez une période',
                    'choices'   => [
                        'moins de 3 mois'   => 'moins de 3 mois',
                        'entre 3 et 6 mois' => 'entre 3 et 6 mois',
                        'plus de 6 mois'    => 'plus de 6 mois'
                    ]
                ])
                ->add('description', TextareaType::class, [
                    'label'     => false,
                    'required'  => true,
                ])
                ->add('lastname', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: Dupond',
                        ],
                ])
                ->add('firstname', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: Jean',
                    ],
                ])
                ->add('email', EmailType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: exemple@gmail.com',
                        ],
                ])
                ->add('phone', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: 0606060606',
                        ],
                ])
                ->add('ville', TextType::class, [
                    'required' => true,
                    'label' => false,
                    'mapped' => false
                ])
                ->add('codePostal', TextType::class, [
                    'required' => true,
                    'label' => false,
                    'mapped' => false
                ])
                ->add('pictureFile', VichFileType::class, [
                    'required'      => false,
                    'allow_delete'  => true, // not mandatory, default is true
                    'download_uri' => true, // not mandatory, default is true
                ])
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => QuoteIndividual::class,
            ]);
        }
    }

    j'ai réussi à faire ceci, pour un nouveau formulaire mais là je ne sais pas quoi mettre dans le else pour récupérer les données existante lors de la modification

    class AdminQuoteIndividualGazType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('typeHousing', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'choices'   => [
                        'maison'        => 'maison',
                        'appartement'   => 'appartement'
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false,
                ])
                ->add('seniorityHousing', ChoiceType::class, [
                    'label'         => false,
                    'required'  => true,
                    'placeholder'   => '',
                    'choices'       => [
                        'Moins de 2 ans'    => 'Moins de 2 ans',
                        'Plus de 2 ans'     => 'Plus de 2 ans'
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false,
                ])
                ->add('areaSize', IntegerType::class, [
                    'label' => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: 75',
                        ],
                ])
                ->add('typeMaterial', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'choices'   => [
                        'chaudière gaz murale' => 'chaudière gaz murale',
                        'chaudière gaz au sol' => 'chaudière gaz au sol',
                    ],
                    'multiple'      => false,
                    'expanded'      => true,
                    'by_reference'  => false
                ])
                ->add('brand', ChoiceType::class, [
                    'label'         => false,
                    'required'      => false,
                    'placeholder'   => 'Pas de marque spécifique',
                    'choices'       => [
                        'Saunier Duval' => 'Saunier Duval',
                        'De Dietrich' => 'De Dietrich',
                        'Frisquet' => 'Frisquet',
                        'AUER' => 'AUER',
                        'Atlantic' => 'Atlantic',
                        'ELM Leblanc' => 'ELM Leblanc',
                        'Vaillant' => 'Vaillant',
                        'Chappee' => 'Chappee',
                        'Oertli' => 'Oertli',
                        'Buderus' => 'Buderus',
                        'Domusa' => 'Domusa',
                        'Chaffoteaux' => 'Chaffoteaux',
                        'Riello' => 'Riello',
                        'Bosch' => 'Bosch',
                        'Viessmann' => 'Viessmann',
                    ]
                ])
                ->add('timeLimit', ChoiceType::class, [
                    'label'     => false,
                    'required'  => true,
                    'placeholder'   => 'Selectionnez une période',
                    'choices'   => [
                        'moins de 3 mois'   => 'moins de 3 mois',
                        'entre 3 et 6 mois' => 'entre 3 et 6 mois',
                        'plus de 6 mois'    => 'plus de 6 mois'
                    ]
                ])
                ->add('description', TextareaType::class, [
                    'label'     => false,
                    'required'  => true,
                ])
                ->add('lastname', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: Dupond',
                        ],
                ])
                ->add('firstname', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: Jean',
                    ],
                ])
                ->add('email', EmailType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: exemple@gmail.com',
                        ],
                ])
                ->add('phone', TextType::class, [
                    'label'     => false,
                    'required'  => true,
                    'attr' => [
                        'placeholder'   => 'ex: 0606060606',
                        ],
                ])
                /* ->add('ville', TextType::class, [
                    'required' => true,
                    'label' => false,
                    'mapped' => false
                ]) */
                ->add('codePostal', TextType::class, [
                    'required' => true,
                    'label' => false,
                    'mapped' => false
                ])
                ->add('pictureFile', VichFileType::class, [
                    'required'      => false,
                    'allow_delete'  => true, // not mandatory, default is true
                    'download_uri' => true, // not mandatory, default is true
                ])
                ->add('comment', TextareaType::class, [
                    'required'      => false,
                ])
            ;
    
            $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event){
                $quoteindividual = $event->getData();
                $form = $event->getForm();
    
                if(!$quoteindividual || null === $quoteindividual->getId()){
                    $form->add('ville', TextType::class, [
                        'required' => true,
                        'label' => false,
                        'mapped' => false]);
                }
                    
            });
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => QuoteIndividual::class,
            ]);
        }
    }

    -
    Edité par DamienLambert13 7 avril 2021 à 17:03:58

    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2021 à 8:51:47

      Plutôt que de t'aider à développer un workaround concernant un problème que tu n'as pas compris, on va plutôt se pencher sur ledit problème, ok ?

      j'ai eu un souci lors de la modification du devis, la ville changeait aussi ce qui faisait que tous les devis relié à la même ville, leur ville changeait aussi

      Si la ville est mappé à un EntityType ça n'est pas censé arriver. Était-ce le cas ? Peux-tu poster le code tel qu’il était alors ?

      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2021 à 10:37:45

        merci pour ta réponse, mais j'ai trouvé la solution 

        <?php
        
        namespace App\Form\QuoteIndividual\QuoteIndividualAdmin;
        
        use App\Entity\QuoteIndividual;
        use Symfony\Component\Form\FormEvent;
        use Symfony\Component\Form\FormEvents;
        use Symfony\Component\Form\AbstractType;
        use Vich\UploaderBundle\Form\Type\VichFileType;
        use Symfony\Component\Form\FormBuilderInterface;
        use Symfony\Bridge\Doctrine\Form\Type\EntityType;
        use Symfony\Component\Validator\Constraints\IsTrue;
        use Symfony\Component\OptionsResolver\OptionsResolver;
        use Symfony\Component\Form\Extension\Core\Type\TextType;
        use Symfony\Component\Form\Extension\Core\Type\EmailType;
        use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
        use Symfony\Component\Form\Extension\Core\Type\IntegerType;
        use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
        use Symfony\Component\Form\Extension\Core\Type\TextareaType;
        
        class AdminQuoteIndividualGazType extends AbstractType
        {
            public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $builder
                    ->add('typeHousing', ChoiceType::class, [
                        'label'     => false,
                        'required'  => true,
                        'choices'   => [
                            'maison'        => 'maison',
                            'appartement'   => 'appartement'
                        ],
                        'multiple'      => false,
                        'expanded'      => true,
                        'by_reference'  => false,
                    ])
                    ->add('seniorityHousing', ChoiceType::class, [
                        'label'         => false,
                        'required'  => true,
                        'placeholder'   => '',
                        'choices'       => [
                            'Moins de 2 ans'    => 'Moins de 2 ans',
                            'Plus de 2 ans'     => 'Plus de 2 ans'
                        ],
                        'multiple'      => false,
                        'expanded'      => true,
                        'by_reference'  => false,
                    ])
                    ->add('areaSize', IntegerType::class, [
                        'label' => false,
                        'required'  => true,
                        'attr' => [
                            'placeholder'   => 'ex: 75',
                            ],
                    ])
                    ->add('typeMaterial', ChoiceType::class, [
                        'label'     => false,
                        'required'  => true,
                        'choices'   => [
                            'chaudière gaz murale' => 'chaudière gaz murale',
                            'chaudière gaz au sol' => 'chaudière gaz au sol',
                        ],
                        'multiple'      => false,
                        'expanded'      => true,
                        'by_reference'  => false
                    ])
                    ->add('brand', ChoiceType::class, [
                        'label'         => false,
                        'required'      => false,
                        'placeholder'   => 'Pas de marque spécifique',
                        'choices'       => [
                            'Saunier Duval' => 'Saunier Duval',
                            'De Dietrich' => 'De Dietrich',
                            'Frisquet' => 'Frisquet',
                            'AUER' => 'AUER',
                            'Atlantic' => 'Atlantic',
                            'ELM Leblanc' => 'ELM Leblanc',
                            'Vaillant' => 'Vaillant',
                            'Chappee' => 'Chappee',
                            'Oertli' => 'Oertli',
                            'Buderus' => 'Buderus',
                            'Domusa' => 'Domusa',
                            'Chaffoteaux' => 'Chaffoteaux',
                            'Riello' => 'Riello',
                            'Bosch' => 'Bosch',
                            'Viessmann' => 'Viessmann',
                        ]
                    ])
                    ->add('timeLimit', ChoiceType::class, [
                        'label'     => false,
                        'required'  => true,
                        'placeholder'   => 'Selectionnez une période',
                        'choices'   => [
                            'moins de 3 mois'   => 'moins de 3 mois',
                            'entre 3 et 6 mois' => 'entre 3 et 6 mois',
                            'plus de 6 mois'    => 'plus de 6 mois'
                        ]
                    ])
                    ->add('description', TextareaType::class, [
                        'label'     => false,
                        'required'  => true,
                    ])
                    ->add('lastname', TextType::class, [
                        'label'     => false,
                        'required'  => true,
                        'attr' => [
                            'placeholder'   => 'ex: Dupond',
                            ],
                    ])
                    ->add('firstname', TextType::class, [
                        'label'     => false,
                        'required'  => true,
                        'attr' => [
                            'placeholder'   => 'ex: Jean',
                        ],
                    ])
                    ->add('email', EmailType::class, [
                        'label'     => false,
                        'required'  => true,
                        'attr' => [
                            'placeholder'   => 'ex: exemple@gmail.com',
                            ],
                    ])
                    ->add('phone', TextType::class, [
                        'label'     => false,
                        'required'  => true,
                        'attr' => [
                            'placeholder'   => 'ex: 0606060606',
                            ],
                    ])
                    /* ->add('ville', TextType::class, [
                        'required' => true,
                        'label' => false,
                        'mapped' => false
                    ]) */
                    /* ->add('codePostal', TextType::class, [
                        'required' => true,
                        'label' => false,
                        'mapped' => false
                    ]) */
                    ->add('pictureFile', VichFileType::class, [
                        'required'      => false,
                        'allow_delete'  => true, // not mandatory, default is true
                        'download_uri' => true, // not mandatory, default is true
                    ])
                    ->add('comment', TextareaType::class, [
                        'required'      => false,
                    ])
                ;
        
                $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event){
                    $quoteindividual = $event->getData();
                    $form = $event->getForm();
        
                    $form->add('codePostal', TextType::class, [
                            'required' => true,
                            'label' => false,
                            'mapped' => false,
                            'data' => (!$quoteindividual || null === $quoteindividual->getId()) ? null : $quoteindividual->getCity()->getCodePostal()
                        ]);
        
                    $form->add('ville', TextType::class, [
                            'required' => true,
                            'label' => false,
                            'mapped' => false,
                            'data' => (!$quoteindividual || null === $quoteindividual->getId()) ? null : $quoteindividual->getCity()->getNom()
                    ]);
                        
                });
            }
        
            public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults([
                    'data_class' => QuoteIndividual::class,
                ]);
            }
        }
        



        • Partager sur Facebook
        • Partager sur Twitter
          8 avril 2021 à 11:08:46

          Salut

          Avec le nom de l'événement et les 'data' que tu as mis, je pense que les données de QuoteIndividual sont déjà mises dans les champs existants au moment où tu ajoutes ceux pour le code postal et la ville, d'où tes lignes 159 et 166. Je te conseillerais d'utiliser dans un premier temps PRE_SET_DATA (qui lui a pour documentation expresse l'ajout de champs selon les données avant que celles-ci ne remplissent les champs) et d'enlever ces deux lignes.

          -
          Edité par Ymox 8 avril 2021 à 11:10:49

          • Partager sur Facebook
          • Partager sur Twitter

          Symfony post_set_data

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown