Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony3] Envoyer une variable à un form imbriqué

Sujet résolu
    26 juillet 2017 à 10:35:43

    Bonjour à tous,

    Je rencontre actuellement un problème avec le système de formulaire de Symfony 3.

    Je suis dans la situation suivante : j'ai un formulaire Parent qui imbrique un formulaire Enfant. Depuis le controller, je passe en paramètre des données que je peux utiliser sans problème dans le formulaire Parent grâce au tableau $options ($options['varA'], ...).

    $form = $this->createForm(EntiteParentType::class, $objParent, array('varA'=>$varA, 'varB'=>$varB));

    Là où ça coince, c'est lorsque je veux utiliser un de ces 2 paramètres dans mon formulaire imbriqué Enfant (par exemple, 'varB'). Comment passer cette variable du formulaire Parent vers le formulaire Enfant ? Je suis tombée sur ce topic qui présente une problématique similaire à la mienne : https://openclassrooms.com/forum/sujet/symfony-formulaire-imbrique-passer-une-variable mais l'utilisation de CollectionType ne semble pas appropriée pour moi étant donné que je suis dans une imbrication de formulaire "simple". Mais peut-être que je me trompe ?

    Si quelqu'un a une idée, je suis preneuse !

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2017 à 11:53:30

      Salut !

      Tes entités s'appellent vraiment comme ça, ou c'est juste pour expliquer ? En ce qui me concerne, j'ai toujours de la peine à pouvoir répondre à quelqu'un qui n'explique pas son cas réel quand il (ou elle) demande si l'une ou l'autre solution fonctionnera mieux…

      • Partager sur Facebook
      • Partager sur Twitter
        26 juillet 2017 à 13:51:05

        C'était juste pour expliquer, désolée du manque de précision :honte: Le contexte dans les grandes lignes : il s'agit d'une application gérant des sinistres (dommages aux biens, accident de voiture, vol de véhicule, de matériel, etc) ainsi que le suivi des dossiers d'assurance associés. Concrètement, j'ai 2 entités, Sinistre et DossierAssurance, avec une relation OneToOne.

        Ci-dessous mon vrai code :

        Dans mon controller :

        $form = $this->createForm(SinistreType::class, $sinistre, array('sousTypeSinistre'=>$sousTypeSinistre, 'typeSinistre'=>$typeSinistre));

        Dans mon formulaire parent, SinistreType.php :

        public function buildForm(FormBuilderInterface $builder, array $options)
            {
                $sousTypeSinistre = $options['sousTypeSinistre'];
                $typeSinistre = $options['typeSinistre'];
        
                $builder
                [...]
                ->add('dossierAssurance', DossierAssuranceType::class) 
                [...]
            }
        
        public function configureOptions(OptionsResolver $resolver)
            {
                $resolver->setDefaults(array(
                    'data_class'        => Sinistre::class,
                    'sousTypeSinistre'  => null,
                    'typeSinistre'      => null
                ));
            }


        DossierAssuranceType est mon formulaire imbriqué. Comment lui envoyer la variable $typeSinistre ? Ci-dessous, voilà ce que j'ai tenté dans le formulaire parent :

        $builder
           ->add('dossierAssurance', DossierAssuranceType::class, array(
                        'data' => $typeSinistre
                    ))

        Mais j'obtiens l'erreur suivante :

        The form's view data is expected to be an instance of class EDVS\SinistreBundle\Entity\DossierAssurance, but is a(n) array. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) array to an instance of EDVS\SinistreBundle\Entity\DossierAssurance.

        En mettant le paramètre "data_class" à null dans mon formulaire enfant (DossierAssuranceType), l'affichage est correcte mais je trouve ça louche de devoir faire ça. Autre précision, cette variable $typeSinistre me permettrait de récupérer un tableau servant à remplir une liste déroulante dans le formulaire imbriqué.

        J'espère que je suis assez claire ^^'







        • Partager sur Facebook
        • Partager sur Twitter
          26 juillet 2017 à 14:02:22

          C'est dans l'objet sous-jacent qu'il faut définir les valeurs. Quand tu créés le formulaire, tu as normalement déjà un objet DossierAssurance et un objet Sinistre, que tu as liés entre eux, non ? Vu que tu utilises l'objet Sinistre pour construire le formulaire, si tu as bien lié ton DossierAssurance à l'objet Sinistre et que ce DossierAssurance peut contenir des informations, tu peux donc définir le type de sinistre hors du formulaire dans l'entité DossierAssurance avant de construire le formulaire.

          • Partager sur Facebook
          • Partager sur Twitter
            27 juillet 2017 à 9:04:48

            Merci pour ta réponse :)

            J'ai finalement réussi à appliquer la solution que j'ai tenté de mettre en place dans une premier temps mais sans succès. Il faut utiliser les options.

            Dans mon controller, je transmets les variables souhaitées au formulaire Parent :

            $form = $this->createForm(SinistreType::class, $sinistre, array('sousTypeSinistre'=>$sousTypeSinistre, 'typeSinistre'=>$typeSinistre));

            Dans mon formulaire Parent (SinistreType)

            public function buildForm(FormBuilderInterface $builder, array $options)
                {
             // On récupère les données envoyées au formulaire depuis le controller
            $sousTypeSinistre = $options['sousTypeSinistre']; $typeSinistre = $options['typeSinistre'];
            $builder ->add('dossierAssurance', DossierAssuranceType::class, array( 'typeSinistre' => $typeSinistre, // On transmet une variable au formulaire imbriqué 'label' => false )) [...]
            ;
            } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => Sinistre::class, 'sousTypeSinistre' => null, 'typeSinistre' => null // On définit ici nos options "perso" )); }


            Dans mon formulaire imbriqué (DossierAssuranceType)

            public function buildForm(FormBuilderInterface $builder, array $options) {
                    // On récupère l'option envoyée depuis le formulaire parent
            $typeSinistre = $options['typeSinistre'][0]; $builder ->add('assuranceEdv', ChoiceType::class, array( 'choices' => $typeSinistre->getAssurances(), 'choice_label' => 'nomAssurance' )) [...] ; }

            public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'data_class' => DossierAssurance::class, 'typeSinistre' => null )); }




            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony3] Envoyer une variable à un form imbriqué

            × 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