Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 5] Problème de Form Dynamique

Sujet résolu
    27 avril 2021 à 14:27:04

    Bonjour,

    J'aurai besoin d'aide s'il vous plaît pour rendre mon formulaire dynamique. Pour le moment, il ne l'est pas, et voici mon code :

    $form = $this->createFormBuilder($activite)
                ->add('act_salle', ChoiceType::class, [
                    'choices' => $salles,
                ])
                ->add('act_lieu', TextType::class, [
                    'required' => false,
                    'disabled' => true,
                ])
                ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event){
                    $form = $event->getForm();
                    if ($form->get('act_salle') === "Autre"){
                        $form->add('act_lieu', TextType::class, [
                            'required' => false,
                            'disabled' => false,
                        ]);
                    }
                    else {
                        $form->add('act_lieu', TextType::class, [
                            'required' => false,
                            'disabled' => true,
                        ]);
                    }
                })
                ->add('Ajouter', SubmitType::class)
                ->getForm()
            ;
    <div class="form_att">
    			{{ form_label(form.act_salle, "Salle") }}
    			{{ form_widget(form.act_salle, {'attr': {'class':'form_att_text'}}) }}
    		</div>
    		<div class="form_att">
                <article class="label-info">
    			{{ form_label(form.act_lieu, "Autre lieu") }}
    			<p class="image-info">
    				<img src="{{ asset('build/info.png') }}" alt="" height="15px"/>
    				<span>A remplir si aucune salle n'est selectionnée.</span>
    			</p>
                </article>
    			{{ form_widget(form.act_lieu, {'attr': {'class':'form_att_text'}}) }}
    		</div>

    Mon champ ne se dégrise pas quand je veux selectionner "autre" dans le selecteur de "salle". Je n'y arrive vraiment pas, si quelqu'un peut m'aider ça serai génial, merci beaucoup !

    Matthieu


    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2021 à 7:44:00

      Bonjour,

      Comme c'est du coté navigateur que la zone doit être grisée ou pas, tu vas devoir faire du javascript.

      Regarde dans la doc : https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms

      A la fin du doc il y a un script dont l'événement change peut t'inspirer : c'est là où en fonction de ton état de l'autre zone tu mets l'attribut disabled.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        28 avril 2021 à 10:21:23

        Salut !

        Je pensais qu'il y avait une méthode pour le faire avec Symfony en php et twig directement, mais je ne connais pas le jQuery, donc j'ai fait du javascript et ça marche ^^

        Merci quand même !

        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2021 à 7:34:35

          Merci quand même ? ... c'était bien la solution, non ?

          ... après le jQuery n'est qu'un framework au dessus du javascript comme Symfony est un framework php. On peut faire sans.

          Bye

          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2021 à 10:34:54

            Bonjour ! Désolé de pas avoir répondu, non j'ai fait quelque chose de différents, cette solution n'a pas fonctionné pour moi (va savoir pourquoi...), du coup oui j'ai fait quelque chose à ma sauce et ça marche bien haha.

            Merci !

            • Partager sur Facebook
            • Partager sur Twitter
              5 mai 2021 à 17:27:51

              Ce serait intéressant que tu donnes ta solution car ton problème est classique et un forum c'est un endroit de partage.

              Bye

              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2021 à 16:56:53

                Après super longtemps, je reviens pour en effet mettre ma solution (pas forcément très propre, mais qui pourra servir si quelqu'un en a besoin).

                Donc voici le js 

                let salle = document.getElementById('form_act_salle');
                let autre_salle = document.getElementById('form_div_act_lieu');
                let req_autre_salle = document.getElementById('form_act_lieu');
                window.addEventListener('load', function(){
                	if (salle.options[salle.selectedIndex].text == "Autre"){
                			autre_salle.style.visibility = "visible";
                			autre_salle.style.height = "auto";
                			req_autre_salle.setAttribute('required', true);
                	}
                	else {
                		autre_salle.style.visibility = "hidden";
                		autre_salle.style.height = "0px";
                		req_autre_salle.removeAttribute('required');
                	}
                });
                salle.addEventListener('change', function(){
                	if (salle.options[salle.selectedIndex].text == "Autre"){
                			autre_salle.style.visibility = "visible";
                			autre_salle.style.height = "auto";
                			req_autre_salle.setAttribute('required', true);
                	}
                	else {
                		autre_salle.style.visibility = "hidden";
                		autre_salle.style.height = "0px";
                		req_autre_salle.removeAttribute('required');
                	}
                });

                Et mon html : 

                <div class="form_att">
                        {{ form_label(form.act_salle, "Salle") }}
                        {{ form_widget(form.act_salle, {'attr': {'class':'form_att_text'}}) }}
                    </div>
                    <div class="form_att" id="form_div_act_lieu">
                        <article class="label-info">
                            {{ form_label(form.act_lieu, "Autre lieu") }}
                            <p class="image-info">
                                <img src="{{ asset('build/info.png') }}" alt="" height="15px"/>
                                <span>Selectionner autre dans salle pour mettre une salle personnalisée.</span>
                            </p>
                        </article>
                        {{ form_widget(form.act_lieu, {'attr': {'class':'form_att_text'}}) }}
                    </div>



                Donc en gros, ce que je fais, c'est que si "autre" est sélectionné, je fais apparaître le champ autre lieu que je rend required, sinon, je l'enlève du formulaire et j'enlève le required de ce champ (donc le premier est toujours required, car il permet de selectionner soit un type de donnée dans le formulaire, soit le autre qui permet d'afficher un champ supplémentaire required).

                Voilà, j'espère que ma solution aidera certains :)

                -
                Edité par MattAmsellem 17 mai 2021 à 16:57:45

                • Partager sur Facebook
                • Partager sur Twitter
                  18 mai 2021 à 5:30:28

                  Tu as bien fait du javascript alors je ne vois pas en quoi ta solution est différente de ce qui était proposé.

                  Tu places un listener sur load : je ne vois pas trop pourquoi ? tu pourrais mettre directement dans le design html au chargement les options sans ajouter du javascript.

                  Bye

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mai 2021 à 8:59:55

                    Peut-être en effet que c’est similaire, mais je n’ai pas comprit la doc, du coup c’est ce que j’ai fait tout seul.

                    et pour le load, c.est parce-que j’utilise mon formulaire pour la création d’objet et aussi l’edition (donc j’en ai besoin pour le formulaire de l’édition).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mai 2021 à 7:20:12

                      En édition, tu as donc déjà des valeurs pour l'objet ... avec ton js tu les écrases donc ?

                      Mais je chipote sans doute ... l'essentiel c'est que cela te convienne.

                      Bye

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mai 2021 à 12:04:01

                        JE ne vois pas ce que tu veux dire par écraser les valeurs ? Non les valeurs sont celles de l'objet, à moins qu'il y ait une modification, au quel cas c'est symfony qui s'en charge ^^
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [Symfony 5] Problème de Form Dynamique

                        × 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