Symfony 5 : form avec champ upload de fichier et formulaire invalide
Bonjour à tous,
Sous SF 5.2.1 (avec Bootstrap 4 et Jquery), j'ai une entité qui contient un champ texte pour stocker le nom d'un fichier uploadé, et d'autres champs avec des asserts.
Entité produit :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| /**
* @ORM\Column(type="text", nullable=true)
* @Assert\Length(max = 1000, maxMessage = "La description ne peut pas dépasser {{ limit }} caractères.")
*/
private $description;
/**
* @ORM\Column(type="string", length=200)
* @Assert\NotBlank(message="Ce champ doit être renseigné.")
* @Assert\Length(max = 200, maxMessage = "Le champ 'nom de la photo' ne peut pas dépasser {{ limit }} caractères.")
*/
private $nomImage; |
Formulaire :
Code:
1 2 3 4 5 6 7 8
| ->add('description', TextareaType::class, array(
'label' => 'Description',
))
->add('nomImage', FileType::class, [
'label' => 'Fichier de la photo',
'mapped' => false,
'attr' => array('placeholder' => 'Sélectionnez un fichier'),
]); |
Et dans ma page, j'ai un peu de Jquery pour afficher le nom du fichier dans le champ du formulaire :
Code:
1 2 3 4 5 6 7 8 9
| <script>
// afficher la valeur dans le champ input du fichier sélectionné
$('.custom-file-input').on('change', function(event) {
var inputFile = event.currentTarget;
$(inputFile).parent()
.find('.custom-file-label')
.html(inputFile.files[0].name);
});
</script> |
Dans mon controleur, je fais exactement selon le principe de la doc : https://symfony.com/doc/current/cont...load_file.html
Dans le cas le plus courant, où les validations des champs sont ok, tout fonctionne.
Dans le cas où mes saisies sont bloquées par un assert, par exemple la valeur de mon champ description qui est trop longue, mon controleur a faux à la ligne if ($form->isSubmitted() && $form->isValid()).
Mon formulaire se réaffiche bien, avec les erreurs affichées et les valeurs précédemment saisies, sauf pour le champ nomImage qui est vide. Il faut alors aller rechercher le même fichier par le bouton browse de ce champ.
Je pense qu'il faut que je complète mon Jquery, qui n'agit que quand on sélectionne un fichier.
Mais dans ce cas, je ne vois pas où aller chercher la valeur de la saisie précédente.
J'ai essayé en ajoutant un else au if ($form->isSubmitted() && $form->isValid()) du controleur, où j'alimente un champ que j'ajoute, champ en hidden qui prend la valeur précédente du champ nomImage.
Mais là, je ne trouve pas comment compléter mon Jquery pour aller chercher cette valeur, et alimenter le champ nomImage.
ça vous semble faisable de faire comme ça, ou je me suis lancé dans une usine à gaz ?
Vous avez des idées svp, que ça soit en complément de mes essais, ou tout à fait autre chose ?
Merci d'avance !
Coloration syntaxique twig
Salut,
je pense que ce n'est pas la bonne solution... même si tu retourne le nom de ton fichier que tu passes à ton jquery, l'objet file ne sera plus existant dans ton nouveau DOM..., il faudra donc de toute façon recharger ton image.
EN tout état de cause pour envoyer le nom de ton image récupérée depuis le hidden, tu l'envoie en tant que variable à ta vue puis dans ta page tu test si ta variable existe et si oui tu la mat dans une variable js
Code:
1 2 3 4 5
| {% if foo is defined %}
<script>
var mavar = {{foo}}
</script>
{% endif %} |
il ne te reste qu'à récupérer mavar dans ton jquery...