Aller au contenu

MForm

Présentation

MForm est une classe php pour afficher des formulaires à partir d'un fichier de configuration plus simple à écrire que le html qui est généré et qui offre beaucoup de fonctionnalités embarquées.

Avec un code php comme celui-ci :

$form = mlib\ui\form\MFormFactory::createFromFile(__DIR__."/path/to/form.conf");
$form->registerAssetsPath("path/to/assets_libs/mlib/MForm/");

$form->display();

et un fichier "form.conf" relativement simple à écrire (voir plus bas), voici le genre de formulaire que l'on peut créer :

Comme on le voit, il s'agit de simples formulaires verticaux mais MForm donne accès, de manière simple, nous le verrons, à plusieurs fonctionnalités comme les champs combinés, les champs multiples, les boutons d'aide …

Le fichier de configuration qui a permis de générer ce formulaire : mform_sample.conf

Le fichier de configuration

Les fichiers de configuration pour MForm sont des fichiers de type MConfig (voir ici).

Ils consistent en une succession de blocs comme ceci :

<nom_du_champ_de_formulaire>
   type = le_type
   display = le_label
   ...
   ...
</nom_du_champ_de_formulaire>

Paramètres communs, quelque soit le type :

Requis :

  • type : une des valeurs parmis : hidden, input, number, email, password, text, checkbox, radio, select, file, date, datetime, time, complex, custom
  • display : le label qui doit être affiché en regard du champ de formulaire

Optionnels :

  • required (booléen) : si le champ est requis ou non
  • disabled (booléen) : si le champ est désactivé ou non. N'est pris en compte que si le formulaire est en edition
  • help : une url qui renvoie le contenu d'une aide sur le champ et qui sera chargé en ajax dans une boite modale
  • default_value : une valeur par défaut

En fonction du type renseigné, un certain nombre d'autre directives seront à fournir de manière obligatoire ou optionnelle.

input

Le type input correspond à un input type text en html. C'est un champ texte simple d'une ligne.

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels
  • placeholder : permet de mettre une indication en filigrane quand le champ est vide
  • multi (booléen) : permet à l'utilisateur de spécifier plusieurs valeurs en ajoutant des lignes grâce à un "+" à la droite du champ

email

Idem type input, mais le type html sera email. Il n'y aura pas de différence si on a désactivé la validation navigateur (voir ici)

number

Le type number correspond à un input type number en html.

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels
  • placeholder : permet de mettre une indication en filigrane quand le champ est vide
  • multi (booléen) : permet à l'utilisateur de spécifier plusieurs valeurs en ajoutant des lignes grâce à un "+" à la droite du champ
  • step :
  • min :
  • max :

password

Le type password correspond à un input type password en html.

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels
  • placeholder : permet de mettre une indication en filigrane quand le champ est vide

text

Le type text correspond à une textarea en html.

Paramètres requis :

  • nb_lines : le nombre de lignes de la zone de texte

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels
  • placeholder : permet de mettre une indication en filigrane quand le champ est vide

select

Le type select correspond à un select en html.

Paramètres requis :

  • options (config) : un bloc de configuration pour les valeurs du select (voir ici)

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels
  • multi (booléen) : indique si le select est multiple. La fonctionnalité est implémentée différemment : on bascule sur des checkboxs présentés dans une liste déroulante pour une interface utilisateur plus conviviale que le maintient de la touche ctrl.
  • nb_lines : nombre de lignes visibles si multi

checkbox

Le type checkbox correspond à un input type checkbox en html.

Paramètres requis :

  • options (config) : un bloc de configuration pour les valeurs des checkbox (voir ici)

radio

Le type radio correspond à un input type radio en html.

Paramètres requis :

  • options (config) : un bloc de configuration pour les valeurs des boutons radio (voir ici)

date

Le type date correspond à un input type date. Un date picker apparait quand on clique dans le champ.

Paramètres (tous optionnels):

  • format : une chaine de caractères parmi :
    • 'Y-m-d' (default)
    • 'd-m-Y'
    • 'Y/m/d'
    • 'd/m/Y'
  • min : la date minimale acceptée (la date du jour si non renseigné)
  • max : la date maximale acceptée (la date du jour + 1 an si non renseigné)

min et max peuvent être des dates au format spécifié (Y-m-d par défaut) ou bien

  • Y ou Y ± N (avec N un nombre entier) : le 1er janvier (min) ou le 31 décembre (max) de l'année ± N années
  • M ou M ± N (avec N un nombre entier) : le 1er (min) ou dernier (max) jour du mois ± N mois
  • D ou D ± N (avec N un nombre entier) : aujourd'hui ± N jours

Exemples :

  min = D       # à partir d'aujourd'hui
  max = D+365   # à l'horizon d'un an

  min = Y-1   # du premier janvier de l'année précédente
  max = Y+1   # au 31 décembre de l'anée suivante

datetime

idem date à part les options de format :

  • 'Y-m-d H:i' (default)
  • 'd-m-Y H:i'
  • 'Y/m/d H:i'
  • 'd/m/Y H:i'

