Bonjour,
Je suis actuellement en train de créer un formulaire où un utilisateur peut remplir des données qui seront insérés dans une base de donnée.
Cependant, il existe deux types de champs : les champs uniques (comme le nom du produit) et des champs potentiellement multiples (par exemple des liens vers une image du produit, ...). Mon but est de pouvoir permettre à l'utilisateur d'avoir plusieurs champs pour certains éléments du formulaire.
Au niveau du stockage des données $_POST, cela se fait simplement à l'aide d'un tableau:
On appelle les fonctions via $_POST['array'][0].
Avec du code JS, j'ai inséré dans mon formulaire un bouton rajoutant un champ à compléter :
http://i.imgur.com/j2PHrfd.gif
(Le + reste sur la dernière ligne, je ne sais pas trop pourquoi mais ce n'est pas le sujet ici)
Actuellement la fonction JS crée un champ dans le tableau 1 (c'est écrit en dur). Ma question est de savoir comment insérer un argument à ma fonction JS de manière à ce qu'elle dépende du bouton (Nouvelle méthode indiquée dans tableau 2).
J'ai essayé en rajoutant un argument à la fonction addField() mais l'id définissant la position du nouveau champ est déclaré dans div en dehors de la fonction. En insérant l'initialisation de cette variable dans la fonction le bouton "+" n'a plus aucun effet.
De même, j'en profite pour demander si vous avez des idées sur comment faire pour générer plusieurs champs qui sont liés. Par exemple si quelqu'un veut rajouter un lien, en cliquant sur "+" il faudrait faire apparaître un nouveau champ sur la ligne "lien_url" et sur la ligne "lien_nom".
Pour résumer :
Analyse
- Je travaille sur un formulaire
- J'ai inséré un bouton "+" permettant de rajouter un champ
- Je cherche à rendre la fonction JS dépendante du bouton (qu'en appuyant sur Button1, il sache qu'on travaille avec Button1 et pas Button2)
Infos
- L'id définit là où doit se situer le nouveau champ. Il est placé dans <td> avant le bouton afin de rajouter un champ après le premier champ, mais avant le bouton. En le plaçant dans <tr> il se mettait après le bouton.
- À terme certains champs contiendront plusieurs informations, il faut donc un bouton "+" sur une des deux lignes qui rajoute un champ pour les deux (nom du lien + url du lien par exemple).
- Le Form est placé dans une <table> afin d'aligner correctement les éléments mais il est possible de le faire dans un div (c'est pourquoi la variable dans la fonction JS s'appelle initialement div)
Édition, problème résolu :
Modifié par Ara (16 Jul 2015 - 15:45)
Je suis actuellement en train de créer un formulaire où un utilisateur peut remplir des données qui seront insérés dans une base de donnée.
Cependant, il existe deux types de champs : les champs uniques (comme le nom du produit) et des champs potentiellement multiples (par exemple des liens vers une image du produit, ...). Mon but est de pouvoir permettre à l'utilisateur d'avoir plusieurs champs pour certains éléments du formulaire.
Au niveau du stockage des données $_POST, cela se fait simplement à l'aide d'un tableau:
<input type="text" name="array[]" />
On appelle les fonctions via $_POST['array'][0].
Avec du code JS, j'ai inséré dans mon formulaire un bouton rajoutant un champ à compléter :
<table>
<tr>
<td>Element à un seul champ</td>
<td><input type="text" name="elt1" value="<?php echo "Element 1"; ?>"/></td>
</tr>
<tr>
<td>Tableau 1</td>
<td id="champ_1"><input type="text" name="tab1[]"></td>
<td><button type="button" onclick="addField()" >+</button></td> <!-- Ancienne méthode -->
</tr>
<tr>
<td>Tableau 2</td>
<td id="champ_2"><input type="text" name="tab2[]" value="<?php "Tableau 2" ?>"/></td>
<td><button type="button" onclick="addField('<?php echo $champ_2; ?>')" >+</button></td> <!-- Nouvelle méthode -->
</tr>
</table>
var div = document.getElementById('champ_1'); // champ_1 représente l'id du tr où se situe le bouton
function addInput(name){
var input = document.createElement("input");
input.name = name;
div.appendChild(input);
}
function addField() {
addInput("tab1[]");
}
http://i.imgur.com/j2PHrfd.gif
(Le + reste sur la dernière ligne, je ne sais pas trop pourquoi mais ce n'est pas le sujet ici)
Actuellement la fonction JS crée un champ dans le tableau 1 (c'est écrit en dur). Ma question est de savoir comment insérer un argument à ma fonction JS de manière à ce qu'elle dépende du bouton (Nouvelle méthode indiquée dans tableau 2).
J'ai essayé en rajoutant un argument à la fonction addField() mais l'id définissant la position du nouveau champ est déclaré dans div en dehors de la fonction. En insérant l'initialisation de cette variable dans la fonction le bouton "+" n'a plus aucun effet.
function addInput(name){
var input = document.createElement("input");
input.name = name;
div.appendChild(input);
}
function addField(position) {
var div = document.getElementById(position);
addInput("tab1[]");
}
De même, j'en profite pour demander si vous avez des idées sur comment faire pour générer plusieurs champs qui sont liés. Par exemple si quelqu'un veut rajouter un lien, en cliquant sur "+" il faudrait faire apparaître un nouveau champ sur la ligne "lien_url" et sur la ligne "lien_nom".
Pour résumer :
Analyse
- Je travaille sur un formulaire
- J'ai inséré un bouton "+" permettant de rajouter un champ
- Je cherche à rendre la fonction JS dépendante du bouton (qu'en appuyant sur Button1, il sache qu'on travaille avec Button1 et pas Button2)
Infos
- L'id définit là où doit se situer le nouveau champ. Il est placé dans <td> avant le bouton afin de rajouter un champ après le premier champ, mais avant le bouton. En le plaçant dans <tr> il se mettait après le bouton.
- À terme certains champs contiendront plusieurs informations, il faut donc un bouton "+" sur une des deux lignes qui rajoute un champ pour les deux (nom du lien + url du lien par exemple).
- Le Form est placé dans une <table> afin d'aligner correctement les éléments mais il est possible de le faire dans un div (c'est pourquoi la variable dans la fonction JS s'appelle initialement div)
Édition, problème résolu :
<table>
<tr>
<td>Element à un seul champ</td>
<td><input type="text" name="elt1" value="<?php echo "Element 1"; ?>"/></td>
</tr>
<tr>
<td>Tableau 1</td>
<td id="champ_1"><input type="text" name="tab1[]" value="<?php "Tableau 2" ?>"/></td>
<td><button type="button" onclick="addField('tab1[]',champ_1)" >+</button></td>
</tr>
<tr>
<td>Tableau 2</td>
<td id="champ_2"><input type="text" name="tab2[]" value="<?php "Tableau 2" ?>"/></td>
<td><button type="button" onclick="addField('tab2[]',champ_2)" >+</button></td>
</tr>
</table>
var champ1 = document.getElementById('champ_1');
var champ2 = document.getElementById('champ_2');
function addInput(name,champ){
var input = document.createElement("input");
input.name = name;
champ.appendChild(input);
}
function addField(nom,champ) {
addInput(nom,champ);
}
Modifié par Ara (16 Jul 2015 - 15:45)