[Résolu] Vérifier si une variable est définie

Eléphanteau du PHP | 16 Messages

23 sept. 2008, 14:32

Bonjour,

J'ai un soucis de vérification de formulaire.

J'ai un formulaire dynamique qui affiche certain champs suivant la sélection de départ.
Plusieurs des champs étant commun j'ai choisi cette voie.

Je teste plusieurs de ces champs pour la validation.

comme ça :

Code : Tout sélectionner

if(F.Group && F.Group.value==""){}
et je concatène une variable err que j'affiche.

Comme je ne sais pas à l'avance quel champs existera je test avant sinon j'ai une erreur.

Tout ça marche très bien

mon problème vient du test de plusieurs checkbox que je génère en php à partir d'une variable array :

Code : Tout sélectionner

foreach($TrainingList as $TrainingKey => $TrainingRow){ echo"<input type=\"checkbox\" name=\"Training[".$TrainingKey."]\" /> $TrainingRow<br>\n"; }
ce qui me donne en html sur ma page un nom de champ :

name="Training[0]
name="Training[1]
name="Training[2]
name="Training[3]

et la c'est le drame ... je n'arrive pas tester si cette variable Training existe ... en fait tout mes test m'indique qu'elle n'est pas définie.

J'ai essayé (entre autre):

Code : Tout sélectionner