time

Le type time est une heure au format 24h : 00:00 → 23:59

Aucune option

file

Le type file correspond à un input type file.

Paramètres optionnels :

  • width : permet de spécifier une largeur en pixels

En mode edition, si on précise une valeur pour un champ de ce type, cette valeur (nom d'un fichier) sera affichée dans le placeholder du champ à titre indicatif, mais le champ sera vide si un nouveau fichier n'est pas chargé par l'utilisateur. On ne peut pas pré-remplir un input type file.

complex

Le type complex permet d'agréger (de combiner) différents champs entre entre eux.
Chaque ensemble de valeurs représente une valeur du champ complexe.

Paramètres requis :

  • une ou plusieurs configs des champs qui composent le champ combiné

Paramètres optionnels :

  • multi (booléen) : si on peut préciser plusieurs valeurs du champ combiné ou non

custom

Le type custom permet de faire un champ de formulaire personnalisé (si aucun autre type ne convient à ce que l'on veut faire).
Pour cela on devra écrire une classe php qui hérite de MForm, dans laquelle on écrira une méthode chargée d'afficher le champ de formulaire. On indiquera le nom de cette méthode dans un paramètre de la configuration du champ.

Paramètres requis :

  • display_method : le nom de la méthode à appeler pour afficher le champ

Le bloc "options" pour les types select, checkbox et radio

Le bloc "options" doit contenir le paramètre "type" qui peut prendre une des deux valeurs suivantes :

  • constant : la liste des options est toujours la même. Elle doit être indiquée dans le bloc (voir ci-dessous)
  • custom : la liste des options est dynamique. Elle sera précisée à l'exécution grâce à la méthode setCustomOptions (voir plus bas). On utilisera cette méthode si les éléments d'une liste déroulante sont stockés en base de données par exemple.

Si le type est "contant", il faut alors préciser les 2 paramètres suivants :

  • values : les valeurs des options séparées par des "/" (Ex : 1/2/3)
  • displays : les libellés de ces options séparées par des "/" dans le même ordre (Ex : red/green/blue)

Exemple d'un select avec des options constantes :

<le_nom_du_champ>
    type = select
    display = Choisissez une valeur   #ce qui s'affiche en regard du champ, équivalent à un label
    <options>
        type = constant
        values = 1/2/3
        displays = red/green/blue
    </options>
</le_nom_du_champ>

Exemple d'un select avec des options dynamiques à l’exécution :

<le_nom_du_champ>
    type = select
    display = Choisissez une valeur   #ce qui s'affiche en regard du champ, équivalent à un label
    <options>
        type = custom
    </options>
</le_nom_du_champ>

Exemple d'utilisation de setCustomOptions :

$form = mlib\ui\form\MFormFactory::createFromFile(__DIR__."/path/to/form.conf");
$form->registerAssetsPath("path/to/assets_libs/mlib/MForm/");

$values = $database->getValuesOrderByValues(); // pour l'exemple
$labels = $database->getLabelsOrderByValues(); // pour l'exemple

$form_options = array(
    'my_select_with_dynamic_options' => array('values' => $values, 'displays' => $labels)
    // other options for other fields could be set here
  );
$form->setCustomOptions($form_options);

$form->display();

Extras

Aides

Comme indiqué plus haut, on peut, pour chaque champ du formulaire, spécifier une url pour afficher une aide.
On utilise pour cela le paramètre help
On peut aussi utliser les paramètre help_width et help_height pour préciser les dimensions de la boite modale

Fieldsets

On peut regrouper des champs du formumaire des fielsets simplement en encadrant ces champs dans une balise nommée fieldset*

Le nom du fielset n'a aucune valeur. C'est à dire qu'on peut lui donner le nom qu'on veut, la seule contrainte étant que deux fieldsets ne peuvent avoir le même nom.

Exemple :

<fieldset_1>
    hiddeable
    display = A Fieldset
    help = path/to/help_for_fieldset.txt


    <field1>
    ....
    </field1>
    <field2>
    ...
    </field2>

</fieldset_1>

On voit ici qu'il existe des options pour les fieldsets :
* display : le libellé qui sera affiché
* hiddeable (booléen): si le fieldset peut être replié ou non
* help : voir au dessus, pareil que pour un champ de formulaire

Submit et action

En dehors de tous les champs et fieldsets du formulaire on peut spécifier à la racine du fichier de configuration le paramètre action si l'url de traitement du formulaire n'est pas la même que l'url du formulaire

On peut aussi préciser un bloc spécial submit pour modifier la valuer du bouton de validation du formulaire et/ou ajouter un captcha.

Exemple:

<submit>
    display = Envoyer
  captcha = path/to/something/which/generate/an/image
</submit>

S'il y a un captcha, le code qui aura généré l'image devra avoir stocké le code dans la session.
Le code saisi par l'utilisateur se trouvera dans le champ mform_captcha à la réception du formulaire

Validation navigateur