Checkboxs non cochées... de noms inconnus

Eléphanteau du PHP | 29 Messages

04 juin 2012, 23:00

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 !

Mammouth du PHP | 2278 Messages

05 juin 2012, 07:09

Diverses remarques :
  • dans le code HTML,
    • les majuscules sont exclues depuis un bon moment
      <input ..... > devient <input .... />
      
      <br> devient <br />
      
  • dans le formulaire
    • est-il nécessaire de passer par des checkbox ? parce que des boutons radio, au moins on est sûr qu'une des deux valeurs est sélectionnée.
    • je trouve qu'il serait plus clair de constituer une chaîne comme ceci:
      $table = "<table......>";
      $checked_1 = ($alerole1) ? "checked = checked" : "";
      $role_1 =  "<input type = 'checkbox'  name= 'roles[]' $checked_1 />"; 
      ...
      $table .= $role_1;
      print "$table";
      
  • dans le script qui reçoit
pour chaque checkbox:
$valeur = (isset($_POST['nom_de_var']) ? $_POST['nom_de_var'] : 0;
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

05 juin 2012, 08:01

Si la valeur de la checkbox n'a pas d'importance (attribut value) et que seul le caractère coché ou non compte, il suffit de prendre isset($_POST['maCheckbox']) comme valeur. On a ainsi vrai si coché et faux sinon.

$maCheckbox = isset($_POST['maCheckbox']);

Autrement <br> ou <br /> dépend de la norme choisit pour faire ces pages xhtml demandant de fermer toutes les balises mais pas html.

Eléphanteau du PHP | 29 Messages

05 juin 2012, 19:24

Merci pour ces deux réponses !

Par rapport à ça

=> Ok pour le HTML. J'ai trouvé un doc de transition de html vers xhtml. Ca permettra de me mettre à jour et de revoir un peu mon code pour qu'il soit bon.

=> Pour les autres commentaires, c'est vrai que je me suis peut être un peu enfermé dans la "checkbox".
Passer en bouton radio me semble pas mal (Liste déroulante aussi, mais moins pratique).
Je vais creuser la piste de :
- Nommer chaque doublette de boutons radio (ok / nok) avec le nom du champ de la bdd => En récupérant le nom des séries de boutons radio, je pourrai ainsi peut être re-fabriquer ma requête SQL.
- Utiliser les valeurs des boutons radios avec les valeurs à réinjecter dans la bdd => Et donc compléter la requête.
Ca me donnera une base pour une fonction "générique" pouvant être réutilisée depuis plusieurs endroits du site pour mettre à jour la table à partir de formulaires...

A creuser !

Eléphanteau du PHP | 29 Messages

05 juin 2012, 22:45

C'est fait et tout marche, merci :).