Table des matières

Pxxo_Widget_Form

Ce widget permet de manipuler des formulaires HTML. Ses fonctionnalités sont les suivantes :

Remarque : ce widget est le successeur de Form_Generic.

Observation : Les études suivantes (étude part 1, étude part 2) seraient intéressantes à prendre en compte dans les futures évolutions de l'ergonomie de widget Form.

Paramètres du formulaire

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.

Méthodes disponibles

getInputArray

Prototype : array getInputArray($id = null)

getInputWidget

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é.

getResult

Prototype : mixed getResult($id = null)

getErrors

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.

hasError

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.

Exemples

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);
...
1) Le principe pour corriger les failles CSRF 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 soumit 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