Un Formulaire en Ajax

Ayant eu le besoin de réaliser un formulaire, j'ai choisi de tester un peu la techno Ajax et d'en mesurer les avantages et inconvénients

Introduction

Vous trouverez ci-dessous un petit tutoriel pour installer et utiliser un système de formulaires web utilisant la technologie AJAX, très facile et rapide d'installation et de configuration une fois que vous en avez compris les principes.

Le cahier des charges que je me suis fixé était le suivant :
J'ai commencé par tout coder directement manuellement, puis à force d'améliorations, je me suis orienté vers des librairies plus génériques : prototype et script.aculo.us.

Structure

Le formulaire est très simple, il s'appuie sur :

ci-dessous le schéma général, y compris les includes.


 

Logique générale

Le principe est de surveiller un événement sur les champs du formulaire (par exemple, focus, blur, keyup) et sur cet évènement on déclenche un appel Ajax vers la page en back office. On transmet à cette page l'id de l'enregistrement, le nom du champ qui est en train d'être mis à jour et sa valeur. La page en backoffice effectue la validation et si cette validation est ok, on l'update en base. Elle renvoie une structure XML avec les informations des actions réalisées et les messages d'erreur si nécessaire.

L'ID de l'enregistrement à mettre à jour est généré au début de l'appel de la page 'formulaire' et, afin de garder une persistence du formulaire non terminé, cet ID est stocké dans un cookie chez le client. Le cookie est effacé une fois le formulaire validé ou annulé (ainsi le client peut commencer à saisir un formulaire, fermer son navigateur, aller boire un café, partir en vacances.. et revenir le terminer quelques jours plus tard sans avoir perdu une seule information ; la seule contrainte de persistence est la durée de vie du cookie.

La page de backoffice effectue un traitement particulier lorsqu'elle reçoit l'ordre de validation complète du formulaire : elle repasse une validation de chaque champ, et vérifie également si tous les champs obligatoire sont présents. Si c'est ok, elle update en base, sinon renvoie une erreur.

Un peu plus de technique

Afin que le code html / php soit le plus propre possible, j'ai utilisé la fonction Event.observe de prototype afin de déclencher les observateurs d'évennements de mise à jour des champs du formulaire, ne vous étonnez donc pas de ne pas trouver de 'onclick', 'onblur', etc.. un peu partout dans le code, c'est normal, tout est géré dans le javascript init() dans formulaire.php. Ce script n'a pas besoin d'être paramétré lorsqu'on ajoute ou supprime des champs du formulaire : il scanne automatiquement tous les champs du formulaire et détermine les actions. Par défaut, les actions sont réalisées en keyup, c'est à dire que à chaque fois qu'on tape un caractère, on réalise l'appel AJAX. C'est peut-être un peu dangereux pour les performances de gros sites, vous pouvez alors par exemple remplacer les keyup par des blur.
Selon les types de champs du formulaire, on appelle une fonction spécifique située dans formulaire_backoffice.js qui a pour objet de récupérer le nom du champ et sa valeur afin de déclencher l'appel AJAX.
La fonction de call-back ajax interprête le XML de résultat et affiche l'erreur si nécessaire.

L'enregistrement en base est créé par le php la première fois qu'on appelle formulaire.php, ensuite, le cookie enregistré sur le poste client permet de garder le contexte.
A chaque modification d'un champ, l'appel AJAX lance une mise à jour du champ qui est en train d'être modifié. Avant la mise à jour, le php appelé par l'appel XMLHttpRequest fait d'abord une validation. Les validations sont gérées à l'aide d'expressions régulières, c'est donc assez facile d'ajouter d'autres types de validations plus évoluées (la fonction est dans inc_validation.php). Si la validation est ok, alors on update ce champ en base.

Une conséquence importante de ce mode de fonctionnement est ce que j'appelle la fonctionnalité 'big brother' : le formulaire enregistre tout : il suffit de venir au moins une fois sur le formulaire, commencer à le remplir. Même en ne le terminant jamais, il restera toujour un enregistrement en base reflétant ce formulaire à moitié rempli (toutefois, seuls les valeurs des champs qui passent la validation sont enregistrés en base).

L'appui sur 'valider le formulaire' fait également un simple update en base sur ce même enregistrement et passe le champ 'formulairevalide' à 1. Ainsi, on peut distinguer les formulaires terminés et validés (ils ont le champ 'formulairevalide' à 1) et ceux jamais terminé (le champ est alors à zéro).

L'appui sur 'annuler' efface simplement le cookie : l'utilisateur aura donc l'impression de repartir sur un formulaire vide, mais ce qui a été saisi dans le formulaire précédent est resté en base...

Pour les sites à fort taux de fréquentation, cette fonctionnalité peut éventuellement générer beaucoup d'enregistrements, il faudra peut-être prévoir une tache de 'purge' des formulaires non validés dont la date de dernière modification est trop ancienne par exemple.

Installation et Configuration

Installation

Téléchargez l'archive située en bas de cette page, dézippez cette archive dans un répertoire quelconque de votre site web (ex: http://www.monsite.com/formulaire/)

Création de la base de donnée

Pour l'instant, vous allez juste créer la base et l'utilisateur qui a le droit d'y accéder.
Si votre hébergeur ne vous laisse le droit qu'à une seule base, vous pouvez passer cette section, nous créeront la table plus tard.
Sinon, créez une nouvelle base du nom de votre choix (dans notre exemple : 'formulaire').
Créez ensuite un utilisateur mysql avec, au minimum, les droits d'accès SELECT, INSERT, UPDATE sur la base (vous pouvez choisir si vous le souhaitez, plus tard, une fois la table créée, de limiter ces grants à uniquement la table du formulaire)

Paramétrage des fichiers de configuration.

Il y a deux fichiers de configuration : un pour le côté client et un pour le côté serveur.
Commençont par le côté client :
Editez le fichier 'parameters.js' :
Editez ensuite le fichier 'inc_parameters.php' :

Personnalisation du formulaire

Il est temps maintenant de définir le contenu des champs du formulaire, pour cela, Editez le fichier 'formulaire.php' :

Paramétrage généraux de la page

Le formulaire

Organisation générale

Les éléments du formulaire sont organisés par groupe, un groupe est un ensemble de champs du formulaire à l'intérieur d'un <fieldset>
Les fieldset sont des éléments de présentation, vous pouvez choisir de mettre tout le formulaire dans un seul fieldset ou à l'opposé de faire un fieldset par champ à remplir, c'est votre choix.
Dans le formulaire par défaut, je montre quelques exemples différents.

Chaque fieldset doit avoir une légende qui est représentée par les tags <legend></legend>

la classe "noerreur" : chaque élément de formulaire (input, checkbox, radio, etc..) doit être encadré par un div de classe "noerreur". Cette classe sera changée dynamiquement en classe "erreur" en cas de pb de validation de cet élément de formulaire.

Principe de l'organisation des champs du formulaire

Ce principe est un des points les plus structurant de ce formulaire, revenons donc sur un des élements de mon cahier des charges : "impossibilité pour le client de passer outre les validations en modifiant les javascript".

D'habitude, dans la plupart des formulaires classiques, on réalise une validation en javascript du côté du client (par exemple la vérification : est-ce qu'un email est bien un email). Bien sûr cette validation n'est pas suffisante, car il suffit d'interdire les javascripts pour passer outre la validation. Donc les formulaires un peu plus évolués (tous devraient le faire) doublent cette validation javascript par une validation côté serveur. Mais encore une fois, il faut bien passer les paramètres de validation au serveur. Pour un formulaire non AJAX, cela se fait par exemple dans les infos de POST. J'aurais pu également faire la même chose et simplement éviter le POST et  le rechargement de page en utilisant XMLHttpRequest. Mais rien n'empèche non plus une personne mal intentionnée de recopier le formulaire sur un poste local, d'en changer les paramètres et d'appeler le script serveur avec d'autres types de validation (changer une validation email en simple validation txt par exemple).

J'ai donc choisi de passer les paramètres de validation directement dans le nom des champs du formulaires. Et ce sont ces même noms qui structurent la table d'enregistrement de la base de donnée. Ainsi si une personne mal intentionnée cherche à changer une validation, elle doit changer le nom du champ et même si la validation passe, l'enregistrement en base de donnée ne passera pas.

Cette solution est plus sécurisante, mais elle a l'inconvénient de générer des noms de champs un peu compliqués et peut-être un peu compliqué à faire évoluer (dans le cas de nouveau types de validation par exemple qui nécessiteraient de nouveaux paramètres).

Les noms des champs ont donc une structure qu'il faut respecter, en voici les règles :

Structure du nom du champ

La Structure du champ est la suivante : ttt_x_y_z_mmm
  1. ttt : représente le type du champ, il peut prendre les valeurs suivantes :
    • num : numérique entier
    • real : numérique à virgules
    • tel : téléphone (français)
    • date : date de type JJ/MM/AAAA
    • cp : code postal
    • email : email
    • txt : texte libre
  2. x : prends deux valeurs possibles :
    • m : mandatory (champ obligatoire)
    • o : optionnal (champ optionnel)
  3. y : nombre de caractères minimum : valable uniquement pour les type de champs txt et email, mettre 0 dans les autres cas
  4. z : nombre de caractères maximum : valable uniquement pour les type de champs txt et email, mettre 0 dans les autres cas
  5. mmm : nom du champ

