IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Script de création de champ


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 32
    Points
    32
    Par défaut Script de création de champ
    Bonjour à tous, j'aurai besoin d'un petit coup de main pour un script de création de champ qui ne fonctionne pas.
    Voici déjà le code:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <!DOCTYPE html>
    <html>
     
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>sans titre 1</title>
     
    <script language="javascript">
    <!--
    /*function create_champ()
    {
    var i = parseInt(document.getElementById('nombre').value)
    var i = i + 1;
    if(i<'4'){
    document.getElementById('nombre').value = i;
    document.getElementById('zone_dynamique').innerHTML += '<div align="left" id="champ_"'+i+'> Nom du champ '+i+' :<input type="text" name="nom_test_'+i+'"> Choix '+i+' :<select name=" choix_test_'+i+'></select> <input name="suppr" type="button"  onClick="javascript:supprime_champ()" value="Supprimer un champ"></div>';
    }
    else{
    alert('Vous avez atteint le nombre maximum de ligne');
    exit();
    }
     
    }
    function supprime_champ(){
    	var cpt = parseInt(document.getElementById('nombre').value);
    	cpt--;
    	var parent = document.getElementById('zone_dynamique');
    	var NodeListe = parent.getElementsByTagName("div"); 
     
     
    	if( NodeListe.length >= 2 ){
    		var Enfant=NodeListe[NodeListe.length-1]
    		parent.removeChild(Enfant);
    		document.getElementById('nombre').value = cpt
    	}		
     
     
    }*/
     
     
    -->
    </script>
     
     
    <script>
      function choixChange(){
         var paragraphe = document.getElementById("paragrapheSupplementaire");
         paragraphe.innerHTML=document.getElementById("choix").hidden;
         if (document.getElementById("choix").value == "liste_1" || document.getElementById("choix").value == "bouton_1"){
            paragraphe.innerHTML+="<label>Rentrez les informations:</label>"
            +'<input name=sous_choix type="text">';
            /*+'<select name="orientation" id="orientation">'
            +'<option value="LP">LP</option>'
            +'<option value="master">master</option>'
            +"<option value=\"inge\">Ecole d'ingé</option>"
            +'<option value="boulot">Boulot</option>'
            +'<option value="autre">Autre</option>'
            +'</select>';*/
        
         }
      }
      choixChange();
    </script>
     
    </head>
     
    <body>
     
    <form id="test" name="test23" method="post" action="test_traitement23.php">
    Nombre de champs : <input name="nombre" id="nombre" type="text" value="1" size="3">
     
     
    	<div id="zone_dynamique">
    		<div align="left"> Nom du champ: 
    			<input name="nom_test" type="text"/>
    		Choix : <select name="choix_test" id="choix" onchange='choixChange();'>
    			<option value="test_1" selected="selected">Choisir un type</option>
    			<option value="champ_texte_1">Champ de texte</option>
    	        <option value="zone_email_1">Zone d'adresse e-mail</option>
    	        <option value="liste_1">Liste déroulante</option>
    	        <option value="bouton_1">Boutons radio</option>
    	        <option value="case_1">Cases à cocher</option>
    	        <option value="zone_texte_1">Zone de texte</option>
    		</select>
    		</div>
     
    		<div id="paragrapheSupplementaire">
     
            </div>
    		<input type="submit" value="envoyer"/>
    	</div>	
    </form>
     
    </body>
     
    </html>

    Et ma page de traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    print_r($_POST);
    $serveur = "localhost";
    $base = "xxx";
    $user = "root";
    $pass = "xxx";
     
    /*
    $mysqli est une nouvelle instance de la classe mysqli
    prédéfinie dans php et hérite donc de ses propriétés et méthodes
    connexion à la base de données
    */
    $mysqli = new mysqli($serveur, $user, $pass, $base);
    // si la connexion se fait en UTF-8, sinon ne rien indiquer
    $mysqli->set_charset("utf8");
    /*
    utilisation de la méthode connect_error
    qui renvoie un message d'erreur si la connexion échoue
    */
    if ($mysqli->connect_error) {
        die('Erreur de connexion ('.$mysqli->connect_errno.')'. $mysqli->connect_error);
    }
    else {
        echo 'connexion réussie : '.$mysqli->host_info;
    }
     
    $sql = '
    INSERT INTO `test23`(
    	`nom_test`, `choix_test`, `sous_choix`
    ) VALUES (
    	\''.$_POST['nom_test'].'\', \''.$_POST['choix_test'].'\', \''.$_POST['sous_choix'].'\'
    );
    ';
    $result = $mysqli->query($sql);
     
    echo $sql;
     
    $mysqli->close();	
     
    header("Location: test23.php");
     
    ?>
    En fait, je mets autant de champ que je veux dans une div pour créer un formulaire et grâce à mon code JS, je recopie ce qu'il y a dans la div pour me créer de nouveaux champs!
    C'est très bien mais je me heurte à certains problèmes notamment au niveau de la liaison avec la base de données.
    C'est à dire que dans ma base de données, mon champ nom va s’appeler "nom_test" alors que dans mon code JS, j'ai besoin d'incrémenter cette variable nom pour quelle soit différente (avec "nom_test_'+i+'" par exemple).
    Du coup, je ne vois pas comment faire en sorte que cette variable "nom_test_'+i+'" soit reconnu dans ma base de données?

    Auriez vous une idée pour moi svp?
    Merci d'avance!

    PS: c'est normal si le nom de mes variables "nom_test" et "choix_test" de mon formulaire ne correspondent pas à ceux inscrit dans le JS.

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    j'ai besoin d'incrémenter cette variable nom pour quelle soit différente (avec "nom_test_'+i+'" par exemple).
    C'est un besoin que tu t'imposes inutilement car il n'a pas lieu d'être. Seuls les id ont besoin d'être uniques dans la page.

    La technique habituelle pour traiter les champs ayant le même nom est d'utiliser une syntaxe de tableau :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="nom_test[]" type="text"/>
    Ainsi, dans ton code PHP, $_POST['nom_test'] sera un tableau classique que tu pourras parcourir à loisir.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Merci pour ta réponse rapide.
    Je n'avais pas pensé au tableau (j'ai honte ^^)
    Par contre pourrais tu m'expliquer comment adapter mon code JS avec ce tableau stp?

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    c'est plus une question de JavaScript, demande peut-être à un modérateur de déplacer ta discussion

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Bonjour à tous, je up la conversation car je suis bloqué sur mon problème JS.

    Pour expliquer, j'ai un outil formulaire qui permet à l'utilisateur de créer son formulaire de A à Z en donnant un nom et le type du champ.

    Mon problème est que je n'arrive pas à dupliquer le type si il s'agit d'un select ou d'une checkbox ou d'un bouton radio.

    Voici mon code avec la fonction JS qui me permet de rajouter des champs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <!DOCTYPE html>
    <html>
     
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>sans titre 1</title>
     
    <script language="javascript">
    <!--
    /*function create_champ()
    {
    var i = parseInt(document.getElementById('nombre').value)
    var i = i + 1;
    if(i<'4'){
    document.getElementById('nombre').value = i;
    document.getElementById('zone_dynamique').innerHTML += '<div align="left" id="champ_"'+i+'> Nom du champ '+i+' :<input type="text" name="nom_test_'+i+'"> Choix '+i+' :<select name=" choix_test_'+i+'></select> <input name="suppr" type="button"  onClick="javascript:supprime_champ()" value="Supprimer un champ"></div>';
    }
    else{
    alert('Vous avez atteint le nombre maximum de ligne');
    exit();
    }
     
    }
    function supprime_champ(){
    	var cpt = parseInt(document.getElementById('nombre').value);
    	cpt--;
    	var parent = document.getElementById('zone_dynamique');
    	var NodeListe = parent.getElementsByTagName("div"); 
     
     
    	if( NodeListe.length >= 2 ){
    		var Enfant=NodeListe[NodeListe.length-1]
    		parent.removeChild(Enfant);
    		document.getElementById('nombre').value = cpt
    	}		
     
     
    }*/
     
     
    -->
    </script>
     
     
    <script>
      function choixChange(){
         var paragraphe = document.getElementById("paragrapheSupplementaire");
         paragraphe.innerHTML=document.getElementById("choix").hidden;
         if (document.getElementById("choix").value == "liste_1" || document.getElementById("choix").value == "bouton_1"){
            paragraphe.innerHTML+="<label>Rentrez les informations:</label>"
            +'<input name=sous_choix type="text">';
            /*+'<select name="orientation" id="orientation">'
            +'<option value="LP">LP</option>'
            +'<option value="master">master</option>'
            +"<option value=\"inge\">Ecole d'ingé</option>"
            +'<option value="boulot">Boulot</option>'
            +'<option value="autre">Autre</option>'
            +'</select>';*/
     
         }
      }
      choixChange();
    </script>
     
    </head>
     
    <body>
     
    <form id="test" name="test23" method="post" action="test_traitement23.php">
    Nombre de champs : <input name="nombre" id="nombre" type="text" value="1" size="3">
     
     
    	<div id="zone_dynamique">
    		<div align="left"> Nom du champ: 
    			<input name="nom_test" type="text"/>
    		Choix : <select name="choix_test" id="choix" onchange='choixChange();'>
    			<option value="test_1" selected="selected">Choisir un type</option>
    			<option value="champ_texte_1">Champ de texte</option>
    	        <option value="zone_email_1">Zone d'adresse e-mail</option>
    	        <option value="liste_1">Liste déroulante</option>
    	        <option value="bouton_1">Boutons radio</option>
    	        <option value="case_1">Cases à cocher</option>
    	        <option value="zone_texte_1">Zone de texte</option>
    		</select>
    		</div>
     
    		<div id="paragrapheSupplementaire">
     
            </div>
    		<input type="submit" value="envoyer"/>
    	</div>	
    </form>
     
    </body>
     
    </html>
    Si quelqu'un a une idée sur la façon d'on on peut procéder, je suis preneur!

    Merci à tous!

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Bonjour,
    tu n'as pas essayé de passer par la méthode element.cloneNode() ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Bonjour, tout d'abord merci à NoSmoking pour la réponse qui marche nickel! Néanmoins, j'ai un petit souci quand je veux faire apparaitre mon champ "Paramètres". En fait quand je choisis "Liste déroulante" ou "Bouton radio" dans mon select, j'ai un code JS qui m'affiche un nouveau champ (Paramètres) et la personne y rentre ses paramètres. Ça, ça fonctionne très bien sauf quand je rajoute une nouvelle zone pour la création des nouveaux champs.
    En fait mon champ "Paramètres" n'arrive pas à se "cloner" et si j'ai 3 select, les 3 iront pointer sur le même champ.
    C'est plutôt problématique, surtout que j'ai presque fini.
    Est ce que quelqu'un pourrait savoir d'où ça provient?
    Sachant que Firebug me donne ceci comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: document.getElementById(...) is null
    Et je fais aussi parvenir mon code avec la modif de création de champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    <!DOCTYPE html>
    <html>
     
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
    <title>sans titre 1</title>
     
    <script language="javascript">
     
    function create_champ(){
    	var item = document.getElementsByTagName("div")[1];
    	var clone = item.cloneNode(true);
    	document.body.appendChild(clone);
    }
     
    function supprime_champ(){
    	var cpt = parseInt(document.getElementById('nombre').value);
    	cpt--;
    	var parent = document.getElementById('zone_dynamique');
    	var NodeListe = parent.getElementsByTagName("div"); 
     
     
    	if( NodeListe.length >= 2 ){
    		var Enfant=NodeListe[NodeListe.length-1]
    		parent.removeChild(Enfant);
    		document.getElementById('nombre').value = cpt;
    	}		
     
     
    }
     
     
    -->
    </script>
     
     
    <script>
      function choixChange(){
         var paragraphe = document.getElementById("paragrapheSupplementaire");
         paragraphe.innerHTML=document.getElementById("choix").value;
         if (document.getElementById("choix").value == "liste_1" || document.getElementById("choix").value == "bouton_1"){
            paragraphe.innerHTML+="<label>Rentrez les informations:</label>"
            +'<input name=sous_choix type="text">';
            /*+'<select name="orientation" id="orientation">'
            +'<option value="LP">LP</option>'
            +'<option value="master">master</option>'
            +"<option value=\"inge\">Ecole d'ingé</option>"
            +'<option value="boulot">Boulot</option>'
            +'<option value="autre">Autre</option>'
            +'</select>';*/
     
         }
      }
      choixChange();
    </script>
     
    </head>
     
    <body>
     
    <fieldset name="test">
    <legend>Test</legend>
    <form id="idTest" name="test23" method="post" action="test_traitement23.php">
    <!--Nombre de champs : <input name="nombre" id="nombre" type="text" value="1" size="3">-->
     
     
    	<div id="zone_dynamique">
    		<div id="test" align="left"> Nom du champ: 
    			<!--<input name="nom_test" type="text"/>-->
    			<textarea name="nom_test" id="id_nom" ></textarea>
    		Choix : <select name="choix_test" id="choix" onchange='choixChange();'>
    			<option value="test_1" selected="selected">Choisir un type</option>
    			<option value="champ_texte_1">Champ de texte</option>
    	        <option value="zone_email_1">Zone d'adresse e-mail</option>
    	        <option value="liste_1">Liste déroulante</option>
    	        <option value="bouton_1">Boutons radio</option>
    	        <option value="case_1">Cases à cocher</option>
    	        <option value="zone_texte_1">Zone de texte</option>
    		</select>
    		</div>
     
    		<div id="paragrapheSupplementaire">
     
    		</div>
     
    		<input type="button" onClick="javascript:create_champ()" value="Ins&eacute;rer un autre champ"/>
    		<input type="submit" value="envoyer"/>
    	</div>	
    </form>
    </fieldset>
     
    </body>
     
    </html>
    Merci d'avance!

    Cordialement.

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Plusieurs maladresse dans ton script.

    La première c'est d’appeler la fonction choixChange() avant que le DOM ne soit construit ce qui te vaut une magnifique ERREUR
    TypeError: document.getElementById(...) is null
    Ensuite dans la fonction tu fait appel à un getElementById qui récupère l'élément qui vient de déclencher la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function choixChange(){ // c'est l'élément "choix" qui appelle la fonction
         var paragraphe = document.getElementById("paragrapheSupplementaire");
         paragraphe.innerHTML=document.getElementById("choix").value;
    cela peut s'écrire avantageusement, en changeant la définition de la fonction, ajout d'un paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function choixChange(obj){
         var valeur = obj.value;  // récupération directe de la valeur du SELECT
         var paragraphe = document.getElementById("paragrapheSupplementaire");
         paragraphe.innerHTML= valeur;
        // et pour le test
         if ( valeur == "liste_1" || valeur == "bouton_1"){
          // la suite...
    san soublier de modifier le HTML comme suit
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    Choix : <select name="choix_test" id="choix" onchange='choixChange(this);'>
    on n'a même plus besoin de mettre une ID.

    Il ne faut pas également oublier que le clonage clone aussi l'ID de l'élément et celle ci doit être unique dans une page.

    Voila un bon début!

    Au passage <script language="javascript"> est obsolète et peut être remplacé par un simple <script> en HTML5.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2015
    Messages : 70
    Points : 32
    Points
    32
    Par défaut
    Merci, ça fonctionne un peu mieux mais je pense que je vais partir sur un autre fonctionnement plus simple, qui me permettra de ne gérer qu'une div à la fois.

    Merci encore.

Discussions similaires

  1. Script de création de base
    Par andlio dans le forum Oracle
    Réponses: 20
    Dernier message: 20/07/2005, 13h39
  2. Création de champs
    Par stailer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/02/2005, 17h14
  3. passage nom des contraintes de MPD au script de création BD
    Par marièmdiaw dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 14/01/2005, 13h18
  4. [IBExpert]Recuperer le script de création de la BD ?
    Par Sitting Bull dans le forum Outils
    Réponses: 2
    Dernier message: 01/10/2004, 11h15
  5. Réponses: 3
    Dernier message: 24/10/2003, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo