Partage
  • Partager sur Facebook
  • Partager sur Twitter

données dans variable POST

    7 décembre 2018 à 11:36:32

    Bonjour à tous,

    Voici mon problème: dans un formulaire, je souhaite que l'utilisateur puisse créer autant de champs que nécessaire.

    J'ai récupéré un script qui fait exactement ce que souhaite: en cliquant sur un bouton, ça me rajoute une ligne avec les champs voulus.

    Dans le DOM, ces nouveaux champs apparaissent bien mais lorsque je veux valider mon formulaire avec une méthode POST, seule la 1ere ligne est prise en compte.

    Voici mes morceaux de code:

    le script multlifield.js

    /**
     * jQuery Multifield plugin
     *
     * https://github.com/maxkostinevich/jquery-multifield
     */
    
    
    // the semi-colon before function invocation is a safety net against concatenated
    // scripts and/or other plugins which may not be closed properly.
    ;(function ( $, window, document, undefined ) {
    
    	/*
    	 * Plugin Options
    	 * section (string) -  selector of the section which is located inside of the parent wrapper
    	 * max (int) - Maximum sections
    	 * btnAdd (string) - selector of the "Add section" button - can be located everywhere on the page
    	 * btnRemove (string) - selector of the "Remove section" button - should be located INSIDE of the "section"
    	 * locale (string) - language to use, default is english
    	 */
    
    	// our plugin constructor
    	var multiField = function( elem, options ){
    		this.elem = elem;
    		this.$elem = $(elem);
    		this.options = options;
    		// Localization
    		this.localize_i18n={
            "multiField": {
              "messages": {
                "removeConfirmation": "Are you sure you want to remove this section?"
              }
            }
          };
    
    		// This next line takes advantage of HTML5 data attributes
    		// to support customization of the plugin on a per-element
    		// basis. For example,
    		// <div class=item' data-mfield-options='{"section":".group"}'></div>
    		this.metadata = this.$elem.data( 'mfield-options' );
    	};
    
    	// the plugin prototype
    	multiField.prototype = {
    
    		defaults: {
    			max: 0,
    			locale: 'default'
    		},
    		
    
    		init: function() {
    			var $this = this; //Plugin object
    			// Introduce defaults that can be extended either
    			// globally or using an object literal.
    			this.config = $.extend({}, this.defaults, this.options,
    				this.metadata);
    
    			// Load localization object
          if(this.config.locale !== 'default'){
      			$this.localize_i18n = this.config.locale;
          }
    
    			// Hide 'Remove' buttons if only one section exists
    			if(this.getSectionsCount()<2) {
    				$(this.config.btnRemove, this.$elem).hide();
    			}
    
    			// Add section
    			this.$elem.on('click',this.config.btnAdd,function(e){
    				e.preventDefault();
    				$this.cloneSection();
    			});
    
    			// Remove section
    			this.$elem.on('click',this.config.btnRemove,function(e){
    				e.preventDefault();
    				var currentSection=$(e.target.closest($this.config.section));
    				$this.removeSection(currentSection);
    			});
    
    			return this;
    		},
    
    
    		/*
    		 * Add new section
    		 */
    		cloneSection : function() {
    			// Allow to add only allowed max count of sections
    			if((this.config.max!==0)&&(this.getSectionsCount()+1)>this.config.max){
    				return false;
    			}
    
    			// Clone last section
    			var newChild = $(this.config.section, this.$elem).last().clone().attr('style', '').attr('id', '').fadeIn('fast');
    
    
    			// Clear input values
    			$('input[type!="radio"],textarea', newChild).each(function () {
    				$(this).val('');
    			});
    
    			// Fix radio buttons: update name [i] to [i+1]
    			newChild.find('input[type="radio"]').each(function(){var name=$(this).attr('name');$(this).attr('name',name.replace(/([0-9]+)/g,1*(name.match(/([0-9]+)/g))+1));});
    			// Reset radio button selection
    			$('input[type=radio]',newChild).attr('checked', false);
    
    			// Clear images src with reset-image-src class
    			$('img.reset-image-src', newChild).each(function () {
    				$(this).attr('src', '');
    			});
    
    			// Append new section
    			this.$elem.append(newChild);
    
    			// Show 'remove' button
    			$(this.config.btnRemove, this.$elem).show();
    		},
    
    		/*
    		 * Remove existing section
    		 */
    		removeSection : function(section){
    			if (confirm(this.localize_i18n.multiField.messages.removeConfirmation)){
    				var sectionsCount = this.getSectionsCount();
    
    				if(sectionsCount<=2){
    					$(this.config.btnRemove,this.$elem).hide();
    				}
    				section.slideUp('fast', function () {$(this).detach();});
    			}
    		},
    
    		/*
    		 * Get sections count
    		 */
    		getSectionsCount: function(){
    			return this.$elem.children(this.config.section).length;
    		}
    
    	};
    
    	multiField.defaults = multiField.prototype.defaults;
    
    	$.fn.multifield = function(options) {
    		return this.each(function() {
    			new multiField(this, options).init();
    		});
    	};
    
    
    
    })( jQuery, window, document );







    le formulaire d'exemple:

    <div id="example-1" class="content"
        data-mfield-options='{"section": ".group","btnAdd":"#btnAdd","btnRemove":".btnRemove"}'>
          <div class="row">
            <div class="col-md-12">
              <button type="button" id="btnAdd" class="btn btn-primary">Add section</button>
            </div>
          </div>
          <div class="row group">
            <div class="col-md-2">
              <input class="form-control" name="toto[]" type="text">
            </div>
            <div class="col-md-2">
              <input class="form-control" name="titi[]" type="text">
            </div>
            <div class="col-md-4">
              <textarea name="tata[]"></textarea>
            </div>
            <div class="col-md-3">
              <button type="button" class="btn btn-danger btnRemove">Remove</button>
            </div>
          </div>
    </div>




    $('#example-1').multifield({
          // form group you want to duplicate
          section: '.group',
          // add button
          btnAdd:'#btnAdd',
          // remove button
          btnRemove:'.btnRemove',
          // maximum number of form groups to duplicate
          max: 3,
          // localization
          locale:'default'
        });



    Je précise que je travail avec un WAMP en local.

    Merci d'avance pour votre aide, la je sèche complètement.

    -
    Edité par FabriceMichel7 7 décembre 2018 à 16:39:18

    • Partager sur Facebook
    • Partager sur Twitter
      7 décembre 2018 à 12:20:03 - Message modéré pour le motif suivant : La demande de l'équipe de modération a été honorée


      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        7 décembre 2018 à 19:19:45

        Bonjour. Utilises les outils de développement de ton navigateur qui te permettent d'afficher l'arbre du DOM au fur et à mesure de la création des éléments. Tu verras s'il sont placés comme il faut, si leur name correspond à ce que tu attends etc...

        Cordialement.

        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2018 à 8:48:43

          merci Domi65 pour ta réponse.

          l'arbre du DOM se complète correctement au fur et à mesure de la création des champs et au bon endroit.

          Malheureusement lors de la validation avec le bouton submit, seul les 1er champs sont pris en comptes.

          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2018 à 15:02:10

            salut, est ce que tu peux creer une 2e section, copier coller le code source de ta page entre les balises form, et afficher le resultat de var_dump($_POST) ?

            -
            Edité par Arthur222 10 décembre 2018 à 15:02:37

            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2018 à 16:59:39

              Merci PaulLou pour ta réponse.

              N'étant pas très à l'aise avec javascript, peux-tu m'indiquer comment faire pour créer une 2e section stp ?

              • Partager sur Facebook
              • Partager sur Twitter
                10 décembre 2018 à 17:51:00

                clique sur ajouter, ce qui rajoute une nouvelle section .group. Une fois que tu as cliqué, va voir dans les onglets du navigateur, cherches outils pour developpeur, et regarde le code source de ta page.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 décembre 2018 à 9:27:17

                  alors le code source:

                  <div id="example-1" class="content"
                      data-mfield-options='{"section": ".group","btnAdd":"#btnAdd","btnRemove":".btnRemove"}'>
                  	  <div class="row">
                  	    <div class="col-md-12">
                  	      <button type="button" id="btnAdd" class="btn btn-primary">Add section</button>
                  	    </div>
                  	  </div>
                  	  <div class="row group">
                  	    <div class="col-md-2">
                  	      <input class="form-control" name="toto[]" type="text">
                  	    </div>
                  	    <div class="col-md-2">
                  	      <input class="form-control" name="titi[]" type="text">
                  	    </div>
                  	    <div class="col-md-4">
                  	      <textarea name="tata[]"></textarea>
                  	    </div>
                  	    <div class="col-md-3">
                  	      <button type="button" class="btn btn-danger btnRemove">Remove</button>
                  	    </div>
                  	  </div>
                  </div>

                  si je fais "examiner l'élément"

                  Une fois validée avec le bouton submit, je n'ai que les 1er champs de qui sont pris en compte:

                   [toto] => Array
                          (
                              [0] => qdqsdqsd
                          )
                  
                      [titi] => Array
                          (
                              [0] => qsdqsdqsd
                          )
                  
                      [tata] => Array
                          (
                              [0] => qsdqsdqsd
                          )



                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 décembre 2018 à 14:32:22

                    Bonjour.

                    Excuse cette question, mais des fois les plus élémentaires oublient d'être posées.

                    Tes nouveaux champs sont bien à l'intérieur du form ? Ta saisie ne nous le dit pas, vu que tu n'as pas inclus la ligne des conteneurs, située en bas.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 décembre 2018 à 16:44:16

                      Bonjour Domi65,

                      Oui bien sûr cela va de soit, c'est la 1ere chose que j'ai vérifié :)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 décembre 2018 à 16:20:45

                        « Oui bien sûr cela va de soi »

                        Certes, mais c'est la seule explication que je trouvais. Là, je sèche, et dieu sait si j'en ai fait des formulaires dynamiques.

                        Cela dit, je te soumets la façon très simple que j'utilise pour ajouter des sections à un formulaire

                        Elle demande deux lignes de code JS, qu'on peut même réduire en une seule.

                        <!DOCTYPE HTML><html lang="fr"><head>
                        <link rel="stylesheet" type="text/css" href="style.css">
                        <style type="text/css">
                        .section {margin: 1em; padding: 0.5em; background-color: #eee}
                        .section b {display: inline-block; width: 10em}
                        </style>
                        </head>
                        <body>
                        <form name=formu method=post>
                        <div id=membres>
                        </div>
                        <input type=button onclick="ajoutSection()" value="Ajouter un membre">
                        <p style="text-align:center"><input type=submit value="Envoyer"></p>
                        </form>
                        <div id=sample style="display: none">
                        <div class=section>
                        <b>Nom :</b> <input type=text name="nom[]"><br>
                        <b>Prénom :</b> <input type=text name="prenom[]"><br>
                        <b>Age :</b> <input type=text name="age[]"><br>
                        <b>Commentaire : </b><textarea name="comment[]"></textarea>
                        </div>
                        </div>
                        <script type="text/javascript">
                        function ajoutSection() {
                        // clonage de la section cachée en dehors du form
                        newElt = document.getElementById('sample').getElementsByTagName('div')[0].cloneNode(true);
                        // ajout dans le form
                        document.getElementById('membres').appendChild(newElt);
                        }
                        ajoutSection(); // pour afficher une section au départ
                        </script>
                        </body></html>

                         Si ça peut t'aider...

                        -
                        Edité par Domi65 12 décembre 2018 à 16:36:36

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 décembre 2018 à 8:58:05

                          Merci Domi65 pour ton code.

                          En testant directement dans ma page cela ne fonctionne pas, mais en ne gardant que ton code cela fonctionne très bien.

                          Je vais pouvoir chercher qu'est-ce qui ne va pas en allant pas à pas.

                          J'ai vais abuser, mais comment on pourrait ajouter un bouton de suppression par rapport à ton code ?

                          -
                          Edité par FabriceMichel7 14 décembre 2018 à 12:48:11

                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 décembre 2018 à 17:57:39

                            « comment on pourrait ajouter un bouton de suppression par rapport à ton code ? »

                            Je viens de voir cette demande.

                            C'est très simple aussi. Tu ajoute dans la section clonée un bouton te premettent de la supprimer.

                            Je mets le code en entier, vu que

                            1) j'ai commis quelques erreurs dans le premier (oubli de fermer le formulaire et ajouté les sections dans le div au lieu du form)

                            2) Il a foiré à la copie et je n'ai pas pu le corriger

                            Voilà, si ça se passe bien , il y a tout ici :

                            <!DOCTYPE HTML><html lang="fr"><head>
                            <meta charset="ISO-8859-1">
                            <style type="text/css">
                            .section {margin: 1em; padding: 0.5em; background-color: #eee}
                            .section b {display: inline-block; width: 10em}
                            form {border: 1px solid; padding: 0.5em}
                            </style>
                            </head><body>
                            <form name=formu method=post>
                            
                            </form>
                            <div id=membres>
                                </div>
                            	<input type=button onclick="ajoutSection()" value="Ajouter un membre">
                            	<p style="text-align:center"><input type=submit value="Envoyer">
                            	</p></form><div id=sample style="display: none">
                            	<div class=section>
                            	<b>Nom :</b><input type=text name="nom[]"><br>
                            	<b>Prénom :</b><input type=text name="prenom[]"><br>
                            	<b>Age :</b><input type=text name="age[]"><br>
                            	<b>Commentaire : </b><textarea name="comment[]"></textarea><br>
                                        <input type=button onclick="supprimer(this)" value="Supprimer ce membre">
                                </div>
                            </div>
                            <script type="text/javascript">
                            function ajoutSection() {     // clonage de la section cachée en dehors du form
                            newElt = document.getElementById('sample').getElementsByTagName('div')[0].cloneNode(true);
                            // ajout dans le form
                            document.formu.appendChild(newElt);}
                            // pour afficher une section au départ
                            ajoutSection();
                            
                            function supprimer(me) {
                                document.formu.removeChild(me.parentNode)
                            }
                            </script>
                            </body></html>



                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 décembre 2018 à 16:23:23

                              Merci Domi65 pour ton script.

                              L'ajout des sections dans le div m'allait très bien, donc si je veux adapter le bouton supprimer par rapport a ton premier code, il faudrait faire ça ?

                              function supprimer(me) {
                              document.getElementById('sample').removeChild(me.parentNode)
                              }

                              Autre question, dans mon formulaire, j'ai 2 parties ou je dois utiliser la fonction utiliserSection.

                              J'ai biaisé le problème en duplicant cette fonction mais est-il possible d'en garder qu'une et en mettant en paramètre de celle-ci l'id de la div ?

                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 décembre 2018 à 14:21:32

                                « L'ajout des sections dans le div m'allait très bien »

                                Je n'ai pas en tête l'arborescence de ta page.

                                Pour que la section qu'on clone ne vienne pas perturber les données envoyées en post, il vaut mieux la sortir du formulaire. Quant au div en question (sample), il faut bien entendu qu'il soit dans le formulaire. Après, tu fais ce que tu veux. Enfin presque, car si je ne dis pas de bêtise, l'argument de la fonction removeChild() doit être un enfant direct (et non pas l'enfant d'un enfant) de celui auquel est appliqué la fonction.

                                Donc quand tu fais elt1.removeChild(elt2), elt2 doit être enfant direct de elt1.

                                « est-il possible d'en garder qu'une et en mettant en paramètre de celle-ci l'id de la div ? »

                                Oui, et ta question contient la réponse !

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 janvier 2019 à 10:36:37

                                  Merci Domi65 pour ta réponse.

                                  Désolé de n'avoir pu répondre avant, n'ayant pu retravailler sur ce projet avec les fêtes de fin d'année.

                                  Avec tes conseils et tes recommandations, je m'en suis sorti et tout fonctionne comme je le souhaite.

                                  Merci encore une fois, et meilleurs vœux pour cette nouvelle année.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 janvier 2019 à 20:40:16

                                    Très heureux pour toi. Bonne année également.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    données dans variable POST

                                    × 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