Bonsoir,
J'ai trouvé pas mal de choses sur le net, mais rien qui me permette de résoudre mon énigme.
Pour l'instant je ne me suis pas penché sur la présentation (donc emploi d'une table html) ni sur ma séparation traitement/présentation.
Objectif : A partir d'une form, récupérer les checkboxs cochés ET non cochés, et les noms correspondants (le nom d'une checkbox est le nom du champ dans la bdd), ce pour me permettre de faire directement mon update de table dans le fichier qui réceptionne les données.
Problème... Une checkbox non cochée n'existe pas, et n'est pas passée à la page d'après. Du coup, pas possible de repasser facilement dans la bdd un champ à 0 si on ne sait pas lequel...
Question : quelqu'un aurait-il une piste pour réaliser cela simplement, oui suis-je obligé de tester champ par champ (Le but serait, en cas de modif du formulaire, d'éviter d'avoir à refaire le fichier qui réceptionne les données... Et même mieux, pourquoi pas ensuite faire du fichier un endroit qui réceptionne les données de formulaires divers, et qui est capable de les traiter sans redonner les champs concernés) ?
Les fichiers :
Fichier construisant le formulaire :
<?php
if(isset($_SESSION) and array_key_exists('id_ok',$_SESSION) and $droits_user -> aledroit(4) == true)
{
// Affichage du menu
include ($listeroutes -> getemplacement("gene_menu_admin"));
// On va chercher l'id de l'utilisateur à considérer :
$userid = $_GET['numuser'];
// Instanciation d'une classe.
$administre_user = new controle_acces($req_sql, $userid);
// On récupère tous les rôles actuels
$tous_roles = $administre_user -> recup_tous_roles();
// Nombre de rôles existants
$nbroles = count($tous_roles);
//$nbroles = count($administre_user -> roles_user);
// Implémentation du formulaire, avec l'état de validation de l'utilisateur, les rôles possibles et ceux qu'il a.
//$valide = $administre_user -> isvalide;
echo "<BR>";
echo "<FORM method=post action='".$listeroutes -> geturl('gene_admin_modif_droits').'&numuser='.$_GET['numuser'].'&nbroles='.$nbroles."'>";
echo "<TABLE BORDER=1>";
echo "<TR>";
echo "<TD>Validation</TD>";
echo "<TD colspan=2><INPUT type=checkbox name=tab[id] value=1";
if ($administre_user -> isvalide == 1)
{
echo " checked";
}
echo "></TD>";
echo "</TR>";
echo "<TR>";
echo "<TD>";
echo "Nom du rôle";
echo "</TD>";
echo "<TD>";
echo "Rôle accordé ?";
echo "</TD>";
echo "<TD>";
echo "liste des droits associés";
echo "</TD>";
echo "</TR>";
// On crée une ligne par rôle existant.
// 1ere cellule, on indique le rôle.
// 2e cellule, on indique si l'utilisateur a le rôle en question par une case à cocher.
// 3e cellule, on indique les permissions correspondantes du rôle.
for ($i = 0; $i < $nbroles; $i++)
{
echo "<TR>";
echo "<TD>";
echo $tous_roles[$i][1];
echo "</TD>";
echo "<TD align='center'><INPUT type=checkbox name=tab[".$tous_roles[$i][1]."] value=1";
if ($administre_user -> alerole($tous_roles[$i][0]) == true)
{
// Si l'utilisateur a le rôle évalué, alors on coche la case.
echo " checked";
}
echo "></TD>";
echo "<TD>";
$perms = NULL;
$perms = $administre_user -> recup_perms_role($tous_roles[$i][0]);
$nbperms = count($perms);
for ($ind = 0; $ind < $nbperms; $ind++)
{
echo $perms[$ind][1]."<BR>";
}
echo "</TD>";
echo "</TR>";
}
echo "</TABLE>";
echo "<BR><INPUT type='submit' value='Valider' />";
echo "</FORM>";
}
else
{
// L'utilisateur n'a pas le droit d'accéder à la page.
include ($listeroutes -> getemplacement("pasledroit"));
}
?>
Fichier réceptionnant les données :
<?php
// On va récupérer les valeurs de la page précédente, puis effectuer les modifications dans la base de données.
// Pour cela, aller chercher l'id de l'utilisateur concerné.
// Mettre à jour la base de données.
$iduser = $_GET['numuser'];
$nbroles = $_GET['nbroles'];
/*foreach ($_POST as $index=>$valeur)
{
echo $index;
echo $valeur;
}*/
foreach($_POST['tab'] as $index=>$case)
{
echo $index;
echo $case;
}
echo "fait";
?>
Extrait de la classe qui permet de construire le nom des checkboxs :
//...
private function get_roles()
{
// Fonction ramenant l'ensemble des rôles d'un utilisateur.
// param = 0 => Rôles de l'utilisateur
// param = 1 => Tous les rôles
switch ($this -> param)
{
case 0:
$this -> requete = "SELECT gen_user_roles.id_role, nom_role FROM gen_user_roles inner join gen_roles on gen_user_roles.id_role = gen_roles.id_role WHERE id_user = ".$this -> iduser;
break;
case 1:
$this -> requete = "SELECT id_role, nom_role FROM gen_roles";
break;
}
$this -> retour = $this -> connexion_mysql -> selectionner($this -> requete);
$this -> ind = 0;
switch ($this -> param)
{
case 0:
while ($this -> ligne = $this -> retour -> fetch())
{
$this -> roles_user[$this -> ind][0] = $this -> ligne -> id_role;
$this -> roles_user[$this -> ind][1] = $this -> ligne -> nom_role;
$this -> ind = $this -> ind + 1;
}
return $this -> roles_user;
break;
case 1:
while ($this -> ligne = $this -> retour -> fetch())
{
$this -> liste_roles[$this -> ind][0] = $this -> ligne -> id_role;
$this -> liste_roles[$this -> ind][1] = $this -> ligne -> nom_role;
$this -> ind = $this -> ind + 1;
}
return $this -> liste_roles;
break;
}
}
public function recup_tous_roles()
{
// On récupère tous les rôles
$this -> param = 1;
$this -> liste_roles = $this -> get_roles();
return $this -> liste_roles;
}
Si je n'ai pas été clair, n'hésitez pas... Merci !