Page 1 sur 1

affichage tableau pour mise à jour enregistrement (case à co

Posté : 09 oct. 2007, 10:19
par jay64
Bonjour,

J'ai une table contenant un certain nombre d'enregistrements qui ont chacun une dizaine de champs dont le dernier est un bouléen.
Je voudrais créer une page qui m'affiche dans un tableau l'ensemble des enregistrents retournés par ma requete, mais avec la dernière colonne qui me présenterait sous forme de case à cocher l'état du booléen pour chaque enregistrement. Ensuite, je voudrais être capable d'agir sur cette case à cocher et ainsi mettre à jour mes enregistrements concernés.

Je ne sais pas trop comment "fabriquer" la chose. Pourriez-vous m'aider ?

Merci !

Jay

Posté : 09 oct. 2007, 10:39
par Ryle
PHP génère du code html, tu peux donc l'utiliser pour générer un input de type checkbox, voire même simplement pour définir si la case est cochée où non en ajoutant l'attribut "checked" à l'intérieur de ton input :
<input type="checkbox" name="xxx" value="true" <?php if (...) echo 'checked'; ?> />
Le test étant simplement de vérifier si ton booléen est à vrai.

Lorsque le formulaire est soumit, une case à cocher n'est envoyée que si elle a été cochée. Ainsi, si tu récupères la variable $_POST['xxx'] (ou $_GET le cas échéant), c'est que la case 'xxx' a été cochée.

Tu peux voir également la FAQ pour trouver des expliquations sur comment récupérer une liste de case à cocher :)

Posté : 09 oct. 2007, 11:04
par Tracker
<input type="checkbox" name="xxx" value="true" <?php if (...) echo 'checked'; ?> />
Tu peux même aller un peu plus loin. Comme tu génères un tableau (donc plusieurs enregistrement) et souhaites appliquer un traitement aux éléments selectionnés une fois les données postées, tu peux utiliser des noms de champs indexés pour les check:
?><table><?php 
while ($row = ....)
{
?><tr>.....<input type="checkbox" name="cb[<?php echo $row['id'] ?>]" value="true" <?php if (...) echo 'checked="checked"'; ?> />....</tr><?php
}
?></table><?php
Coté serveur, la variable $_POST['cb'] est un tableau contenant en clé les id selectionnés...

Posté : 10 oct. 2007, 11:32
par jay64
Ok, c'est parfait, jusqu'à là, je m'en sors !

Maintenant, là où je coince, c'est pour exploiter mon tableau retourné par $_POST['cb']

En effet, je voudrais que pour tous mes Id récupérés dans ce tableau, je puisse faire un update des enregistrements correspondants. :?

Je ne sais donc pas comment formuler ma boucle en récupérant chaque Id du tableau ...

Merci !

Posté : 10 oct. 2007, 11:41
par Ryle
Ce que je ferais, c'est définir mes lignes ainsi :
<input type="text" name="champ1[<?php echo $id; ?>]" ... />
<input type="text" name="champ2[<?php echo $id; ?>]" ... />
<input type="checkbox" name="cb[]" value="<?php echo $id; ?>" ... />
...
Ainsi, lorsque tu soumets le formulaire, tu vas récupérer tous les champs sous forme d'un tableau indexé par l'id (print_r($_POST['champ1'])) et la liste des id qui ont été cochés dans $_POST['cb'].
Tu peux ainsi parcourir le tableau $_POST['cb'] avec un foreach() pour récupérer les id cochés un a un et aller chercher la valeur correspondante dans les tes tableaux de valeurs ($_POST['champ1'][$id]) pour constituer ton update :)

(chais pas si chuis très clair)

Posté : 10 oct. 2007, 12:06
par jay64
Tu peux ainsi parcourir le tableau $_POST['cb'] avec un foreach() pour récupérer les id cochés un a un et aller chercher la valeur correspondante dans les tes tableaux de valeurs ($_POST['champ1'][$id]) pour constituer ton update :)
Merci Ryle. Clair, tu l'es, si ce n'est que je ne sais pas comment rédiger mon foreach(). Je ne sais pas comment rédiger la structure de boucle selon ce tableau que je parcoure. :cry:

Posté : 10 oct. 2007, 12:21
par Ryle
Le foreach() va simplement parcourir les élément du tableau "un à un" (dixit M. Rocard)
$tab = array (1, 2, 5);
foreach ($tab as $val) {
  ...
}
Cette instruction va parcourir le tableau $tab et stocker dans $val la valeur trouvée pour chaque itération. Tu vas donc avoir $val==1, puis $val==2 et enfin $val==5. C'est ce que va te retourner $_POST['cb'] : uniquement les valeurs des cases qui ont été cochées.

A côté de cela, tu vas avoir un tableau de résultat pour chaque champ auquels tu auras collé des [] dans le nom. Et puisque l'id aura été spécifé entre les crochets, ces tableaux seront indéxés :
$_POST['champ1'] => array (
  1 => 'valeur de champ1 à la ligne 1',
  2 => 'valeur de champ1 à la ligne 2',
  3 => 'valeur de champ1 à la ligne 3',
  4 => 'valeur de champ1 à la ligne 4',
  5 => 'valeur de champ1 à la ligne 5'
);
Il te suffit donc de récupérer les valeur de $_POST['champ1'][1], $_POST['champ1'][2] et $_POST['champ1'][5] pour avoir les valeur associées aux cases qui ont été cochés et construire ta requête de mise à jour :
foreach ($_POST['cb'] as $val) {
  $champ1 = $_POST['champ1'][$val];
  ...
  $sql = ...  
  mysql_query($sql) ... 
}

Posté : 10 oct. 2007, 13:56
par jay64
bon, je tourne autour du pot, il me manque un truc, malgré tes trés bonnes explications Ryle !

J'explique :
un "print_r($_POST['cb']);" me renvoie ceci : Array ( [15] => true )
Normal, je n'ai coché qu'une seule case dans mon formulaire source.

Dans ma boucle, ce ne sont pas les valeurs "true" qui m'intéressent, mais les différents identifiants d'enregistrements qui renvoient true.
Ici par exemple, c'est le 15 qui m'intéresse et que je voudrais utiliser pour mon update.

Posté : 10 oct. 2007, 14:00
par Ryle
Vi, parce que tu n'as pas fait attention dans le formulaire que je te suggérais de mettre en place, j'ai viré l'id d'entre les crochets et ai remplacé la valeur "true" par l'id, puisqu'il n'est pas nécessaire d'avoir un tableau indexé de "true", tout ce que l'on veut étant juste les valeurs :)

Ceci dit, même à partir de ton tableau indexé, tu peux faire appel à la fonction array_keys() pour récupérer uniquement les clés du tableau. C'est un petit peu plus lourd au niveau traitement, mais le resultat est le même, un tableau simple contenant uniquement les ids des cases cochées qu'il ne te reste plus qu'à passer au foreach :)

Posté : 10 oct. 2007, 14:30
par jay64
Ok, c'est parfait, ça marche nickel en mettant à jour mon formulaire !
Merci Ryle ! :wink: