Valider simplement ses formulaires Symfony en JS
Attention : cet article a été rédigé en 2010, le contenu ou les éléments abordées peuvent être obsolète.
Dans cet article nous allons voir comment facilement valider un formulaire Symfony via les sfEvent
.
Il existe de nombreuses méthodes pour valider ses formulaires en Javascript, mais celle que j’apprécie consiste à passer des données à la sémantique HTML des éléments de formulaire pour indiquer au javascript qu’elles sont les conditions à valider. En d’autres termes cela revient par exemple à renseigner un attribut class
avec des valeurs telles que required
ou encore email
, etc. ou encore via un JSON toujours placé dans l’attribut class, récupéré ensuite grâce à jquery.metadata
.
VanadiumJS, une librairie jQuery, est basée sur ce principe, elle ajoute une couche de validation javascript via des classes CSS de type :required
, etc. Malheureusement elle souffre de quelques défauts, notamment l’I18N.
Le jQuery plugin validation permet également de valider sous cette forme, il permet aussi une écriture des règles en javascript, hors de la sémantique HTML.
Le code ci-dessous a été testé avec ces 2 librairies Javascript. J’ai choisi de vous présenter le code correspondant à la librairie jQuery plugin validation car je la considère plus pérenne et elle gère l’I18N.
Prenons un formulaire d’exemple, avec différents widgets mais surtout un panel variés de validators :
L’événement form.post_configure
est notifié lorsque le formulaire est configuré, autrement dit après que les widgets et les validators soient initialisés. A ce moment là, il sera très simple de modifier les attributs des widgets pour leur ajouter quelques classes en fonction du validator et de ses options.
Il faut donc se connecter à l’événement, je vous laisse libre d’implémenter ceci dans votre ProjectConfiguration
ou encore dans la configuration d’une de vos applications :
Ci-dessous un exemple d’implémentation de la méthode listenToFormPostConfigureEvent
pour gérer quelques validators :
Pour résumer, la méthode listenToFormPostConfigureEvent
va itérer sur les différents widgets du formulaire, et pour chacun d’eux va récupérer son validator. Elle va alors modifier les attributs du widget (le plus souvent l’attribut class
) pour y indiquer quel type de validation devra opérer la partie Javascript.
Libre à vous d’implémenter d’autres validators. Il serait même possible de passer par un JSON (technique metadata) pour ainsi gérer plus de cas, plus d’options liés à la documentation de jQuery plugin validation.
N’oubliez pas de charger les différents javascripts, à savoir jQuery et ceux du plugin de validation (vous pouvez en option ajouter un JS localisé proposé par le plugin ou encore un fichier contenant vos propres traductions pour les messages d’erreurs, c’est très pratique) :
Et maintenant dans votre vue (considérons que vous avez correctement affiché votre formulaire) il ne reste plus qu’à initialiser le javascript du plugin de validation, via :
Voici le résultat que j’obtiens :
Si vous souhaitez adapter ce code à VanadiumJS, ce ne sera pas très compliqué, il suffira de faire quelques adaptations au niveau des classes, par exemple : required
devient :required
, min_length
et max_length
ne sont plus des attributs du widget mais des classes, etc. Il suffit de se référer à la documentation de VanadiumJS.
Conclusion :
Pour conclure, on constate qu’il a été très simple d’étendre les fonctionnalités de sfForm
mais surtout de généraliser ce comportement à tous les formulaires. Evidemment n’utilisez pas forcément ce code là en production, car il va s’exécuter pour tous vos formulaires, ce qui n’est pas forcément souhaitable. Il serait toutefois assez simple de définir via un app.yml
une collection de noms de formulaires pour lesquels on souhaite appliquer des validations côté client.
Sachez qu’il existe également un plugin Symfony de validation javascript : sfJqueryFormValidationPlugin (qui au passage se base sur le même plugin jQuery que cet article). Par contre ce dernier ne se base pas sur les events Symfony, il fonctionne via un filter qui ajoute des fichiers javascripts dynamiques qui précise les règles de validation des formulaires.