Raccourcis : Contenu - rubriques - sous rubriques
EN FR
La page correspondant à la dernière version stable est consultable dans le Manuel Jelix 1.8

Comme il est indiqué dans le chapitre sur l'affichage des formulaires jforms, il est possible de choisir un plugin qui s'occupera de générer le code du formulaire (en HTML, javascript etc..) renvoyé au navigateur.

Note : Il s'agit ici des nouveaux types de plugins de Jelix 1.5 pour jForms. Voyez le manuel de Jelix 1.4 pour savoir comment sont réalisés les anciens plugins.

Vous avez deux types de plugins : ceux qui permettent de générer un formulaire entier, et donc qui "pilotent" la génération d'un formulaire et les plugins des widgets pour le générateur HTML par défaut, pour générer le code d'un seul contrôle de formulaire.

Plugin widget

Le générateur HTML fourni par Jelix est un plugin, lui même extensible, utilisant des plugins de type "formwidget" pour générer chaque contrôle. Vous n'avez ainsi pas à développer tout un plugin générateur pour simplement rédéfinir le code HTML et JS généré d'un contrôle, comme c'était le cas dans Jelix 1.4 et précédent.

Un plugin "formwidget" doit implementer l'interface jelix\forms\HtmlWidget\WidgetInterface, et donc fournir ces methodes :

  • getId(): renvoi l'id de l'élement HTML généré
  • getName(): renvoi le nom de l'élement HTML généré
  • getValue(): renvoi la valeur de l'élement HTML généré (valeur du controle en fait)
  • outputMetaContent($resp): génére des liens CSS et Javascript pour la partie <head>
  • outputHelp(): génère le code HTML de l'aide pour le champs de saisie
  • outputLabel(): génère le libellé HTML du champs
  • outputControl(): génère le champs HTML
  • setAttributes($attributes): définie les attributs qui seront ajoutés sur l'élément HTML, ou des options pour le plugin.

Le plugin peut hériter de la classe jelix\forms\HtmlWidget\WidgetBase, ainsi il y a moins de méthode à implémenter.

Le plugin doit avoir un nom. Il doit être stocké dans un fichier plugins/formwidget/{nom}/{nom}.formwidget.php.

Voyez le code des plugins existants dans lib/jelix/plugins/formwidget/ pour en savoir plus sur le fonctionnement des plugins "formwidget".

Plugin générateur

Il faut d'abord donner un nom à votre générateur. Prenons "monhtml" par exemple. Ensuite :

  • Créez un répertoire "monhtml" dans le répertoire "formbuilder" d'un dépôt de plugins.
  • Créez un fichier monhtml.formbuilder.php
  • Dans ce fichier, créez une classe htmlFormBuilder qui hérite de \jelix\forms\Builder\BuilderBase ou de \jelix\forms\Builder\HtmlBuilder si vous faites un formulaire HTML similaire à ce que génère le générateur HTML par défaut de Jelix.

Dans cette classe, vous devez implémenter les méthodes qui suivent. Ces méthodes doivent afficher les différentes parties du formulaire (en clair, faire des echos), et ne renvoient pas de valeurs. Ces méthodes sont appelées par les différents plugins de templates de jforms.

Après chaque modification de votre générateur de jforms, pensez à vider le cache de votre application (par exemple en utilisant la commande cleartemp), ceci afin de prendre en compte vos modifications.


    /**
     * output the header content of the form
     */
    abstract public function outputHeader();

    /**
     * output the footer content of the form
     */
    abstract public function outputFooter();

    /**
     * displays all the form. outputMetaContent, outputHeader and outputFooters are also called 
     * @since 1.1
     */
    abstract public function outputAllControls();

    /**
     * displays the content corresponding of the given control
     * @param jFormsControl $ctrl the control to display
     * @param array $attributes  attribute to add on the generated code (html attributes for example)
     */
    abstract public function outputControl($ctrl, $attributes=array());

    /**
     * displays the label corresponding of the given control
     * @param jFormsControl $ctrl the control to display
     */
    abstract public function outputControlLabel($ctrl);

outputMetaContent

Cette méthode doit récupérer l'objet réponse utilisée par le contrôleur, et y spécifier les feuilles de styles, les fichiers javascript à inclure dans la page finale. Exemple :


   public function outputMetaContent($t) {

        $resp= jApp::coord()->response;
        if ($resp === null) {
            return;
        }
        // si les fichiers sont dans le répertoire jelix
        $www = jApp::config()->urlengine['jelixWWWPath'];
        // ou si les fichiers sont dans un répertoire à vous dans www
        $www = jApp::config()->urlengine['basePath'];

        $resp->addJSLink($www.'js/fichier.js');
        $resp->addCSSLink($www.'design/fichier.css');
   }

Cette méthode est appelée avant toutes les autres.

outputHeader()

Cette méthode doit générer les balises qui constituent la déclaration du formulaire, ainsi que d'autres informations qui ne sont pas propres à chaque contrôle. Par exemple, la méthode outputHeader du générateur "html" affiche la balise <form>, la liste des erreurs présentes dans le formulaire, les champs cachés, ainsi que quelques lignes de javascript.

outputFooter()

C'est la dernière méthode appelée par les plugins de templates. C'est dans celle-là donc que vous afficherez les dernières informations et balises. Par exemple, la méthode outputFooter du générateur "html" affiche la balise fermante de <form>, ainsi que d'autres lignes javascript.

outputAllControls()

Cette méthode est appelée uniquement par le plugin formfull. Elle doit afficher tout les contrôles (en dehors des éléments affichés par outputHeader et outputFooter).

outputControlLabel()

Appelé par les plugins de template de jforms utilisés dans un plugin {form}, pour chaque label de champs de saisie. Cette méthode est donc chargée d'afficher le libellé d'un champ de saisie.

Elle reçoit en argument un objet PHP jFormsControl qui contient les informations du champ de saisie dont il faut afficher le label.

outputControl()

Appelé par les plugins de template de jforms utilisés dans un plugin {form}, pour chaque champ de saisie. Cette méthode est donc chargée d'afficher un champ de saisie.

Elle reçoit en argument un objet PHP jFormsControl qui contient les informations du champ de saisie à afficher, et un tableau contenant la liste des attributs à rajouter à la balise créé ou d'autres informations.