Formulaires symfony: Traitement sur la valeur d'un champ à la sauvegarde
By eNk` on Tuesday, April 28 2009, 21:43 - Symfony - Permalink
Voici une petite astuce permettant d'effectuer un traitement sur la valeur d'un champ lors de la sauvegarde d'un formulaire Doctrine ou Propel.
Imaginons par exemple une classe User avec deux attributs login et password de type string, password que nous allons sauvegarder en MD5 dans notre table user.
Pour enregistrer un utilisateur en base nous allons évidemment utiliser la classe de formulaire correspondant à notre classe User. Il serait donc pratique que lorsque l'on appelle la méthode save() de notre objet UserForm le mot de passe saisi par l'utilisateur dans le champ password soit automatiquement converti en MD5.
Pour commencer regardons la hiérarchie de classe de formulaires générée par symfony:
Propel: UserForm < BaseUserForm < BaseFormPropel < sfFormPropel
Doctrine: UserForm < BaseUserForm < BaseFormDoctrine < sfFormDoctrine
Ce sont les classes sfFormDoctrine et sfFormPropel qui vont nous intéresser car elles possèdent une méthode processValues() qui est appelée au moment de la mise à jour de l'objet User correspondant au formulaire. Elle a pour but de nettoyer les valeurs avant la mise à jour de l'objet. C'est donc grâce à cette méthode que nous allons pouvoir faire un traitement sur les valeurs saisis des champs et dans notre cas mettre le password en MD5. En effet pour chacun des champs du formulaire processValues() va appeler, si elle existe, une méthode updateXXXColumn() où XXX est le nom PHP d'un champ du formulaire, afin d'effectuer un traitement particulier sur la valeur de ce champ.
Donc pour convertir le texte saisi dans le champ password en MD5 au moment de la sauvegarde du formulaire, il suffit de définir une méthode updatePasswordColumn() dans la classe UserForm.
public function updatePasswordColumn($value)
{
if(!empty($value)) { $value = md5($value); }
return $value;
}
NOTE: la méthode processValues() retourne un tableau contenant les valeurs nettoyées pour chaque champ, si une méthode updateXXXColumn() retourne false alors processValues() va supprimer le champ XXX du tableau qu'elle retourne.
Comments
Plus simplement, il est possible de faire ceci
public function setPassword($value) {
parent::_set('password', sha1($value));
}
Par exemple (où password est le nom du champ à updater).
La solution du setter peut paraitre plus simple au premier abord. Mais cela implique que tu appel la méthode toi même (ou alors j'ai loupé un épisode ^^) alors que les méthodes updateXXXColumn() sont appelées automatiquement par la méthode processValues() qui à pour but de faire un traitement définit par l'utilisateur avant que les valeurs de l'objet correspondant au formulaire soient mise à jour.
(processValues va intervenir suite à un save() sur ton formulaire par exemple)
Les méthodes updateXXXColumn() font parties du mécanisme du traitement des valeurs de l'objet, de même que pour les classes de filtre il est possible de créer des méthodes convertXXXValue().
<A href="http://www.toptoys2trade.com/zhu-zh... ">zhu zhu pets</A>
<a href="http://www.toptoys2trade.com/a-sill... "> silly bandz</a>
<A href="http://www.toptoys2trade.com/power-... "> power balance</A>
<A href="http://www.toptoys2trade.com/animal... ">animal rubber bands</A>
<A href="http://www.toptoys2trade.com/baby-c... ">Baby Carriers</A>
<A href="http://www.toptoys2trade.com/pillow... ">Pillow Pets</A>
<A href="http://www.toptoys2trade.com/plush-... ">Plush Pencil Case</A>
<A href="http://www.golf-equipment2u.com ">golf equipments</A>
[url=http://www.b2chandbag.com/guess-han... ]guess handbags[/url]
[url=http://www.b2chandbag.com/d&g-h... ]d&g handbags[/url]
[url=http://www.b2chandbag.com/ ]prada handbags[/url]
[url=http://www.topcasualshoes.com/ ]ecco shoes[/url]