Uploadez en Symfony
Quand on utilise un framework PHP aussi propre et bien pensé que symfony, on a souvent envie de continuer ce beau travail en ajoutant notre code de la meilleur des façons pour conserver la logique de l’application, MVC, héritage, composition…
Mais ce n’est pas toujours simple. Voici un petit exemple qui concerne un passage obscur de la documentation officielle des formulaires dans symfony, l’upload de fichier.
Pour commencer, il faut souvent définir dans la définition de notre formulaire le widget et le validator correspondant. Dans notre exemple, on prendra un champ nommé avatar, imaginons un classe Profil:
public function configure() { $this->widgetSchema['avatar'] = new sfWidgetFormInputFile(); // Un upload étant rarement obligatoire, // le cas de l'avatar est un bon exemple, on le rend facultatif ici $this->validatorSchema['avatar'] = new sfValidatorFile(array('required' => false)) ; }
Maintenant on a bien notre formulaire qui s’affiche correctement. Le problème, si on n’upload pas de nouvel avatar, à la prochaine sauvegarde, le champ avatar sera remis à sa valeur par défaut, fonctionnement tout à fait normal en l’état.
Pour éviter ceci, voici la fonction à rajouter, toujours dans notre classe de notre formulaire Profil, c’est en fait une surcharge de la méthode save:
public function save($con = null) { // On test si le champ avatar a été renseigné dans le formulaire if ($file = $this->getValue('avatar')) { // Si oui, on sauvegarde le fichier $filename = 'nomDuFichier'; $extension = $file->getExtension($file->getOriginalExtension()); $file->save(sfConfig::get('sf_upload_dir').$filename.$extension); } else { // Si non, on récupère la version actuelle dans l'objet Père (ici profil), // que l'on insère dans le tableau de valeur du formulaire $this->values['avatar'] = $this->getObject()->getAvatar(); } // Puis on lance la sauvegarde normal de la classe mère return parent::save($con); }
Et voilà, nous sommes restés dans la logique métier de symfony, en surchargeant l’existant et surtout en permettant de garder notre action identique, les modifications ayant été apportées dans le modèle.
Tags: howto, PHP, Symfony, upload
4 Réponses
Laisser un message

J’ai beau voir ce code sur plein de forums, ça ne fonctionne pas chez moi. Je pense que cela provient du fait que mes formulaires soient internationalisés.
Dans les dernière versions (à partir de la 1.2.6 il me semble), il me semble qu’il n’est plus nécessaire de surdéfinir la function save.
J’ai d’ailleurs un billet qui traite un peu du sujet qui paraitra demain.
A tester, mais effectivement, je ne sais pas si l’i18n change la donne.
N’hésite pas à venir donner la solution ici, si tu trouves ;)
bonjour !
petite question sur la surcharge de la méthode save : sur quel fichier est-il conseillé de la faire?
merci
hello pako,
Désolé pour le retard de réponse, pas mal de taff en ce moment ;)
Dans le cas présent, c’est le save du form qui a été surchargé.
Mais je te conseillerai maintenant de passer plutôt par doSave qui est fait pour ça : )