Traduction du billet
'Data filters for patForms' de php-tools:
Inspiré par les commentaires de
Helgi sur
patForms, Stéphane a commencé une nouvelle approche des filtres de données.
Les filtres de données de patForms sont bien plus puissants que les filtres dans d'autres outils comme QuickForm, par ex - et voici pourquoi:
- Les filtres fonctionnent dans deux sens: il est par ex. possible d'enregistrer une durée en secondes dans une base de données, mais de permettre l'utilisateur d'entrer la durée en heures en utilisant un filtre de multiplication.
- Les filtres peuvent être appliqués avant que les données du formulaire ne soient validés: nous les appelons des filtres HTTP, comme ils se trouvent entre le navigateur et patForms.
- Les filtres peuvent être appliqués après que les données du formaulaire aient été validées: nous les appelons des filtres PHP comme ils se trouvent entre patForms et l'application.
Parcontre, l'utilisation de ces filtres est quand-même plus hardue que les filtres de QuickForm, comme chaque filtre (indépendamment de sa réelle complexité) est un objet et doit être instancé avant d'être utilisable. On se retrouvait donc avec quelque-chose comme-ça:
<?php
// instancer le filtre
$filter =& patForms::createFilter( 'Trim' );
// accéder à l'élément cible
$el =& $form->getElementByName( 'username' );
// appliquer le filtre à l'élément
$el->applyFilter( $filter );
?>
Helgi s'est plaint que dans la plupart des cas, on ne voudra appliquer que des fonctions PHP natives aux valeurs du formulaire, et que pour ça c'est un peu overkill (p.s. quelqu'un connaît une bonne traduction de overkill?)... Finalement, fidèle à lui-même, Stéphane a trouvé une petite idée qui vaut le détour: il a crée un nouvel objet filtre qui peut appliquer n'importe-quelle fonction native de PHP aux valeurs d'un formulaire. Jusque-là, rien d'extraordinaire - mais avec une nouvelle fonction dans la classe de base d'un élément, il est possible d'instancer et de configurer cet objet avec seulement une ligne de code. Ca réduit le code nécessaire en gardant la flexibilité originelle des filtres:
<?php
// get the element
$el =& $form->getElementByName( 'username' );
// apply an HTTP filter for incoming data
$el->applySimpleFilter('strtolower');
?>
En plus d'une fonction qui filtre les données entrantes, il est possible d'en définir une seconde qui filtrera les données sortantes (vers le navigateur). Bien sûr applySimpleFilter() accepte aussi des méthodes statiques ou méthodes d'objets.