2010-05-06 8 views
4

J'utilise Symfony 1.3.2 sur Ubuntu et j'ai un formulaire qui contient plusieurs widgets. Un widget est le fichier sfWidgetFormInputFile, qui permet à un utilisateur de sélectionner une image.Formulaires Symfony - mémorisation d'un fichier précédemment sélectionné

Si le formulaire n'est pas valide, je le présente de nouveau à l'utilisateur, pour corriger le (s) champ (s) erroné (s). Le problème que j'éprouve est celui actuellement, quand le foem ne valide pas (pour n'importe quelle raison), le fichier d'image qui a été spécifié par l'utilisateur est perdu (c'est-à-dire qu'ils doivent sélectionner le dossier encore).

Comment est-ce que je peux montrer le formulaire à l'utilisateur encore, avec le fichier d'image choisi toujours là (ainsi ils ne doivent pas sélectionner le dossier encore)? Dans mon action qui traite le formulaire POSTed, j'appelle getFiles ($ key), puis j'indexe le tableau récupéré pour obtenir les informations sur le fichier et la définition de la valeur par défaut du widget (voir ci-dessous). Cependant, le widget rendu est vide (ne conserve pas la valeur du chemin d'accès au fichier sélectionné précédemment

Un bout de code mon (action) ressemble à ceci:.

$files = $request->getFiles('foobar'); 

if(!empty($files) && isset($files['pict_path'])){ 
    $pic_info = $files['pict_path']; 
    $originalName =$pic_info['name']; 
    $type = $pic_info['type']; 
    $tempName = $pic_info['tmp_name']; 
    $size = $pic_info['size']; 
    $pict_file = new sfValidatedFile($originalName, $type, $tempName, $size); 

    $this->form->setWidget('pict_path', new sfWidgetFormInputFile(array('default'=>$pict_file))); 
} 

Quelqu'un peut-il suggérer comment pense appliquer correctement le comportement souhaité décrit ci-dessus

?

Répondre

0

Je ne pas que vous pouvez enregistrer l'état d'un contrôle de téléchargement de fichiers. Et je ne pense pas que vous devriez.

vous pouvez télécharger les fichiers avant que le reste le formulaire est traité. le processus en deux:

  1. validation du fichier
  2. de validation de formulaire

Si la validation du formulaire échoue et l'utilisateur ne cherche pas à le soumettre à nouveau à l'aide des informations correctes, vous défaussez les fichiers plus tard. Cela ajoute un peu de frais généraux mais améliore l'expérience utilisateur à mon avis. L'utilisateur peut entrer par erreur des données erronées, mais lorsque vous rechargez la page avec les instructions appropriées, les fichiers sont toujours présents.

2

L'attribut de valeur de la balise html d'entrée (avec type = "file") est en lecture seule. Vous ne pouvez pas définir une valeur par défaut. Cela vous permettra de télécharger n'importe quel fichier du disque dur de l'utilisateur sur votre serveur en définissant la valeur de la balise d'entrée.

L'utilisateur doit choisir implicitement le fichier chaque fois qu'il soumet le formulaire. La solution proposée par Tomas est une bonne solution. Stockez le fichier dans un dossier temporaire, stockez ces informations dans la session (afin de pouvoir les afficher de nouveau dans votre formulaire) et, après un envoi réussi, effacez les informations de session du fichier et déplacez le fichier vers la bonne destination.

Voir cette page, B.10.1 Problèmes de sécurité pour les formulaires sur le site Web du W3C: http://www.w3.org/TR/html401/appendix/notes.html#forms-security

Questions connexes