Raccourcis : Contenu - rubriques - sous rubriques
EN FR

Créer et gérer des formulaires "à la main" (par opposition aux automatismes offerts par le système de formulaire jForms), n'est pas très différent par rapport à ce que l'on fait dans une application PHP classique. Quelques petites choses sont cependant à savoir pour profiter au mieux de ce qu'offre Jelix dans ce cas.

Les actions à mettre en oeuvre

L'implémentation très simpliste d'un formulaire consistera au développement de deux actions (les noms sont purement fictifs et servent juste d'exemple):

  • une action "show" d'affichage de formulaire
  • une action "save" qui traite les données du formulaire (après le submit) et affiche le résultat

Mais dans la plupart des cas, pour répondre correctement aux erreurs, pour éviter que l'utilisation des boutons "refresh" des navigateurs provoque une nouvelle exécution du traitement des données (action "save"), etc..., il vaut mieux avoir ce genre de liste d'actions :

  • une action "prepare" qui prépare les données pour un nouveau formulaire (initialisation en session par exemple, avec lecture des données initiales en base de données par exemple) et redirige vers "show"
  • une action "show" qui affiche le formulaire avec les données en sessions, et affiche les éventuelles erreurs de saisie.
  • une action "save" qui vérifie les données saisies. Si il y a des erreurs, les sauve en session et redirige vers "show", ou alors sauve les données et redirige vers "end"
  • une action "end", qui nettoie les données en session, et affiche une page de confirmation, ou redirige vers une autre action quelconque...
   

Création d'un formulaire

Vous utiliserez en général un template, dans lequel vous y mettrez vos balises html de formulaires. Par exemple :


  <form action="index.php/monmodule/default/save" method="POST">
  <fieldset> <legend>Indiquez votre identité</legend>
     <table>
      <tr>
        <td><label for="champs-nom">Votre nom</label></td>
        <td><input type="text" name="nom" id="champs-nom" /></td>
      </tr>
      <tr>
        <td><label for="champs-prenom">Votre prénom</label></td>
        <td><input type="text" name="prenom" id="champs-prenom" /></td>
      </tr>
      </table>
  </fieldset>
  <p><input type="submit" value="Valider" />
  </form>

Vous pouvez bien sûr y ajouter du javascript pour vérifier les données saisies coté client et utiliser tous les types de champs de saisies HTML.

Par contre, l'exemple n'est pas totalement bon, dans la mesure où l'url est en dur dans le formulaire. Cela est problématique par exemple quand on spécifie l'url dans la configuration des urls, et surtout lorsqu'on veut réutiliser le module dans d'autres projets.

Il est donc préférable d'utiliser les plugins de templates formurl et formurlparam, auxquels vous indiquez le sélecteur de l'action de traitement du formulaire, et de la liste des paramètres (comme quand vous appelez jUrl::get()). Le premier sert à générer l'url à mettre dans l'attribut action, et l'autre à générer les champs cachés contenant les éventuels paramètres supplémentaires propres à l'action. Vous devez toujours utiliser les deux ensembles. Le formulaire devient alors :


  <form action="{formurl 'monmodule~default:save'}" method="POST">
  <fieldset> <legend>Indiquez votre identité</legend>
     {formurlparam}
     <table>
      ...
      </table>
  </fieldset>
  <p><input type="submit" value="Valider" />
  </form>

Le formulaire résultant sera le même que le premier, mais il sera plus portable.

Traitement des données en retour

Dans l'action servant à traiter les données, vous récupèrerez celles-ci grâce à $this->param('champs') dans votre contrôleur. Vous avez d'autres méthodes similaires, comme $this->intParam('champs'), $this->floatParam('champs') et $this->boolParam('champs'), qui permettent de récupérer directement les valeurs sous un type particulier (voir la page sur les contrôleurs).

Vous pouvez utiliser en plus jFilter, qui est une classe permettant de vérifier le format des données (utilise l'extension filter de PHP). exemple :


    function save() {
       $email = $this->param('email');
       if ($email === null) {
             //.. ici erreur, l'email est obligatoire
       }
       if( ! jFilter::isEmail($email)){
             // erreur, email mal saisie
       }
       //....
    }

Voir la documentation de référence de jFilter.