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.
