Voici une solution purement PHP (pas de javascript) pour comprendre le principe. En fait, c'est un jeu de tableaux HTML/PHP.
Le principe est le suivant :
- 1. T'as un formulaire principal réservé pour l'identité des parents
2. Et selon un nombre d'enfants donné, un ou plusieurs formulaires pour les identités des enfants sont insérés dans le formulaire principal.
La technique :
Pour conserver les données du formulaire principal selon les changements du nombre des enfants, les valeurs des zones sont réimprimées par PHP à chaque submit GET/POST.
Et pour stocker toutes les données des enfants, on utilisera des tableaux dont les valeurs sont toujours réimprimées par PHP à chaque submit GET/POST.
On aura donc 2 types de zones de données à gérer:
- 1. La zone de données des parents (1 seule occurrence pour tout le formulaire)
2. La zone de données des enfants (1 ou plusieurs occurrences pour tout le formulaire)
En tout on aura 2 submits et un seul formulaire principal (fiches enfants comprises).
Le premier submit conserne le changement du nombre d'enfants et le second déclenche l'enregistrement de toutes les données.
Voici l'exemple:
Modèle de la zone de données des parents :
fiche_parents.htm
Code : Tout sélectionner
<p><b>Nom famille : </b><input type="text" name="nom_famille" value="<?php echo $_GET['nom_famille']; ?>" /></p>
<p><b>Prénom du Père : </b><input type="text" name="prenom_pere" value="<?php echo $_GET['prenom_pere']; ?>" /></p>
<p><b>Prénom de la mère : </b><input type="text" name="prenom_mere" value="<?php echo $_GET['prenom_mere']; ?>" /></p>
<p><b>Nom de jeune fille de la mère : </b><input type="text" name="nom_jeune_fille_mere" value="<?php echo $_GET['nom_jeune_fille_mere']; ?>" /></p>
<p><b>Nombre d'enfants :</b><input type="text" name="nombre_enfants" value="<?php echo ($_GET['nombre_enfants']?$_GET['nombre_enfants']:1); ?>" />
<input type="submit" value="Afficher formulaire enfants" /></p>
Remarque: PHP réimprime les valeurs du postage GET/POST
Modèle de la zone de données pour un enfant type :
fiche_enfant.htm
Code : Tout sélectionner
<p><b>Prénom de l'enfant : </b><input type="text" name="prenom_enfant[]" value="<?php echo $_GET['prenom_enfant'][$i]; ?>" /></p>
<p><b>Date de naissance : </b><input type="text" name="date_naissance_enfant[]" value="<?php echo $_GET['date_naissance_enfant'][$i]; ?>" /></p>
Remarque: les zones de données enfant sont nommées sous forme de tableau (se terminant par []) et PHP réimprime les valeurs du postage GET/POST
Et voici le corps du programme qui va gérer la construction et l'enregistrement du formulaire principal:
famille.php:
<form>
<?php
//Afficher le modèle de la zone de données des parents
include("fiche_famille.htm");
//Selon le nombre d'enfants, afficher le(s) formulaire(s) de(s) enfant(s)
$_GET['nombre_enfants'] = $_GET['nombre_enfants']>0?$_GET['nombre_enfants']:1; //par défaut, afficher zone de données pour un enfant
if ($_GET['nombre_enfants']>0){
for($i = 0; $i<$_GET['nombre_enfants']; $i++) {//0 est l'index du premier enfant
//Insérer le modèle de la zone de données enfant
include("fiche_enfant.htm");
}
}
?>
<p><input type="submit" name="enregistrer" value="Enregistrer" /></p>
</form>
L'algorithme est simple :
- 1. Dans tout les cas, on affiche la zone de données des parents.
2. On affiche les zones de données enfants selon le nombre d'enfants entré par l'utilisateur (mais, par défaut, on affiche une zone enfant)
Pour terminer le programme, on peut programmer l'enregistrement final en prenant en considération l'événement du bouton submit "enregistrer".
Exemple d'enregistrement dans une session:
<?php
//Enregistrement dans la Session
if ($_GET['enregistrer']){
//enregistrer la famille
$famille['nom_famille'] = $_GET['nom_famille'];
$famille['prenom_pere'] = $_GET['prenom_pere'];
$famille['prenom_mere'] = $_GET['prenom_mere'];
$famille['nom_jeune_fille_mere'] = $_GET['nom_jeune_fille_mere'];
$famille['nombre_enfants'] = $_GET['nombre_enfants'];
for($i = 0; $i<$_GET['nombre_enfants']; $i++){
$famille['enfants'][$i]['prenom_enfant'] = $_GET['prenom_enfant'][$i];
$famille['enfants'][$i]['date_naissance_enfant'] = $_GET['date_naissance_enfant'][$i];
}
$_SESSION['famille'] = $famille;
//Message de confirmation d'enregistrement
echo "<pre><b>Merci, votre enregistrement est pris en compte</b><ul>";
print_r($famille);
echo "</ul></pre>";
}
?>
ou bien, pour enregistrer les données dans un fichier :
<?php
//Enregistrement CSV
if ($_GET['enregistrer']){
//enregistrer la famille
$famille = array($_GET['nom_famille'], $_GET['prenom_pere'], $_GET['prenom_mere'], $_GET['nom_jeune_fille_mere'], $_GET['nombre_enfants']);
for($i = 0; $i<$_GET['nombre_enfants']; $i++){
$famille[] = $_GET['prenom_enfant'][$i];
$famille[] = $_GET['date_naissance_enfant'][$i];
}
$f = fopen('familles.csv', 'a'); //ouvre le fichier de données CSV en mode Ajout
fputcsv($f, $famille); //écrit les zones de données de la famille
fclose($f);
//Message de confirmation d'enregistrement
echo "<pre><b>Merci, votre enregistrement est pris en compte</b><ul>";
print_r($famille);
echo "</ul></pre>";
}
?>
ou bien en enregistrant par SQL:
<?php
//SQL
if ($_GET['enregistrer']){
//enregistrer la famille dans la table 'famille' clé primaire = 'nom_famille'
$sql = sprintf("INSERT INTO famille (nom_famille, prenom_pere, prenom_mere, nom_jeune_fille_mere, nombre_enfants) VALUES ('%s', '%s', '%s', '%s', '%s')"
, $_GET['nom_famille'], $_GET['prenom_pere'], $_GET['prenom_mere'], $_GET['nom_jeune_fille_mere'], $_GET['nombre_enfants']);
mysql_db_query("bd_test", $sql, mysql_connect('localhost', 'root'));
//
for($i = 0; $i<$_GET['nombre_enfants']; $i++){
//La table 'enfant' est liée à la table 'famille' par la clé étrangère 'nom_famille'
$sql = sprintf("INSERT INTO enfant (nom_famille, prenom_enfant, date_naissance_enfant) VALUES ('%s', '%s', '%s')"
, $_GET['nom_famille'], $_GET['prenom_enfant'][$i], $_GET['date_naissance_enfant'][$i]);
mysql_db_query("bd_test", $sql, mysql_connect('localhost', 'root'));
}
mysql_close();
//Message de confirmation d'enregistrement
echo "<pre><b>Merci, votre enregistrement est pris en compte</b><ul>";
print_r($_GET);
echo "</ul></pre>";
}
?>