Problème de validation de checkbox

CyberAlbert
Invité n'ayant pas de compte PHPfrance

18 janv. 2006, 18:20

Bonjour à tous,

Bon je vous explique mon problème...
J'ai un petit formulaire de recherche dans lequel il y a des checkox... 5 pour etre precis.
Le truc, c'est que lorsque que j'en coche un (le "maitre", qui a pour valeur 0), je voudrais que tous les autres se cochent et inversement, il faudrait que le "maitre" se decoche s'il manque un des 4 autres checkbox.

Je vous met mon code dans la page index (le formulaire où les checkbox se trouvent s'appelle "saisie") :
<p>
  <label for="all"><input type="checkbox" name="choix[]" id="choix[]" value="0" onClick="verif_checkbox();" checked />Toutes les informations</label>
  <label for="computer"><input type="checkbox" name="choix[]" id="choix[]" value="1"  onClick="verif_checkbox();" checked />Ordinateur</label>
  <label for="network"><input type="checkbox" name="choix[]" id="choix[]" value="2"  onClick="verif_checkbox();" checked />Matériels réseau</label>
  <label for="device"><input type="checkbox" name="choix[]" id="choix[]" value="3"  onClick="verif_checkbox();" checked />Périphériques</label>
  <label for="printer"><input type="checkbox" name="choix[]" id="choix[]" value="4"  onClick="verif_checkbox();" checked />Imprimantes</label>
</p>
Voilà ma fonction javascript :
function verif_checkbox(){

    //On recupere le tableau des cases
    var choix = document.saisie.choix;

    for (i = 1; i < choix.length; i=i+1){
        var valeur = choix[i].value;

        if (valeur == "0"){
            if (choix[i].checked == true){
                for (i = 1; i < choix.length; i=i+1){
                choix[i].checked = true;
                }
            }else{
                for (i = 1; i < choix.length; i=i+1){
                    choix[i].checked = false;
                }
            }
        }
    }
}
Je ne vois pas ce qui cloche...
Pouvez vous m'aider ?

Merci d'avance pour votre aide.

Eléphant du PHP | 219 Messages

19 janv. 2006, 14:26

tu commences ta boucle à 1, il faudrait certainement la commencer à 0...

cyberalbert
Invité n'ayant pas de compte PHPfrance

19 janv. 2006, 18:36

Salut Daoud,

Bon alors, même à 0, ça ne fonctionne pas !

En fait, je pense que ma variable ne veut pas récupérer le tableau... :?
En effet, si je rajoute un : alert(choix), soit rien ne se passe soit chez "undefined"... :cry:

Je ne vois pas la solution.... :cry: :cry:

Merci de votre aide...

PS : si ça peut aider, je viens de tester une chose... si dans mon code, je mets :
name="choix" au lieu de name="choix[]", ça fonctionne...
Par contre, à ce moment là, c'est mon code de traitement en PHP qui ne fonctionne plus... car je ne peut pas récupérer les valeurs cochées.

Mammouth du PHP | 19672 Messages

19 janv. 2006, 20:38

En regardant vite fait, un truc m'a sauté aux yeux: ton pointeur i est redéfini en cours de boucle alors qu'il ne devrait peut-être pas: essaye comme ça:
function verif_checkbox()
{
    //On recupere le tableau des cases
    var choix = document.saisie.choix;

    for (var i = 1; i < choix.length; i++)
	{
        var valeur = choix[i].value;

        if (valeur == "0")
		{
            if (choix[i].checked == true)
			{
                for (var j = 1; j < choix.length; j++)
				{
                	choix[j].checked = true;
                }
            }
			else
			{
                for (var k = 1; k < choix.length; k++)
				{
                    choix[k].checked = false;
                }
            }
        }
    }
}
Non testé...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 219 Messages

20 janv. 2006, 10:28

Code : Tout sélectionner

<script language="javascript"> function verif_checkbox(){ //On recupere le tableau des cases var choix = document.saisie.choix; for (i = 0; i < choix.length; i++){ var valeur = choix[i].value; if (valeur == 0){ if (choix[i].checked == true){ for (i = 1; i < choix.length; i=i+1){ choix[i].checked = true; } }else{ for (i = 1; i < choix.length; i=i+1){ choix[i].checked = false; } } } } } </script> <p> <form name="saisie" action="" method="GET"> <label for="all"><input type="checkbox" name="choix" id="choix" value="0" onClick="verif_checkbox();" checked />Toutes les informations</label> <label for="computer"><input type="checkbox" name="choix" id="choix" value="1" onClick="verif_checkbox();" checked />Ordinateur</label> <label for="network"><input type="checkbox" name="choix" id="choix" value="2" onClick="verif_checkbox();" checked />Matériels réseau</label> <label for="device"><input type="checkbox" name="choix" id="choix" value="3" onClick="verif_checkbox();" checked />Périphériques</label> <label for="printer"><input type="checkbox" name="choix" id="choix" value="4" onClick="verif_checkbox();" checked />Imprimantes</label> </form> </p>
Ca marche, mais effectivement j'ai enlevé les crochets à choix... donc à mon avis il va falloir revoir ton code au niveau php.

David

Invité
Invité n'ayant pas de compte PHPfrance

20 janv. 2006, 14:39

Merci à vous...

Cyrano, même en modifiant la boucle selon tes conseils, ça ne fonctionne pas.

Je pense donc que je vais essayer de modifier le code php en donnant par exemple un nom distinct à chaque checkbox... mais c'est pas super propre niveau PHP... :?

Voilà merci quand même... et je vous tiens au courant si j'ai quelque chose :D

Eléphant du PHP | 219 Messages

20 janv. 2006, 14:43

je ne vois pas pourquoi tu dois changer le nom des checkboxes... ça marche très bien comme cela au niveau php. Peux-tu détailler ton problème ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 janv. 2006, 15:43

voila un code opérationnel:
<html>
<head>
<title></title>
<script type="text/javascript">

function verif_checkbox(checked,value)
{
  
	var choix = document.saisie.choix;
    if((value==0)&&(checked==true))	//s'il s'agit de la case maitre (1ere case)   
	{	
	  for (i = 1; i < choix.length; i++)
			{
				choix[i].checked = true; //on coche toutes les autres
			}
	}
	else choix[0].checked = false;	//si on a cliqué sur une autre case que la maitre alors on la passe a faux	
}

function change_name()
{
	var lg = document.saisie.choix.length;
	for(i=0;i<lg;i++)
	{
		var name='choix'+i;
		document.getElementById(name).name +="[]"; // ajout des [] a l'attribut name lors de la validation
	}
}
</script>
</head>
<body>   
<?
if(isset($_POST['submit']))
{
	echo '<pre>';
	var_dump($_POST['choix']);
	echo '</pre>';
}

?>

  <form name="saisie" action="" method="POST" onsubmit="change_name();">

  <? $checked= ( (isset($_POST['choix']) && in_array("0",$_POST['choix'])) || !isset($_POST['choix']) ) ? "checked=\"checked\"" : "";?>
  <label for="all">  
	<input type="checkbox" name="choix" id="choix0" value="0" onClick="verif_checkbox(this.checked,this.value);" <?echo $checked;?> />Toutes les informations
  </label>
  
  <? $checked= ( (isset($_POST['choix']) && in_array("1",$_POST['choix'])) || !isset($_POST['choix']) ) ? "checked=\"checked\"" : "";?>
  <label for="computer">
	<input type="checkbox" name="choix" id="choix1" value="1"  onClick="verif_checkbox(this.checked,this.value);" <?echo $checked;?> />Ordinateur
  </label>
  
  <? $checked= ( (isset($_POST['choix']) && in_array("2",$_POST['choix'])) || !isset($_POST['choix']) ) ? "checked=\"checked\"" : "";?>
  <label for="network">
	<input type="checkbox"  name="choix" id="choix2" value="2"  onClick="verif_checkbox(this.checked,this.value);" <?echo $checked;?> />Matériels réseau
  </label>
  
  <? $checked= ( (isset($_POST['choix']) && in_array("3",$_POST['choix'])) || !isset($_POST['choix']) ) ? "checked=\"checked\"" : "";?>
  <label for="device">
	<input type="checkbox"   name="choix" id="choix3" value="3"  onClick="verif_checkbox(this.checked,this.value);" <?echo $checked;?> />Périphériques
  </label>
  
  <? $checked= ( (isset($_POST['choix']) && in_array("4",$_POST['choix'])) || !isset($_POST['choix']) ) ? "checked=\"checked\"" : "";?>
  <label for="printer">
	<input type="checkbox"  name="choix" id="choix4" value="4"  onClick="verif_checkbox(this.checked,this.value);" <?echo $checked;?> />Imprimantes
  </label>

  <input type="submit" name="submit" value="valider" >
</form>

</body>
</html>
Si tu ne comprends pas quelque chose suffit de demander :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

cyberalbert
Invité n'ayant pas de compte PHPfrance

21 janv. 2006, 16:46

Merci Truc,

Ca marche effectivement nickel :D

Pour Daoud, c'est quand php, je recupère les infos des checkbox sous forme de tableau, donc avec des crochets... et là, sans crochets, je ne récupèrais rien !!!

Voilà, sinon je vais utiliser la méthode de Truc car je suis pressé dans le temps, et mon code est uniquement pour une petite appli temporaire... c'était juste pour que ce soit plus joli.

Merci à tous pour votre aide.