Créer un formulaire dynamique

Eléphant du PHP | 164 Messages

04 mai 2011, 23:47

Bonjour à tous,

Voilà mon problème :
Je veux gérer la répartition de colis pour les dossiers de mon entreprise.
Pour chaque dossier, il y a un nombre X de colis.
Pour chaque dossier, on crée des éléments (le nombre varie pour chaque dossier)
Pour chaque colis, on doit attribuer une quantité sur chaque élément qui composent le dossier.

Donc à ce stade on a les tables DOSSIERS, ELEMENTS et COLIS



Je veux pouvoir cliquer sur "modifier le colis" dans ma liste de colis, et y trouver la liste des éléments (qui composent ce dossier) avec un champ texte pour y insérer une quantité.

Une table REPARTITION vient donc s'ajouter, contenant l'id des tables DOSSIERS, ELEMENTS et COLIS + un champ "quantite"
Quand on arrive sur la page de modification des colis, on vérifie si les champs existent pour ce colis, si ce n'est pas le cas un insert ajoute la ligne correspondant à l'élément manquant, pour ce colis (car un élément peut être ajouté en cours de remplissage de ma liste, il faut donc vérifier à chaque fois qu'on modifie une quantité que chaque élément est créé dans la table REPARTITION, et l'y ajouter si ce n'est pas le cas).
Jusque ce point, mon script fonctionne.

Ma question est : Comment faire pour générer la liste des éléments sur la page de modification, et surtout de traiter les infos envoyées par le formulaire ? Faut-il utiliser les array et de quelle façon ?
Actuellement j'ai un while qui me créé des inputs, ça marche impeccable, c'est le traitement qui merde, je n'arrive pas à updater mes valeurs.

Help !

devlop78
Invité n'ayant pas de compte PHPfrance

05 mai 2011, 01:43

C'est pas clair du tout :?

Eléphant du PHP | 164 Messages

05 mai 2011, 08:04

Ah ... euh ...

Disons que je veux faire un formulaire de modification de mes champs, mais leur nombre varie. Il faut donc créer un formulaire dynamique qui se construit tout seul (<input type=text etc)

Exemple :
Sur le dossier A j'ai 4 elements
Sur le dossier B j'ai 13 elements

Pour le colis 1 du dossier A j'aurai donc 4 champs input
Pour le colis 1 du dossier B j'aurai donc 13 champs input

ViPHP
ViPHP | 2577 Messages

05 mai 2011, 08:25

Bonjour,

Sur le principe, il faut utiliser des tableaux dans les input :
<input type="text"> name="nom[1]" value="azerty">

Ainsi tu crées les inputs dans une boucle selon le nombre nécessaire.

Pour les récupérés, tu utilises $_POST['nom'][1] et ainsi de suite.

ViPHP
ViPHP | 2291 Messages

05 mai 2011, 19:47

Salut,

Tu crée tes input dans une boucle (WHILE) par exemple

Exemple :
$sql = " SELECT * FROM table ";
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

$form = '<form name="" action="" method="post">'."\n";

while($row = mysql_fetch_assoc($req))
{
 	 $form .= '<input name="Name[]" type="text" value="'.$row['valeur'].'"><BR />'."\n";
}

$form .= '</form>'."\n";

echo $form;
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
ViPHP | 2577 Messages

05 mai 2011, 19:55

Bonjour,

J'ai quelques réticence à Name[] et je préfère Name[1], Name[2] de peur d'un mélange entre les éléments d'un tableau.

ViPHP
ViPHP | 2291 Messages

05 mai 2011, 20:32

Bonjour,

J'ai quelques réticence à Name[] et je préfère Name[1], Name[2] de peur d'un mélange entre les éléments d'un tableau.
Cela ne changera rien il affichera toujours le même tableau de 0 à x et cela même si tu fait Name[1]

Exemple a Name[]
Array
(
    [Name] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
        )

)


Et avec Name[1], [2] etc...
Array
(
    [Name] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => 
            [6] => 
            [7] => 
            [8] => 
            [9] => 
        )

)

Car avec des elements entre crochet php assigne toujours 0 et incrémente les indices suivant :)
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 60 Messages

06 mai 2011, 00:28

Bonjour,

