- Ymox,
Bonjour à tous !
Aujourd’hui, je suis ici parce que j’ai une contrainte de validation qui me paraît un peu particulière. Je tiens à préciser que je suis sous Symfony 2.8, et que passer à une version plus récente (probablement 3) n’est pas considérable dans les mêmes délais.
L’idée est de valider l’upload de scans de documents d’identité, et de renseigner en même temps certaines valeurs (code de sécurité. date d’expiration). Valider des champs, pas de souci, valider un upload, OK, valider une entité, pas de souci. Le problème est qu’il y a des cas spécifiques.
D’une part, on peut uploader un de ces documents pour une personne existante, donc formulaire "principal".
D’autre part, à la création d’une nouvelle personne, celui qui remplit peut fournir le scan et saisir ces informations, donc formulaire embarqué.
Mais indépendamment de cela, certaines personnes peuvent ne pas avoir à remplir les champs texte/date/autres, en clair ne fournir que le scan.
Le scénario est donc le suivant :
- Si j’ai les droits d’uploader des fichiers sans faire plus
- et que je créé une nouvelle personne : je n’ai aucune contrainte.
- et que j’ajoute un document à une personne existante : le champ du fichier est obligatoire
- Si je dois remplir les champs
- et que je créé une nouvelle personne
- et que je n’ai pas de document à ce moment : je n’ai aucune contrainte sur les champs du document
- et que je renseigne le document : les autres champs du document "deviennent" obligatoires
- et que j’ajoute un document à une personne existante :
- tous les champs sont obligatoires
- et que je créé une nouvelle personne
Du coup, je tente de voir comment spécifier les contraintes serveur en fonction de cela.
J’ai déjà deux formulaires, un pour embarquer et un autre "standalone". Pour l’instant, le second hérite du premier (principalement parce que le second contient le bouton de soumission dans sa déclaration des champs).
J’avais pensé à une validation par callback, mais je ne vois pas comment je peux passer le service security.authorization_checker
à ma méthode (qui réside dans l’entité).
J’ai aussi réfléchi aux événements de formulaire pour ajouter le champ avec les contraintes correctes, mais avec PRE_SET_DATA, POST_SET_DATA et PRE_SUBMIT, je n’ai pas la propriété qui est remplie. Je l’aurais avec POST_SUBMIT, mais évidemment une fois le formulaire soumis au sens Symfony, plus moyen d’y ajouter un champ…
Je pourrais me créer mon propre validateur, mais ça me paraît relativement overkill…
Mon souci est donc soit d’accéder au service security.authorization_checker
, soit de savoir si un fichier a bien été envoyé.
Est-ce que quelqu’un aurait déjà rencontré un cas similaire ?
Merci d’avance
Edit
En fait, j’étais resté bloqué sur @Assert\Callback()
, qui forcément est dans l’entité. Mais si je définis la contrainte dans la classe de fomrmulaire, j’ai accès à plus de choses, notamment les valeurs "brutes" du formulaire. Le seul hic maintenant est que j’ai une "double" validation, une avec les annotations dans l’entité, et une autre de par les contraintes dans la classe de formulaire. Je soupçonne une différence entre l’appel à handleRequest()
et submit()
, l’une impliquant la validation des mappings et pas l’autre.