Ce widget permet de manipuler des formulaires HTML. Ses fonctionnalités sont les suivantes :
Pagination automatique (ou manuelle) des longs formulaires.
Gestion des groupes de champs - fieldset (ces groups pourraient être utilisés pour préciser manuellement le découpage pour la pagination)Remarque : ce widget est le successeur de Form_Generic.
[1] Protection contre les attaques de type Cross-Site Request Forgeries (CSRF) : le principe pour corriger cette faille est d'ajouter un token de validité dans chaque formulaire généré. Au moment de générer le formulaire, un token (identifiant aléatoire) est placé dans la session de l'utilisateur et dans le formulaire. Ce token est alors soumis avec le reste du formulaire (en mode hidden). Le token reçu est alors comparé à celui présent en session, s'ils sont différents alors c'est une attaque CSRF. Voici un exemple concret d'attaque sur le CMS dotclear : http://ar3av.free.fr/faille-dotclear.php
| Nom | Type | Valeur par défaut | Description |
|---|---|---|---|
| inputs | Array | array() | Liste des paramètres des champs du formulaire (consultez la doc des différents types de champs pour connaître leur paramètres spécifiques). |
| method | String | 'post' | Méthode HTTP de soumission du formulaire ('post' ou 'get'). |
| action | String | ”” | Permet de forcer l'url de soumission du formulaire. Dans la plupart des cas la chaîne vide (défaut) est suffisante car le formulaire sera soumit sur lui même. |
| label_width | String | '15em' | La largeur de la première colonne. Utile seulement avec le thème 'float'. |
| required_marker | String | '* ' | Les caractères qui seront utilisés pour signaler qu'un champ est obligatoire. |
| separator_marker | String | ' : ' | Les caractères qui seront utilisés pour séparer les textes de leurs champs. |
| submit_label | String | - | La chaîne de caractères que le bouton submit doit utiliser |
| validate_callback | callback | null | Callback de validation par défaut. Si cette callback est définit, elle sera appelée N fois pour la validation des N champs qui n'ont pas eux même de callback définit. Pour connaître les paramètres attendus par la callback, référez vous à la documentation des widget Input. |
| submit_callback | callback | null | Callback appelée une seule fois lorsque le formulaire est soumis et validé (n'est pas appelée si le formulaire contient des erreurs). Par exemple, vous pouvez utiliser cette callback pour enregistrer les champs soumis dans une base de données. L'unique paramètre de cette callback est une référence vers le widget Form courant. |
| csrf_validation | Bool | true | Permet d'activer/désactiver la protection contre les attaques CSRF. |
Remarque : Le paramètre validate_callback respecte le standard PHP en la matière. Il peut donc contenir soit le nom d'une fonction, soit un tableau dont le premier paramètre est l'instance de l'objet et le second le nom de la méthode à appeler. Pour plus d'informations consultez la documentation officielle de PHP : http://www.php.net/callback#language.types.callback.
Prototype : array getInputArray($id = null)
Prototype : array getInputWidget($id)
Le paramètre $id doit correspondre à l'id d'un champ. L'instance du widget Input correspondant est alors retournée. Si l'identifiant ne correspond à aucun champs, NULL est retourné.
Prototype : mixed getResult($id = null)
Prototype : array getErrors()
Retourne la liste des éventuelles erreurs du formulaire (chaînes de caractères). Attention, les erreurs ne peuvent se produire qu'au moment où le formulaire est soumis et validé. En général le développeur n'a pas besoin d'appeler cette méthode car le formulaire se charge lui même d'afficher les messages d'erreurs.
Prototype : boolean hasError()
Retourne true si le formulaire possède des erreurs, false sinon. Cette méthode est très liée à la méthode getErrors.
Un formulaire très simple avec un unique champ texte :
require_once "Pxxo/Widget/Form.php"; $params['inputs'] = array(); $params['inputs'][] = array('id' => 'id_de_mon_test2', 'label' => 'Mon champ text', 'type' => 'text', 'size' => 50, 'required' => true, ); $o = new Pxxo_Widget_Form($params); ... if ($o->getMode() == 'submit') { echo '<pre>'; echo 'print_r($o->getErrors());'."\n"; print_r($o->getErrors()); echo 'print_r($o->getResult());'."\n"; print_r($o->getResult()); }
Un formulaire avec une callback de validation personnalisée qui va se charger de vérifier que la valeur saisie est bien un entier positif :
require_once "Pxxo/Widget/Form.php"; function my_validate_callback($input) { $errors = array(); if (!is_numeric($input['result']) || $input['result'] < 0) $errors[] = 'Ce champ doit impérativement être un entier positif'; return $errors; } $params['inputs'] = array(); $params['inputs'][] = array('id' => 'id_de_mon_nombre', 'label' => 'Entrez un entier positif', 'type' => 'text', 'validate_callback' => 'my_validate_callback', ); $o = new Pxxo_Widget_Form($params); ...
Un formulaire avec une callback de validation personnalisée qui va se charger de vérifier que les deux mots de passes saisis sont identiques :
require_once "Pxxo/Widget/Form.php"; function my_validate_callback2($input, $form) { $errors = array(); $input_mdp = $form->getInputArray('id_de_mon_mdp'); if ($input_mdp['result'] != $input['result']) $errors[] = 'Les mots de passe doivent être identique !'; return $errors; } $params['inputs'] = array(); $params['inputs'][] = array('id' => 'id_de_mon_mdp', 'label' => 'Entrez votre mot de passe', 'type' => 'password', 'size' => 10, 'minlength' => 4, ); $params['inputs'][] = array('id' => 'id_de_mon_mdp2', 'label' => 'Confirmez votre mot de passe', 'type' => 'password', 'size' => 10, 'minlength' => 0, 'validate_callback' => 'my_validate_callback2', ); $o = new Pxxo_Widget_Form($params); ...
Un formulaire avec une callback de validation par défaut qui sera appelée pour tous les champs. Ici on va simplement vérifier que les champs 'text' et 'textarea' contiennent bien les bons caractères.
require_once "Pxxo/Widget/Form.php"; $params = array(); function global_validate_callback($input) { $errors = array(); if (!preg_match('/[[:alpha:]]+/i',$input['result'])) $errors[] = 'Ce champ doit contenir impérativement une chaîne de caractères'; return $errors; } $params['validate_callback'] = 'global_validate_callback'; $params['inputs'] = array(); $params['inputs'][] = array('id' => 'id_de_mon_text', 'label' => 'Un input text', 'type' => 'text', 'value' => 'un texte' ); $params['inputs'][] = array('id' => 'id_de_mon_textarea', 'label' => 'Un input textarea', 'type' => 'textarea', 'size' => array(30,5), 'value' => 'un texte long' ); $o = new Pxxo_Widget_Form($params); ...