sans remettre en cause ce qui a été dit plus haut.
Je propose également une solution (si tu n'es pas allergique au php orienté objet). Cette solution se base sur la classe html_element implémentée par David Walsh (et accessoirement très concise) cf. http://davidwalsh.name/create-html-elem ... ment-class

ça ne t'affranchira pas de boucles et autres structure algorithmiques mais je pense que ton code pourrait gagner en sémantique (oui je sais, ça ne fait pas partie de ton cahier des charges mais bon).

Exemple.
[php]
$form = '<form name="" action="" method="post">'."\n";

while($row = mysql_fetch_assoc($req))
{
$form .= '<input name="Name[]" type="text" value="'.$row['valeur'].'"><BR />'."\n";
}

$form .= '</form>'."\n";[/php]

deviendrait

[php]// Création de l'élément form
$form = new html_element('form');
$form->set('name','');
$form->set('action','');
$form->set('method','post');

// Insertion des input à l'intérieur de l'élément form
while($row = mysql_fetch_assoc($req))
{
$input = new html_element('input');
$input->set('name','Name[]');
$input->set('type','text');
$input->set('value',$row['valeur']);
$form->inject($input);
}

// Affichage du html généré
$form->output();[/php]

C'est certes plus long à écrire mais c'est une autre façon de voir la vie.

Bon courage.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.

ViPHP
ViPHP | 2291 Messages

06 mai 2011, 16:32

Faut le faire à fond alors :)
// Création de l'élément form
 $form = new html_element('form');
 $form->set('name','');
 $form->set('action','');
 $form->set('method','post');
 
// Insertion des input à l'intérieur de l'élément form
 while($row = mysql_fetch_objet($req))
 {
 $input = new html_element('input');
 $input->set('name','Name[]');
 $input->set('type','text');
 $input->set('value',$row->valeur);
 $form->inject($input);
 }
 
// Affichage du html généré
 $form->output();
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 164 Messages

07 mai 2011, 00:19

Waou waou waou on se calme là !!! MDR

Bon merci je me doutais que les array me tomberaient sur la tête un jour !
Je tente ma chance et je reviens pleurnicher si nécessaire :o)

Merci à vous tous en attendant.

@ GiorgioLino : merci pour la culture mais ça fait beaucoup pour cette fois ci ^^ Je suis néanmoins ébahi devant ce que tu m'as présenté. Je met ça de côté pour le regarder à tête reposée.

rafiki14
Invité n'ayant pas de compte PHPfrance

10 mai 2011, 10:17

Bonjour à tous,

J'ai essayé votre code avec la boucle while mais je ne comprend pas ce qu'il faut mettre dans les crochets de $row à la place du mot 'valeur' dans $row['valeur']?
Je suis débutant en php !
Merci d'avance pour votre aide.
:oops:

Eléphant du PHP | 60 Messages

10 mai 2011, 12:54

Bonjour,

'valeur' est le nom d'un champ requêté par...la requête.

Exemple:
Soit une table liste avec (entre autres) les champs nom et prénom et comportant 2 enregistrements.
la requête "SELECT nom, prenom FROM liste" renverra les nom et prenom pour les 2 enregistrements.

Ainsi pour les récupérer, tu auras le choix :
- $row['nom'] et $row['prenom'] si tu as utilisé un mysql_fetch_assoc
ou
- $row->nom et $row->prenom si tu as utilisé un mysql_fetch_object

Tu comprends le principe ?
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.

rafiki14
Invité n'ayant pas de compte PHPfrance

10 mai 2011, 14:57

ok en faite je doit copier la ligne (qui est à l'intérieur du while):

Code : Tout sélectionner

$form .= '<input name="Name[]" type="text" value="'.$row['valeur'].'"><BR />'."\n";
en remplaçant à chaque fois 'valeur' par le nom de mon champ?
C'est un peu long si on a beaucoup de champs dans notre table non?

Merci pour la réponse!!

Eléphant du PHP | 60 Messages

10 mai 2011, 21:40

en remplaçant à chaque fois 'valeur' par le nom de mon champ?
C'est cela.
C'est un peu long si on a beaucoup de champs dans notre table non?
Et tu voudrais faire comment autrement ? On n'a rien sans rien mon ami.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.