Symfony sfWidgetFormInputCheckbox et sfValidatorBoolean incompatible

28 juin 2009 par: Benoit Bonneville

Symfony 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.

Filed under: Développement

Répondre