exemples :

type de champ et type de formulaire

Voici les associations que vous pouvez utiliser sans risque entre les types de champs du formulaire et les champs en html :
Dans l'archive, vous trouverez un exemple de chaque cas d'input afin de vous permettre de copier/coller ce qui vous interesse.
Attention : il y a une petite subtilité avec les input radio : le champ 'name' doit avoir la même valeur pour tout les inputs radio du même groupe (ainsi donc que l'appel de la fonction php 'RecupereValeur' qui doit avoir ce même champ name comme paramètre). Par contre, les champs 'id' doivent être uniques (même un numéro incrémental en plus du name par exemple), ceci afin de faire correspondre l'id de l'input et le label associé.

Création de la table dans la base de donnée

La table a quelques colonnes obligatoires :
Les autres colonnes représentent exactement les noms des champs input de votre formulaire
(ex : `txt_m_1_100_nom` varchar(100) NOT NULL default '' qui correspond à l'imput 'nom' de votre formulaire). Notez bien que le nom du champ doit être exactement le même que le paramètre 'name' de l'inputField.

Regardez le fichier table.sql dans l'archive d'exemple pour plus de détails.

La Forme

Toute la forme est gérée dans la feuille de style (style.css)
L'objet de cet article n'est pas de faire un détail sur les feuilles de style : l'utilisation des styles pour ce formulaire est très simple. N'hésitez pas à aller faire un tour sur Alsacréations par exemple, un excellent site français qui vous apprendra un tas de choses très pratiques sur les css et sur bien d'autres choses.

Conclusion / Reste à faire

J'espère que ce petit formulaire et ce tutoriel pourront vous aider dans vos projets. En tout cas, sentez vous libre de l'exploiter, le modifier, l'améliorer, le triturer. Si toutefois vous avez réalisé des améliorations, rencontré des bugs, souhaitez des améliorations, n'hésitez pas à m'en faire part en utilisant les commentaires ci-dessous.
Ce formulaire est encore très incomplet et il reste pas mal de choses à faire si on voulait le rentre véritablement professionnel. Voici une petite todoList qui résume les points à améliorer :

Live Demo

J'ai mis en ligne le formulaire de démo situé dans l'archive, vous pourrez le retrouver en suivant ce lien.

Télécharger l'archive

FilenameFilesizeDate
. formulaireAjax_1.0.zip 128.02 kB 2008-08-11


Ecrivez un commentaire

  • Les champs obligatoires sont marques d'une *.

Si vous avez du mal a lire le code, cliquez sur l'image du code pour en generer une nouvelle.
Code de securite:
 
Showing comments 1 to 10 of 31 | Next | Last
Fabien
Posts: 24
Comment
Formulaire Web et integration pour un CMS libre
Reply #31 on : Wed May 28, 2008, 13:47:48
Bonjour,

Je suis en train de développer une application PHP pour faire des sites web. Une sorte de CMS mais avec une philosophie un peu differente de ce que l'on trouve actuellement.
Mon but est d'utiliser un maximum les standard existant (XML,XSL,CSS...), de faire quelque chose le plus évolutif possible
respectant les normes XHTML...
J'ai lancé il y a quelque année un premier essai (que je n'ai encore jamais publié car je le trouvé pas assez mature) que j'utilise actuellement sur http://saint-pal.com et http://usson-en-forez.fr, deux sites de commune, où le but est d'avoir un contenu claire, hiérarchique, structuré et avec certaine parties dynamique (actu, album photos...)

Derrière ces site se trouve donc une interface de pilotage avec gestion des droits utilisateurs, gestion des erreurs...

Ma nouvelle version DOIT permettre d'arriver au même resultat.
Pour le moment, une version en route peut être vu a l'adresse
http://81.56.192.194/homepage.php

Le début est assez prometteur, il me reste à intégrer un système de cache efficace, et surtout, une gestion des formulaires...

Et la tout se corse, car mon but est d'avoir uniquement du code générique...

Et Ajax jusqu'à aujourd'hui, j'ai jamais vraiment touché.

Votre code me semble très interessant, j'aimerais donc l'utiliser.
Je voudrais donc avoir votre point de vu sur certain point.

Pour cela, pourriez vous me contacter par mail SVP ?

Merci beaucoup
maloin
Posts: 24
Comment
essai
Reply #30 on : Tue April 22, 2008, 15:25:55
ça marche !
Thomas
Posts: 7
Comment
Pierrot
Reply #29 on : Fri April 11, 2008, 00:14:55
Bonjour Pierrot, désolé je n'avais pas vu avant ton commentaire.
Alors déjà pour le point 2), tu as ta réponse dans inc_validation.php ou les validation des types de champs sont réalisés par des expressions régulières.
Celle pour le tel est : "^(01|02|03|04|05|06|08)(([\.\-\/\ ])?[0-9][0-9]){4}$"
tu as des testers de regular expression online un peu partout, par exemple ici : http://www.regular-expressions.info/javascriptexample.html
Pour les autres points, je ne sais pas trop à premiere vue (en ligne 12, c'est bizarre, mais vu l'erreur il te manque un index dans la base mysql.
Pierrot
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #28 on : Sun March 30, 2008, 21:29:06
J'ai corrigé des erreurs et ces dernières venait de ma part. J'avais des erreur dans ma base de donnée et j'ai reimporter le fichier table.sql. J'ai plus 17 entrée a chaque fois que je charge ma page formulaire.php. Donc les enregistrement dans ma table se passe très très bien.
Cependant, j'ai encore ces problème:
1. Quand j'ouvre ma page formulaire.php pour la premiere fois, j'obtien bien ces message :
<br />
<b>Notice</b>: Undefined index: formulaire in <b>/Applications/MAMP/htdocs/formulaireAjax_1-0/formulaire.php</b> on line <b>12</b><br />. Si je refraichi cette page tout redeviens OK.
2. Je ne trouve pas le format des téléphone a entrer
3. 3. dans le fichier parametre.js, j'ai mis la valeur de http://www.monsite.net/ (j'ai mis mon site comme url, qui fonctionne) dans le parametre "var gs_Redirect_url =". Apres l'envoi du formulaire je suis rediriger sur une page qui ne trouve pas la page de mon site. Normal dans l'url il est inscris http://wwww.monsite.net (avec 4 w). Poutant,, j'ai controler, j'ai bien mis 3 w.


