Je n'ai pas de problème de code, mais plus un problème de compréhension.
J'ai trouvé 2 liens, en plus de la documentation officielle, qui expliquent de manière presque équivalente comment créer des selects qui dépendent d'un autre.
J'ai bien compris pourquoi et comment utiliser le PreSetData qui sert à l'ajout dynamique de champs et le remplissage des forms par des datas (value par défaut lors d'un edit par exemple).
Cependant, à ce jour et malgré tous ces articles, je n'arrive pas à comprendre l'utilité de PreSubmit dans ce cas d'utilisation. Est-ce que l'un de vous aurait-il l'amabilité de m'en dire un peu plus ?
De plus, par rapport à ces articles qui sont de la version 2.4+, y a-t-il des choses qui ne sont plus d’actualités dans la version 3 de Symfony ?
Vous en remerciant, n'hésitez pas à me demander si il y a besoin de plus de renseignements sur ma demande d'aide.
J'ai moi-même du mal à comprendre cette notion, mais je vais essayer d'expliquer ce que j'ai compris, et ça me permettra de suivre le thread pour de plus amples informations
Lors d'un submit d'un formulaire, le composant Validator va s'assurer que les champs initiale de ton formulaire corresponde bien aux champs qui ont été submit. C'est comme ça qu'il arrive à correctement mapper les données et hydrater ton entity (dans le cas où ton formulaire est lié à une entity).
Si tu commences ton formulaire avec 3 champs, et que tu en ajoutes un 4e dynamiquement, Symfony n'est pas au courant de ce nouveau champ et te sors une erreur du type "This form should not contain extra fields". L'erreur est envoyé par le Validator.
Pour éviter ce souci, l'idée est d'ajouter un listener POST_SUBMIT sur le champ ajouté dynamiquement, pour que Symfony le detecte comme faisant parti du formulaire, et qu'il soit donc valide.
C'est effectivement ce que j'ai cru comprendre dans le deuxième article qui dit, je cite :
Even though we don’t really care about the province ID, we need this information, in order to create a list of cities, based on the selected province. If not, the form validation will fail, as the preSetData() will have created either an empty city list (create new account) or a list with cities in the accounts province (updating an account). If the user modified its account to a city in another province, the form validation will fail, as the submitted ID is not an id in the choices list of the city element. It will however, not fail when you change to a city in the same province.
En revanche tu parles de PostSubmit, je pense qu'il vaut mieux utiliser PreSubmit comme sur les exemples non ? Ils indiquent plus loin dans leur exemple qu'on le fait en PreSubmit car au PreSubmit, l'hydratation n'est pas fait car il n'y a pas besoin de changer la data, mais uniquement de récupérer le contenu pour changer des éléments :
we use the PRE_SUBMIT event, instead of the POST_SUBMIT. This means that our submitted data is not yet hydrated into an entity, but in our case, we don’t use the event for changing data: it’s about changing the elements and its contents so the validation of the entity later on will succeed.
La doc Symfony indique l'utilité pour PreSubmit :
Change data from the request, before submitting the data to the form;
Add or remove form fields, before submitting the data to the form.
Après si il y a d'autres avis sur le sujet, je suis preneur
Il faut distinguer 2 types de formulaires dynamiques :
Celui où tu rajoutes un champ
Celui ou tu modifie la valeur d'un champ (les items d'un select par exemple)
C'est le premier cas que j'ai expliqué, où il faut utiliser un POST_SUBMIT (ça doit peut-être aussi marcher avec un PRE_SUBMIT, car le but est de rendre le form valide, et la validation s’exécute après le submit, donc après l'event POST_SUBMIT, qui est lui même après le PRE_SUBMIT).
Dans le 2e cas, l'idée est de modifié la valeur d'un champ avant de le submit. D'où l'idée d'utiliser un PRE_SUBMIT, sinon les données envoyées ne seront pas les bonnes.
C'est vrai que ta question portait plus sur le 2e cas (l'exemple pays > region > ville)
Je relance le sujet pour voir si il y aurait des informations complémentaires.
Le cas échéant, je passerai le sujet en résolu.
Salutations,
Celui qui croit tout savoir n'apprend plus.
[Symfony 3] Form Events
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Celui qui croit tout savoir n'apprend plus.
Celui qui croit tout savoir n'apprend plus.
Celui qui croit tout savoir n'apprend plus.