if(typeof F.Training != 'undefined'){}
et je ne veux pas utiliser getelementbyid du fait des problème de compatibilité (mais j'ai testé et ça marche pô).

y'a sûrement un trucàlacon qui m'a échappé :?

Alors merci d'avance pour votre aide :P
Modifié en dernier par YpLee le 24 sept. 2008, 14:42, modifié 1 fois.
YpLee

Mammouth du PHP | 881 Messages

23 sept. 2008, 14:49

La fonction isset() t'aidera.

Dans la doc: http://ca.php.net/manual/fr/function.isset.php
Soyez artisans de paix

Eléphanteau du PHP | 16 Messages

23 sept. 2008, 15:16

heu oui mais je connais la fonction isset en php ... sauf que la je fais ma validation en javascript ...

Mais merci quand même
YpLee

ViPHP
ViPHP | 3607 Messages

23 sept. 2008, 17:15

Bonjour,
Et que donne un

Code : Tout sélectionner

alert(F); // c'est quoi d'ailleurs ce F, je suppos que c'est le formulaire?

Eléphanteau du PHP | 16 Messages

23 sept. 2008, 17:23

oui F est le formulaire mais je ne vois pas très bien ce que tu veux faire avec alert(F);
YpLee

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 sept. 2008, 17:43

et je ne veux pas utiliser getelementbyid du fait des problème de compatibilité
c'est pourtant ce qu'il y a de plus respecté par tous les navigateurs :-k (plus ou moins)

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

Mammouth du PHP | 2937 Messages

23 sept. 2008, 19:23

et je ne veux pas utiliser getelementbyid du fait des problème de compatibilité
c'est pourtant ce qu'il y a de plus respecté par tous les navigateurs :-k (plus ou moins)
Y compris par IE, même s'il tient aussi compte de l'attribut name (d'où l'intérêt de préférer l'attribut id à l'attribut name), du moins jusqu'à la version 7 (la version 8 corrigeant ce petit souci).

Pour la compatibilité extrême, il y a l'unobstrusive JavaScript, autrement dit tester si telle méthode est implémentée ou pas.

Code : Tout sélectionner

function fnTaFonction () { if (!document.getElementById) return; /* Si la méthode getElementById n'est pas implémentée, le code ci-dessous ne sera pas exécuté (donc pas d'erreurs) */ var taVariable = document.getElementById ('ton-id'); // Le reste de ton code... }

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 sept. 2008, 22:47

Bonjour tout le monde,

Tu sais, YpLee, que : quand un champ html est nommé avec un "id", JavaScript peut le référencer par document.getElementById("idchamp") et quand ce champ fait partie d'un formulaire et est nommé avec un "name" il est référencé par le biais de son formulaire par nomformulaire.nomchamp ou document.forms("nomformulaire").elements("nomchamp") ou encore par document.getElementsByName("nomchamp")

Maintenant il faut savoir que si le nom ou l'id d'un champ est de type "nomchamp[index]" comme : Training[0], Training[1], ... JavaScript le référence par ce nom tel qu'il est c'est à dire "nomchamp[index]" et il ne le considère pas comme un tableau (contrairement à ce qu'on peut penser) et donc, il ne connait pas le nom "Training" tout seul.

Ce qui veut dire, que si tu as un champ nommé "Training[0]" il est référencé en JavaScript par : document.forms["F"].elements["Training[0]"]

Toutefois, si tu veux considérer "Training" comme un tableau sous Javascript, à ce moment là, il faut nommer tous les champs à regrouper avec le même nom générique comme "Training" ou "Training[]" (sans spécifier d'index).
Mais, il est préférable de nommer un tableau avec doubles crochets [] vides pour que PHP le considére aussi comme tableau.

Voici un exemple :

Code : Tout sélectionner

<form name="F" action="traitement.php" onsubmit="return validerForm();" > <input type="checkbox" name="Training[]" value="PHP 5" /> PHP 5 <br /> <input type="checkbox" name="Training[]" value="MySQL" /> MySQL <br /> <input type="checkbox" name="Training[]" value="JavaScript" /> JavaScript <br /> <input type="submit" name="valider" value="Valider" /> </form> <script type="text/javascript"> // Valider les données du form function validerForm() { // Référence aux champs Training[] var tableau = document.forms["F"].elements["Training[]"]; // Parcourir le tableau for (i=0; i < tableau.length; i++) { if (tableau[i].checked) { return true; // valide si au moins une case cochée } } // Erreur alert("Veuillez en choisir au moins un !"); return false; } </script>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 16 Messages

24 sept. 2008, 07:52

Merci à tous.

Voilà exactement ce que je voulais savoir :
Maintenant il faut savoir que si le nom ou l'id d'un champ est de type "nomchamp[index]" comme : Training[0], Training[1], ... JavaScript le référence par ce nom tel qu'il est c'est à dire "nomchamp[index]" et il ne le considère pas comme un tableau (contrairement à ce qu'on peut penser) et donc, il ne connait pas le nom "Training" tout seul.
merci.

Comme le champ Training n'existe pas forcément (vu que le formulaire est créé selon le besoin) cette variable n'existe pas forcément (erf ...) et donc la vérification que je fais doit tester en 1er si la variable est définie ou pas sinon j'ai des erreurs.

Donc je ne peux pas y arriver comme je le voudrais.

D'ou une autre question : peut-on mettre un caractère générique de remplacement (pasq en plus je ne sais pas d'avance combien d'élément le tableau Training contient) ?

Par exemple :

if(F.Training[*]){}

Merci pour vos piste.
YpLee

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 sept. 2008, 12:05

Il me semble que j'ai bien dit ça :
Toutefois, si tu veux considérer "Training" comme un tableau sous Javascript, à ce moment là, il faut nommer tous les champs à regrouper avec le même nom générique comme "Training" ou "Training[]" (sans spécifier d'index).
Mais, il est préférable de nommer un tableau avec doubles crochets [] vides pour que PHP le considére aussi comme tableau.

Voici un exemple :

Code : Tout sélectionner

<form name="F" action="traitement.php" onsubmit="return validerForm();" > <input type="checkbox" name="Training[]" value="PHP 5" /> PHP 5 <br /> <input type="checkbox" name="Training[]" value="MySQL" /> MySQL <br /> <input type="checkbox" name="Training[]" value="JavaScript" /> JavaScript <br /> <input type="submit" name="valider" value="Valider" /> </form> <script type="text/javascript"> // Valider les données du form function validerForm() { // Référence aux champs Training[] var tableau = document.forms["F"].elements["Training[]"]; // Parcourir le tableau for (i=0; i < tableau.length; i++) { if (tableau[i].checked) { return true; // valide si au moins une case cochée } } // Erreur alert("Veuillez en choisir au moins un !"); return false; } </script>
Donc, si tu comprends bien, ta question n'a pas à avoir lieu. Je ne vois pas pourquoi tu te compliques la vie et d'ailleurs ton fameux test d'existence de Training ne sert à rien.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 16 Messages

24 sept. 2008, 13:02

ok, je crois qu'on c'est mal compris ...

le champs Training n'existe pas toujours, mais c'est toujours le même script de vérification qui est utilisé, donc si je ne teste pas avant j'ai des erreurs.

Le tableau Training est créé avec l'index mais ça effectivement je peux m'en passer.

Je teste ça et je vous tiens au ju.

// EDIT

Alors un grand merci ça marche super avec la création de la var Training[] sans index
YpLee