Formulaire dynamique

Petit nouveau ! | 4 Messages

23 mars 2006, 12:59

Bonjour !
Voila, je dois créer un formulaire de saisie (jusqu'ici tout va bien), qui a cette ganache

Code : Tout sélectionner

<form action='./index.php?page=ajoutNotice' method='post'> <select name=auteur[]> <tr><td> Auteur Principal </td></tr> <tr><td></td><td><?php include("liste_auteurs.inc.php"); ?>&nbsp;<input type=text name=auteur[]> </td></tr>
j'aimerais créer un lien ou bouton qui permet d'insérer un autre "Auteur principal" or je ne sais pas comment faire, car le javascript est loin d'etre mon ami.

Pouvez vous m'aidez ?

Merci :wink:

Eléphant du PHP | 312 Messages

23 mars 2006, 15:47

Je ne l'ai jamais fait donc je peux pas te donner un exemple de code mais j'ai une petite idée sur le principe de fonctionnement :
tu fais un bouton "submit" qui va recharger ta page (donc avec toutes tes données en POST) avec un tag (par exemple un champ caché du formulaire placé à 1).
Quand tu recharges le formulaire, tu regarde ce champ caché.
S'il est à 1, ça veut dire que l'utilisateur veut pas traiter ses données mais ajouter un bloc de plus, tu récris alors ton formulaire (en remettant les données contenues dans $_POST) avec ton bloc de plus.
S'il est à 0, c'est que c'était le vrai bouton submit, dans ce cas là tu traites les données normalement (insertion en base par exemple).

Une solution serait sinon de faire encore plus intervenir le javascript pour faire en sorte de générer des blocs en plus dans le formulaire.

Eléphant du PHP | 312 Messages

23 mars 2006, 18:47

Je viens justement d'être confronté à la même problématique dans le cadre d'un projet, voici grosso-modo mon code.
<?php
session_start();

// On commence par regarder si notre "faux" bouton de submit a été utilisé, autrement dit s'il existe une valeur "fake_submit" dans $_POST
if (isset($_POST['fake_submit'])) {
   // L'utilisateur a cliqué sur notre faux bouton, ça veut dire qu'il veut ajouter un "bloc" de plus à son formulaire.
   // On regarde donc la variable "num_bloc" sauvée en session pour savoir combien de bloc ça nous fait à afficher. On incrémente cette valeur si elle existe, sinon on la met à 2 (par défaut on affiche donc un seul bloc).
   if (isset($_SESSION['num_bloc'])) {
      $_SESSION['num_bloc'] += 1;
   } else {
      $_SESSION['num_bloc'] = 2;
   }
}
?>
<form action='post'>
   Nom #1 : <input type='text' name='nom1'
<?php
// S'il existe une valeur $_POST['nom1'] (ou $_POST['prenom1']), cela signifie que l'utilisateur a déjà rechargé la page pour ajouter un bloc, donc on remet les valeurs qu'il avait entré avant de recharger la page.
if (isset($_POST['nom1'])) {
  echo " value='".$_POST['nom1']."'";
}
echo "/><br/>";
?>
   Prénom #1 : <input type='text' name='prenom1'
<?php
if (isset($_POST['prenom1'])) {
  echo " value='".$_POST['prenom1']."'";
}
echo "/><br/>";

// On a fini notre premier bloc (obligatoire), maintenant on va afficher autant de bloc qu'il en faudra. En fait, il en faut soit 1 seul parce que l'utilisateur n'a pas cliqué sur "Ajouter utilisateur", soit il en faut plusieurs et pour savoir combien il nous suffit de regarder la variable de session "num_bloc", que nous incrementons à chaque fois que l'utilisateur click sur  "Ajouter utilisateur".
if (isset($_SESSION['num_bloc'])) {
   for ($i = 2; $i <= $_SESSION['num_bloc']; $i++) {
?>
   Nom #<?php echo $i; ?> : <input type='text' name='nom<?php echo $i; ?>'
<?php
      if (isset($_POST['nom'.$i])) {
         echo " value='".$_POST['nom'.$i]."'";
      }
      echo "/><br/>";
?>
   Prénom #<?php echo $i; ?> : <input type='text' name='prenom<?php echo $i; ?>'
<?php
      if (isset($_POST['prenom'.$i])) {
         echo " value='".$_POST['prenom'.$i]."'";
      }
      echo "/><br/>";
   }
}
?>
   <input type='submit' name='submit' value='Sauver'/><br/>
   <input type='submit' name='fake_submit' value='Ajouter utilisateur'/><br/>
</form>
Enfin, voici le bloc se trouvant normalement en tête de fichier (je le met ici pour éviter d'embrouiller les esprits).
Ce bloc est chargé de faire l'insertion des données en base.
if (isset($_POST['submit'])) {
   // On vérifie que num_bloc existe, sinon ça signifie qu'il n'y a qu'un seul bloc à insérer
   if (isset($_SESSION['num_bloc'])) {
      $max = $_SESSION['num_bloc'];
   } else {
      $max = 1;
   }
   for ($i = 1; $i <= $max; $i++) {
      $requete = "INSERT INTO Utilisateurs ('nom', 'prenom') VALUES (";
      $requete .= $_POST['nom'.$i];
      $requete .= ", ";
      $requete .= $_POST['prenom'.$i];
      $requete .= ")";
      mysql_query($requete);
   }
} else {
   // tout le code du premier pavé
}
Et voila !
Note : je n'ai pas testé ce code, le mien est différent (j'utilise QuickForm, DB_Table et ModeliXe, ce qui ne facilitait pas grand chose pour la compréhension du code, donc j'ai faire un équivalent en php "light").

Petit nouveau ! | 4 Messages

24 mars 2006, 10:54

Hum, merci, je vais modifier deux trois trucs pour coller avec ma thématique, mais sinon merci beaucoup.