Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 5 - Formulaire contenant 2 entities

Formulaire unique de plusieurs entitées

Sujet résolu
    19 mai 2022 à 18:15:19

    Bonjour à tous,

    Je suis en train de développer une application de gestion d'un parc automobile.
    Pour cela, j'ai deux fonctions importantes qui sont le relevé kilométrique et l'ajout de carburant (faire le plein).

    J'ai sans aucun soucis créé ma fonction de relevé kilométrique :

    public function addKm(?Vehicule $vehicule, Request $request): Response
        {
            // Création du formulaire
            $km = new ReleveKilometrique;
            $form = $this->createForm(AddKmType::class, $km);
    
            // analyse de la requête par le formulaire
    		$form->handleRequest($request);
            //Traitement des données reçues du formulaire
            if($form->isSubmitted()){// && $form->isValid()
                if($km->getVehicule() == null){
                    // Ajout du vehicule
                    $km->setVehicule($vehicule);
                }
                $this->manager->persist($km);
                $this->manager->flush();
    
                //Retour à la page précédente
                return $this->redirectToRoute('lireVl', ['id'=>$vehicule->getId()]);
            }
    
            //Génération du controller
            return $this->renderForm('garage/addKm.html.twig', [
                'form' => $form,
                'vehicule' => $vehicule,
            ]);
        }


    Et le formulaire qui va avec :

    {% block body %}
    {# Gestion de présélection de véhicule
    Désactivation du menu de sélection de véhicule #}
    {% set disabled = false %}
    {% set kmEnCours = 0 %}
    {% if vehicule != null %}
        {% set disabled = true %}
        {% set kmEnCours = vehicule.getKmEnCours %}
    {% endif %}
    
                    {{form_start(form)}}
                        <div class="col-md-4">
                            {# DATE #}
                            {{form_row(
                                form.date,{
                                    'label':"Date :"
                                }
                            )}}
                        </div>
                        <div class="col-md-4">
                            {# KM #}
                            {{form_row(
                                form.km,{
                                    'label':"Compteur :",
                                    'value':kmEnCours
                                }
                            )}}
                        </div>
                        <div class="col-md-4">
                            {# VEHICULE #}
                            {{form_row(
                                form.vehicule,{
                                    'label':"Véhicule :",
                                    'placeholder':vehicule,
                                    'attr':{
                                        'disabled':disabled,
                                    }
                                }
                            )}}
                        </div>
                        <button type="submit" id="add_km_Valider" name="add_km[Valider]" class="btn btn-success">Valider</button>
                    {{form_end(form)}}



    Mais, lors d'un relevé kilométrique, l'ajout de carburant est lié au relevé kilométrique.
    Le but est que, qaund un utilisateur fait le plein, il effectue également un relevé kilométrique.
    Et là, franchement, après avoir suivi le cours, je ne vois pas du tout comment faire...

    Pour l'instant j'ai fait ça :

    public function addFuel(?Vehicule $vehicule, Request $request): Response
        {
            // Création du formulaire
            $fuel = new Carburant;
            $km = new ReleveKilometrique;
            $form = $this->createForm(AddFuelType::class, $fuel);
    
            // analyse de la requête par le formulaire
    		$form->handleRequest($request);
            //Traitement des données reçues du formilaire
            if($form->isSubmitted()){// && $form->isValid()
                
                if($fuel->getVehicule() == null){
                    // Ajout du vehicule
                    $fuel->setVehicule($vehicule);
                }
    
                if($fuel->getTypeCarburant() == null){
                    // Ajout du type de carburant
                    $fuel->setTypeCarburant($vehicule);
                }
    
                $this->manager->persist($fuel);
                $this->manager->flush();
    
                //Retour à la page précédente
                return $this->redirectToRoute('lireVl', ['id'=>$vehicule->getId()]);
            }
    
            //Génération du controller
            return $this->renderForm('garage/addFuel.html.twig', [
                'form' => $form,
                'vehicule' => $vehicule,
            ]);
        } 

    Et son template :

    {% set disabled = false %}
    {% set kmEnCours = 0 %}
    {% set carbuType = vehicule.getTypeCarburant %}
    {% if vehicule != null %}
        {% set disabled = true %}
        {% set kmEnCours = vehicule.getKmEnCours %}
    {% endif %}
    
                    {{form_start(form)}}
                        {# QUANTITE #}
                        {{form_row(
                            form.quantite,{
                                'label':"Quantité de Carburant (en Litre) :"
                            }
                        )}}
                        <hr/>
                        {# KM #}
                        {# {{form_row(
                            form.km,{
                                'label':"Relevé kilométrique :"
                            }
                        )}} #}
                        <pre>
                            {{ dump(kmEnCours) }}
                        </pre>
                        {{form_row(
                            form.km,{
                                'label':"Compteur :",
                                'value': kmEnCours
                            }
                        )}}
                        {{form_row(
                            form.vehicule,{
                                'label':"Véhicule :",
                                'placeholder':vehicule,
                                'attr':{
                                    'disabled':disabled,
                                }
                            }
                        )}}
                        <hr/>
                        {# TYPE DE CARBURANT #}
                        {{form_row(
                            form.typeCarburant,{
                                'label':"Type de carburant :",
                                'placeholder': carbuType,
                                'attr':{
                                    'disabled':disabled,
                                }
                            }
                        )}}
                        {# VEHICULE #}
                        {{form_row(
                            form.vehicule,{
                                'label':"Véhicule :",
                                'placeholder':vehicule,
                                'attr':{
                                    'disabled':disabled,
                                }
                            }
                        )}}
                        {# LIEU D'APPROVISIONNEMENT #}
                        {{form_row(
                            form.lieuxApprovisionnement,{
                                'label':"Lieu d'approvisionnement :"
                            }
                        )}}
    
                        <button type="submit" id="add_km_Valider" name="add_km[Valider]" class="btn btn-success">Valider</button>
                    {{form_end(form)}}

    Visuellement, j'ai bien tous les éléments,

    Mais, non seulement je n'arrive pas à avoir les km en cours, mais en plus, si je valide mon formulaire seule l'ajout de carburant est pris en compte.

    Je m'arrache les cheveux depuis des semaines et je commence à baisser les bras... Si un bon samaritin avait une idée...

    • Partager sur Facebook
    • Partager sur Twitter

    Apprendre est ma plus grande passion.

      19 mai 2022 à 19:41:12

      Salut, je ne me retrouve pas vraiment dans ton code mais as tu verifier le controlleur qui doit mettre ces valeurs dans la base de donnees ?

      Tu fais un createForm(AddFuelType::class, $fuel) donc c'est normal que seul l'ajout de carburant soit pris en compte. Tu devrais customiser ton form pour ton cas et manipuler les donnees en consequence.

      • Partager sur Facebook
      • Partager sur Twitter
        19 mai 2022 à 20:36:21

        Asmitta a écrit:

        Salut, je ne me retrouve pas vraiment dans ton code mais as tu verifier le controlleur qui doit mettre ces valeurs dans la base de donnees ?

        Tu fais un createForm(AddFuelType::class, $fuel) donc c'est normal que seul l'ajout de carburant soit pris en compte. Tu devrais customiser ton form pour ton cas et manipuler les donnees en consequence.

        Merci de t'intéressez à mon sujet.


        Comment fait-on pour customiser le form (en dehors des customisations dans twig) ?

        Il y a possibilité de mettre plusieurs Type dans le createForm ?

        • Partager sur Facebook
        • Partager sur Twitter

        Apprendre est ma plus grande passion.

          20 mai 2022 à 1:31:04

          Si je suis ceci, tu pourrais rajouter ceci a ton formulaire AddFuelType, dans la methode buildForm() :$builder->add('addkm', AddKmType::class);

           Puis a l'affichage, a la place de : form.km ou form.vehicule tu vas ecrire form.addkm.km form.addkm.vehicule . C'est pareil mais la tu geres un seul formulaire.

          Puis le controlleur(addFuel) resembleras a ceci:

          public function addFuel(?Vehicule $vehicule, Request $request): Response
              {
                  $km = new ReleveKilometrique; // Ligne 5
           
                  if($form->isSubmitted()){// && $form->isValid()
                       
                      $data = $form->getData();
                      $km = $data['addKm'];
                      $fuel = $data... // Remplir chaque champ manuellement
           
                      $this->manager->persist($fuel, $km); // Ligne 23
                      ou persist($fuel) puis persist($km) si on peut mettre les deux en meme temps.
                      $this->manager->flush();
                      // 
                 }
               
              }

          Bon en faisant ainsi y'aura pas mal de changements peut-etre pas 'necessaires' pour toi.

          Mais tu peux garder ton code et persister $km, a la ligne 23 tu as fait uniquement persist($fuel) c'est pourquoi ton $km n'etais pas pris en compte. (je viens de le remarquer desole)

          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2022 à 7:29:45

            Bonjour,

            Un truc m'interpelle sans connaître ta modélisation des entités. L'ajout de carburant et les km sont liés à une voiture alors pourquoi ne transmets tu pas à ton form l'objet voiture qui fait l'objet de la modification (ajout de carburant à une valeur kilométrique donnée). L'objet voiture pourrait être choisie avant en fonction par exemple de l'utilisateur ou autre critère.

            S'agissant des modifications dynamiques dans un form : https://symfony.com/doc/current/form/dynamic_form_modification.html

            mais je ne pense pas que ce soit nécessaire dans ton cas.

            A+

            -
            Edité par monkey3d 20 mai 2022 à 7:30:22

            • Partager sur Facebook
            • Partager sur Twitter
              21 mai 2022 à 15:18:20

              @Asmitta


              Merci beaucoup,

              ALors, j'avais déjà dans la methode buildForm() :$builder->add('km', AddKmType::class);

              Mais c'est dans mon rendue que je faisais une erreur.
              au lieu de

              {{form_row(form.km.km)}}


              J'avais mis

              {{form_row(form.km)}}


              Ce qui empêchait le bon fonctionnement.

              Un petit persist sur $fuel et $km et tout est parfait.

              -
              Edité par Aklain52 21 mai 2022 à 15:20:10

              • Partager sur Facebook
              • Partager sur Twitter

              Apprendre est ma plus grande passion.

              Symfony 5 - Formulaire contenant 2 entities

              × 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