Bonjour à tous,
je suis à 2 doigts d'arriver à mes fins mais je bloque sur une dernière chose, je vous explique :
J'ai donc un formulaire qui contient une collection d'un autre formulaire qui lui contient une EntityType et une autre EntityType qui dépend du premier ainsi que 2 champs qui apparaisses ou non en fonction du 2eme EntityType (j'espère que ça suis lol).
La première partie entre les 2 EntityType fonctionnent, et du coup il me manque que les 2 champs qui apparaissent/disparaisse en fonction du 2eme EntityType.
Plus précisément la 2ème partie fonctionne par le submit quand les entités sont persisté mais pas quand je passe par l'AJAX.
J'ai suivi cette doc : http://symfony.com/doc/current/form/...ification.html
Au chapitre "Dynamic Generation for Submitted Forms" je pense qu'il y a quelque chose que je ne saisie pas.
Alors pour vous montrer voila l'idée du formType :
Alors avec ce code là aucun soucis pour l'entite1 quand j’envoie mon formulaire via AJAX le formulaire construit avec la nouvelle valeur de l'entite1 est bien bindé et donc le champs entite2 découle parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 $builder ->add('entite1') ; $formModifier = function ($form, $entite1 = null, $entite2 = null) { if($entite1){ $choices = null === $entite1 ? array() : $entite1->getChoices(); $form->add('entite2', EntityType::class, array( 'class' => 'AppBundle:Entite2', 'placeholder' => '', 'choices' => $choices, )); if($entite2){ if($entite2->getValeurAutorise()){ $form->add('champ1', ChoiceType::class, array( 'choices' => array( 'test1' => false, 'test2' => true, 'test3' => null ), 'data' => false )); $form->add('champ2'); } } } }; $builder->get('entite1')->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $entite1 = $event->getForm()->getData(); if($entite1){ $formModifier($event->getForm()->getParent(), $entite1); }else{ $formModifier($event->getForm()->getParent()); } } );
Là ou ça se complique pour l'entite2 c'est qu'elle n'est pas toujours existante et dépend de l'entite1 j'ai donc pensé faire :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 if($builder->has('entite2')){ $builder->get('entite2')->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $data = $event->getForm()->getData(); if($data){ $formModifier($event->getForm()->getParent(), $data->getEntite1(), $data->getEntite2()); }else{ $formModifier($event->getForm()->getParent()); } } ); }
dans les 2 cas à l'envoi de ma requête AJAX il passe uniquement dans le POST_SUBMIT de l'entite1 et jamais dans celui de l'entite2. (donc là déjà y a quelque chose que je ne saisie pas)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 if($builder->has('entite2')){ $builder->get('entite2')->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $entite2 = $event->getForm()->getData(); if($entite2){ $formModifier($event->getForm()->getParent(), null, $entite2); }else{ $formModifier($event->getForm()->getParent()); } } ); }
l'autre idée que j'ai eu c'est de faire un truc plus général :
mais là j'ai carrément une erreur sur une variable qui existe plus dans mon TWIG impossible de vraiment comprendre pourquoi mais j'ai pas trop creusé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 $builder->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $data = $event->getForm()->getData(); if($data->getEntite1() && $data->getEntite2()){ $formModifier($event->getForm()->getParent(), $data->getEntite1(), $data->getEntite2()); }elseif($data->getEntite1()){ $formModifier($event->getForm()->getParent(), $data->getEntite1()); }else{ $formModifier($event->getForm()->getParent()); } } );
Bref si quelqu'un aurai une piste ou une explication plus clair que la doc je suis preneur.
Partager