jforms en bonne voie
Par Laurentj le samedi, juin 2 2007, 09:50 - Projets - Lien permanent
Le future système de formulaire de Jelix est en bonne voie. Dans une branche expérimentale du dépôt subversion, ça commence à bien fonctionner et j'en suis assez content. Maintenant jforms sait générer un formulaire HTML et le code javascript de validation qui va avec, même si tout n'est pas encore complet.
Voyons un peu comment ça marche.
1) on créé un fichier XML décrivant les champs de saisie d'un formulaire. Pour l'instant la grammaire XML n'est pas totalement figée. J'essaie de faire un mix entre HTML et xforms. Le fichier pourra être généré via une instruction en ligne de commande, à partir des informations d'un dao ou directement d'une table.
2) À partir de ce fichier, jForms connait la structure du formulaire : types de champs de saisies et les contraintes. Il génère alors une classe PHP (à la volée et dans un cache) qui permet de gérer les données d'un formulaire : remplissage à partir d'un dao pour l'affichage, récupération des données reçus du navigateur et validation. L'API à utiliser dans les contrôleurs est alors relativement simple :
$form = jForms::create('sample', $recordId);pour créer une nouvelle instance d'un formulaire en session ($recordIdn'est pas obligatoire si on n'a pas à gérer de multiples instances).$form->initFromDao('madao');pour initialiser son contenu à partir d'un dao$form = jForms::get('sample');pour récupérer une instance d'un formulaire$form = jForms::fill('sample');pour récupérer une instance d'un formulaire en le remplissant avec les données reçues du navigateur$form->check()pour savoir si le contenu du formulaire est valide$form->saveToDao('madao')pour sauvegarder les données d'un formulairejForms::destroy('sample');pour détruire une instance d'un formulaire
C'est tout. Il y a bien sûr d'autres méthodes et fonctionnalités pour les gestions plus complexes de formulaires. L'api est suffisament souple pour faire des formulaires sur plusieurs pages, de réafficher un formulaire et son contenu où l'on veut, quand on veut etc...
Tout ceci est déjà dans la beta2. La beta3 contiendra ce qui suit..
3) Pour l'affichage d'un formulaire, il suffit de passer l'objet $form au template. Ex : $rep->body->assign('myForm',$form);, et ensuite d'utiliser les quelques fonctions de templates spécifiques :
{form $myForm,'sampleform_save'}
<fieldset>
<legend>Votre identité</legend>
{formcontrols}
<p>{ctrl_label}: {ctrl_control}</p>
{/formcontrols}
</fieldset>
<p><input type="submit" value="ok" /></p>
{/form}
formcontrols est en fait une boucle sur les champs de saisies, ctrl_label affiche le label d'un champs de saisie et ctrl_control le champs de saisie en lui même. On n'est pas obligé d'utiliser formcontrols et on peut alors utiliser ctrl_label et ctrl_control là où on veut en indiquant le nom du champs de saisie. Cela apporte ainsi une certaine souplesse. Tout est généré : la balise form, le code javascript de validation, les balises label et tout ce qu'il faut pour l'accessibilité etc...
Et pour les plus pressés, il y aura plus tard :
{quickform $myForm,'sampleform_save'}
qui évite de faire tout ce qu'il y a dans l'exemple précédent (mais est moins souple forcément) :-)
4) Vous remarquerez qu'à aucun moment, si ce n'est lors de l'écriture du fichier xml, vous n'êtes obligés de manipuler explicitement les champs de saisies ou leurs données. Cela veut dire qu'un contrôleur ou un template peut être utilisé pour n'importe quel formulaire. Cela peut être trés sympatique pour un CMS qui permettrait à l'utilisateur de choisir un formulaire déjà créé pour sa nouvelle page, ou de créer[1] son formulaire via une interface ou alors le créer en écrivant le xml à la main (comme ce n'est pas du PHP, peu de risque de trous de sécurité). Le développeur du CMS n'a pas à faire un controleur pour chaque formulaire. Où même : Jelix proposera des contrôleurs génériques et des commandes en ligne de commande pour générer en un coup la gestion d'une table. Une interface type CRUD se fera alors en quelques secondes ! ;-)
5) Mais ce n'est pas tout : Jelix proposera à l'avenir d'autres plugins de templates, qui permettront de générer des formulaires autres que HTML : XUL, XForms etc.. (et ceci sans changer une ligne de code en dehors des templates, pour le développeur).
Notes
[1] Précision : dans ce cas, il n'est pas possible de reposer sur un dao. Ou alors cela peut être un systeme dans l'admin du cms qui permettrait au webmestre de rajouter des plugins au cms, qui contiendraient le script sql de creation de la table, le fichier dao et le fichier formulaire
Commentaires
yabon !
Je kiff !
Tu peux peut-être préciser plus clairement que la gestion des contraintes/vérifications sur les champs des formulaires sera gérée par jForms avec un premier contrôle en JS doublé du contrôle côté serveur en php. Et tout ça depuis le fichier descriptif xml, donc sans rien à faire de plus :)
Plus ça va, plus il me plais ce framework :)
Ca semble bien !
Je n'ai qu'une question : quand pourrons-nous jouer avec ces nouvelles fonctionnalités ? :-)
@arnaudj : quand ça sera fini :-) La beta 3 est prévue fin juin (mais probablement repoussée un peu).
Pourquoi ne pas utiliser XForms directement plutôt que de recréer encore un format ?
Hum...... ça ressemble fort aux spécifs de CopixForms tout ça ;-)
(oui, moi aussi j'ai le droit de taunter de temps en temps)
@loufoque : j'y ai bien pensé, c'était même mon objectif au debut. Mais je n'ai pas fait parce que beaucoup trouvent que xforms est trop compliqué. De plus, utiliser xforms signifie implémenter tout ce qu'il propose, or la spécification est monstrueuse, c'est un boulot énorme : je n'ai tout simplement pas le temps de prendre en charge une spécification complète de xforms. Si il y a toutefois des volontaires...
@gerald : ça ressemble surtout à ce que tu n'avais pas voulu dans Copix à l'époque (c'est une des nombreuses raisons du fork).
@laurentj > c'était un taunt gratuit :-)
Effectivement, j'ai lu en travers, mais je ne voulais pas (et ne veux toujours pas) de la partie définition XML obligatoire.
C'est pratique, nous verrons à terme lequel est le plus pratique pour l'utilisation ^^
@gerald : je ne vois pas comment tu peux deviner, à partir d'un dao, ce que tu veux afficher (listbox, radiobuttons etc..). Faut bien le décrire quelque part. Peut être alors il faut que tu l'indiques au niveau de l'appel des plugins de templates. Mais ça empêche alors d'utiliser la boucle formcontrols et ça enlève donc le caractère générique de jForms (pour l'histoire du CMS &co)...
Et puis pour le caractère obligatoire du fichier xml, je ne pense pas que ce soit si terrible que ça de faire un
./jelix createform MONMODULE MONDAO nameen ligne de commande :-pLe caractère magique de ton procédé ça à l'air sympa, mais pour la reprise en maintenance, le dev sera toujours à se demander si il y a un fichier xml ou pas derrière un appel à CopixForms (surtout que dans Jelix, tu peux redéfinir un dao/form sans toucher au code original) . Personnellement je trouve ça chiant. Moins on se pose de questions, mieux c'est.
Je viens de j'ajouter dans la documentation de Jelix un petit tutoriel qui illustre une façon d'implanter un CRUD.
turowbye > merci pour ton tuto. Le souci c'est que je trouve ca très compliquer à gérer. Pour info, j'ai dev une class qui se comporte comme suit : $form->MakeFormFromDb("table",champs:champs). Le but de cette method est de générée en 2 seconde de code, un formulaire paramètrable en mémmoire, en fonction des champs de la base. C'est bcp moins fastidieux que la méthode décrite dans le tuto car null besoin de créer un template en 'dur'. Jform aurait-il a terme un mode similaire basé sur les dao ou faudra-t-il sistématiquement créer tout les templates pour les formulaires que l'on souhaite renseigner ??
@golgots : le tuto de turowbye est fait pour la version actuelle de jForms. Et mon billet décrit ce qu'on pourra faire dans la prochaine version. Il n'y aura même pas à faire ton makeFormFromDb.