Symfony sfWidgetFormInputCheckbox et sfValidatorBoolean incompatible
28 juin 2009 par: Benoit BonnevilleSymfony permet de générer des formulaires avec checkbox par sfWidgetFormInputCheckbox et des validateur par sfValidatorBoolean, mais ceux ci ne sont pas compatible.
Le but d’une case à cocher (ou checkbox) est de renvoyer :
- Vrai (TRUE), la case est coché
- Faux (FALSE), la case ne l’est pas
Les Formulaires Symfony
Le framework PhP, Symfony permet de générer des formulaires HTML de manière automatisée et très propre : le formulaire d’une page HTML doit servir de liens entre les différents scripts exécutés.
Du point de vue Modèle-Vue-Contrôleur, le formulaire est affiché dans la vue, mais agira sur le contrôleur pour ensuite modifier les données.
Le Formulaire fait alors partit du Modèle et la vue n’en est que l’affichage.
Exemple Simple d’interaction métier : il ne faut pas qu’un designer modifie les champs « name » des input text, sinon le formulaire ne fonctionnera plus car le développeur n’aura pas prévu ce « name » !
Pour ce faire vous devez créer des widgets Symfony pour chaque éléments du formulaire.
Vous trouverez par exemple le widget sfWidgetFormInputCheckbox qui permet de créer une checkbox.
Validation de formulaire
Dans un formulaire HTML vous recevez d’une manière général des variables d’un nombre de type finit:
un entier, une chaine de caractère, etc …
Symfony vous met donc à disposition des Objets validators, qui permettent de vérifier les données de manière rapide.
Exemple : ce champ est une chaine de caractère de longueur 4 minimum à 60 maximum
A vous d’implémenter les validateurs manquants.
L’avantage des validateurs est le retour d’erreur qui permet d’afficher le message d’erreur à coter de l’entrée correspondante, ou d’une manière globale
Vous pourrez notamment y trouver sfValidatorBoolean
Incompatibilité sfValidatorBoolean et sfWidgetFormInputCheckbox
sfValidatorBoolean vérifie qu’une donnée soit vrai ou fausse en PhP, les valeurs :
- 0
- null
- FALSE
- « » (chaine vide)
renverront FALSE
et tout le reste renverra TRUE
Quand au champ sfWidgetFormInputCheckbox, il renverra la valeur que vous lui avez attribué si la checkbox est cochée
ou NULL si elle ne l’est pas
Le piège
Quand vous l’utiliserez cette checkbox fonctionnera :
si vous la cochez il y aura bien une valeur
si vous la décochez vous aurez NULL, ce qui renverra FALSE par le validateur booléen.
Par contre quand vous affichez le formulaire, il faudra attribuer une valeur à cette checkbox.
Cela se fait par la méthode setDefault() de sfWidgetFormInputCheckbox
et dans ce cas, si vous ne mettez pas « NULL » , la checkbox sera automatiquement cochée, or le validateur ne renvoie jamais NULL, mais TRUE ou FALSE
Les deux éléments ne fonctionnant pas avec les même champs de valeurs sont donc Incompatibles !
Exemple Sournois :
Première utilisation du formulaire avec la case décochée, celui ci fonctionne mais le validateur bouléen à retourné FALSE
Lors du deuxième affichage du formulaire, vous mettez un setdefault() à FALSE en suite de l’étape 1 et non ‘NULL’ :
Votre case sera coché alors que vous l’aviez décochée juste avant.
Conclusion
je ne vois pas l’utilité immédiate de sfValidatorBoolean dans des formulaires HTML si ceux ci ne viennent pas appuyer les cases à cocher
Il ne vous reste plus qu’à faire votre propre NullValidator.