Mercis mercis
Pierrot
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #27 on : Sun March 30, 2008, 20:52:43
Encore un truc,
Quand j'ouvre pour la premiere fois le fichier formulaire.php, j'obtiens ces message sur chauqe champs
<br />
<b>Notice</b>: Undefined index: formulaire in <b>/Applications/MAMP/htdocs/formulaireAjax_1-0/formulaire.php</b> on line <b>12</b><br />
Pierrot
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #26 on : Sun March 30, 2008, 20:48:16
Y a pas mal de trc que je ne comprend pas. J'ai peut etre louper des truc, mais bon.

1. Quand j'ouvre pour la premiere fois la page frmulaire.php , Pourquoi dans la base il me créé 17 ligne dans ma table formuliare?

2. Pour le champs téléphone, si je mets un 5 ou un: 55 44 ou un: 33 444444, il met un numero invalide. Quel est le format du tel?

3. dans le fichier parametre.js, j'ai mis la valeur de http://www.monsite.net/ (j'ai mis mon site comme url, qui fonctionne) dans le parametre "var gs_Redirect_url =". Apres l'envoi du formulaire je suis rediriger sur une page qui ne trouve pas la page de mon site. Normal dans l'url il est inscris http://wwww.monsite.net (avec 4 w). Poutant,, j'ai controler, j'ai bien mis 3 w.

Merci pour vos reponse et aide. Ce module m'intéresse. Mais faut que je trouve des solutions a ceci.
Meris
Pierrot
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #25 on : Sun March 30, 2008, 20:16:39
Ya aussi un truc donc je ne suis pas certain, c'est type des chaps de ma base (varchar, int, date)
Que dois-je utiliser pour les textes? varchar?
Que dois utiliser pour l'eamil? varchar aussi?
Quand dans ce tuto on parle de num, c'est le int?
Pierrot
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #24 on : Sun March 30, 2008, 20:13:18
Pas mal ce formulaire! mais il y a un truc qui me détange, Je préfere que le message d'erreur apparaisse pas quand on click sur le champ pour entrer du texte, mais quand on "sort" du champs. Comment puius.adapter ce code pour faire ceci?
Yvon Pednault
Posts: 24
Comment
Re: Un Formulaire en Ajax
Reply #23 on : Thu February 28, 2008, 20:18:05
Tu te dois de créer un conciliabule au sommet, en effectuant un coup fumant pour aller chercher Noulandère!
dd
Posts: 24
Comment
salut
Reply #22 on : Tue January 15, 2008, 14:23:49
beau travail
Showing comments 1 to 10 of 31 | Next | Last