Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question méthode de programmation

Sujet résolu
    17 août 2018 à 11:14:30

    Bonjour,

    J'ai une question d'ordre pratique sur Symfony

    J'ai une relation Many to one entre des catalogues et des catégories, un catalogues peut avoir plusieurs catégories

    Sur la page admin pour gérer les catalogues pour que ça soit plus ergonomique, j'ai fait un système d'onglets en javascript, si l'utilisateur a créé 3 catalogues,il a trois onglets, avec sur chaque onglet le catalogue en question

    Une fois qu'il est sur l'onglet souhaité, il peut ajouter une catégorie au catalogue donné

    Mon problème c'est que du coup le formulaire pour créé une catégorie est le même pour les trois catalogue, comment je fais pour connaitre sur quel catalogue l'utilisateur a créée une nouvelle catégorie, pour faire l'enregistrement en BDD.

    Il faut que ça soit transparent pour l'utilisateur :

    J'avais ça comme idée :

    Soit je crée X form dans mon contrôleur avec une boucle for, en fonction du nombre de catalogue de l'utilisateur puis je les affiche sur la page( un form par onglet du coup, je sais que si c'est le form1 qui est validé, ça provient du premier onglet etc..  ), le soucis c'est pour le traitement 

    Je ne pense pas que symfony aime bien une boucle for sur le code ci dessous:

    if ($request->isMethod('POST') && $formX->handleRequest($request)->isValid()) {
    
      
               $Categorie->setCatalogue($CatalogueX);
               
               $em = $this->getDoctrine()->getManager();
    
               $em->persist($Categorie);
    
               $em->flush();
    
    
    }


    Soit rentrer un paramètre dans le formulaire avec l'information de quel onglet ça provient (en JavaScript ? ), mais je ne sais pas trop comment l'implémenter.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2018 à 11:20:50

      Bonjour,

      Il nous faudrait tes codes HTML et JS pour pouvoir te répondre efficacement.

      Mais une manière de faire serait de mettre sur le bouton de l'onglet l'attribut data afin de renseigner l'id du catalogue sur lequel est l'utilisateur.

      Une fois que tu connais l'id, tu peux rajouter un input de type hidden dans ton formulaire avec cet id comme valeur.

      • Partager sur Facebook
      • Partager sur Twitter
      "Ils ne savaient pas que c'était impossible, alors ils l'ont fait" Mark Twain
        17 août 2018 à 11:22:33

        Et pourquoi pas un simple champ hidden dans le formulaire qui reprend l'id qui va bien ?
        • Partager sur Facebook
        • Partager sur Twitter
        Nicolas - Développeur PHP qui bricole pas mal, utilisant Bootstrap, Materialize, MySQL et quelques astuces piochées par ci par là. Codeigniter a changé ma vie de codeur :D
          17 août 2018 à 11:29:26

          Salut !

          Si tu parles d'ajouter une catégorie à un catalogue, c'est une mise à jour. Les routes par défaut de Symfony pour les mises à jour contiennent l'ID de l'objet, donc tu devrais avoir des URLs différents pour chaque formulaire, permettant bien de savoir à quel catalogue tu as ajouté une catégorie.

          Si tu gères cela avec une collection de catalogues (où chaque élément de la collection est un onglet dans ta page), alors chaque onglet possède des noms de champs uniques, et une fois de plus, Symfony et Doctrine arrivent à savoir quel catalogue a été mis à jour.

          -
          Edité par Ymox 17 août 2018 à 11:31:25

          • Partager sur Facebook
          • Partager sur Twitter
            17 août 2018 à 12:19:53

            Merci pour vos réponses

            Voici le HTML

            <div id="onglets1" class ="row">
                            Catalogue actuels : <br>
                                        <ul class=" ">
                                            <li title="onglet-2"><a href="#onglet-2">Catalogue 1</a></li>
                                            <li title="onglet-3"><a href="#onglet-3">Catalogue 2</a></li>
                                            <li title="onglet-6"><a href="#onglet-6">Catalogue 3</a></li>
                                        </ul>
            
                                        <div class="active" id="onglet-2">
                                                <div class="button_mode">Ajouter une categorie</div>
                                                <div class="well">
                                                    <form name="el_platformbundle_cataloguecategory" method="post"><div id="el_platformbundle_cataloguecategory"><div class="form-group"><label class="control-label required" for="el_platformbundle_cataloguecategory_name">Name</label><input type="text" id="el_platformbundle_cataloguecategory_name" name="el_platformbundle_cataloguecategory[name]" required="required" class="form-control" /></div><div class="form-group"><button type="submit" id="el_platformbundle_cataloguecategory_save" name="el_platformbundle_cataloguecategory[save]" class="btn-default btn">Save</button></div><input type="hidden" id="el_platformbundle_cataloguecategory__token" name="el_platformbundle_cataloguecategory[_token]" value="wtdF7a_Yf25xR9a0Jk3iCjJS0F8S9udAvElFqxv5pFs" /></div></form>
                                                </div>
            
                                        </div>
            
                                        <div class="active" id="onglet-3">
                                                <div class="button_mode">Ajouter une categorie</div>
                                                <div class="well">
                                                     <form name="el_platformbundle_cataloguecategory" method="post"></form>
                                                </div>
                                        </div>
            
                                        <div class="active" id="onglet-6">
                                            <div class="button_mode">Ajouter une categorie</div>
                                            <div class="well">
                                                <form name="el_platformbundle_cataloguecategory" method="post"></form>
                                            </div>
                                        </div>
                                        
            
            </div>


            et le JavaScript très simple

             $( function() {
                        $( "#onglets1 " ).tabs();
                        
                    } );

            Le HTML est généré a l'aide de twig

            {%  for Catalogue in Shop.Catalogues %}
                        <div class="active" id="onglet-{{ Catalogue.id }}">
                            <div class="button_mode">Ajouter une categorie</div>
                            <div class="well">
                                {{ form(formCatalogueCategory) }}
                            </div>
            
                            {%  for CatalogueCategory in Catalogue.CatalogueCategories  %}
                                
                                  
                                
                            {% endfor %}
                        </div>
            {% endfor %}

            Et mon formulaire est définit comme ceci

             public function buildForm(FormBuilderInterface $builder, array $options)
                {
                    $builder->add('name',     TextType::class)
                        ->add('save', SubmitType::class);
            
                }

            Je n'avais pas testé l'affichage des formulaires, je viens de le faire et au final un seul s'affiche correctement, comme si twig ne générait pas les autres .. 

            Je vois l'idée pour le hidden je vais me renseigner



            • Partager sur Facebook
            • Partager sur Twitter
              17 août 2018 à 13:34:03

              Tu as un seul formulaire pour les trois onglets, j'imagine. Or les formulaires sont prévus pour n'être rendus qu'une fois.

              Soit tu créés autant de formulaires que de catalogues, soit tu passes l'ID du catalogue d'une manière ou d'une autre.

              • Partager sur Facebook
              • Partager sur Twitter
                17 août 2018 à 17:06:50

                Ok, je vais tenter la seconde option

                Merci

                • Partager sur Facebook
                • Partager sur Twitter

                Question méthode de programmation

                × 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