Bonjour à tous,
J'avais débuté il y a quelques mois un début d'appli en php/js sans framework, mais, à force de lire des tuto par ci par la parlant des Frameworks, j'ai franchi le cap.
Je suis donc en train d'apprendre le framework symfony afin de réaliser une petite appli php en interne au boulot.
Après quelques manips, il est vrai que c'est bien foutu et que l'on gagne en lisibilité et en temps. Par contre, je tombe sur un os. Je sens que je ne suis pas loin, mais y'a des choses qui m'échappent et j'aurais besoin d'un œil avisé et d'une explication plus clair car je ne trouve pas la réponse à mon problème (qui est tout simple j'en suis sur). Tout cela se passe du coté du formulaire et de la génération automatique d'un select à partir d'un autre select. Je me suis basé sur la doc dispo à l'adresse http://symfony.com/doc/current/form/...submitted-data, ainsi qu'une multitude de forums qui me ramène à chaque fois à cette page.
Donc, dans un premier temps, j'ai trois entity:
- Enseigne
- Magasin
- Visite
Mon entity Magasin est lié à mon Enseigne en ManyToOne, et mon entity Visite est lié à mon Magasin en ManyToOne également. Je passe le code qui est issu de la génération d'une entity de la console symfony.
J'ai créé dans mon MagasinRepository une fonction qui me permet de lister mes magains par enseigne (getMagasinParEnseigne). Cela fonctionne bien pour cette partie
Je veux créer un formulaire Visite dans lequel je veux sélectionner une enseigne, qui filtrera automatique les magasins de l'enseigne. Je n'ai pas intégré de lien entre les visites et les enseignes car, je peux l'obtenir via le lien vers le magasin. Donc, j'ai vu qu'il fallait rajouter l'option mapped à false et cela fonctionne bien.
Donc, je passe par la fonction symfony de création de formulaire que je modifie ensuite et dont voici le code de la fonction BuildForm:
Dans mon formulaire en twig, je n'ai pas fait de mise en forme spécifique pour le moment. j'ai simplement ceci:
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 public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('dateVisite', DateTimeType::class) ->add('Enseigne', EntityType::class, array( 'class' => 'BRSuivicommercialBundle:Enseigne', 'choice_label' => 'enseigne', 'multiple' => false, 'mapped' => false )) ->add('commentaire', TextareaType::class); $formModifier = function (FormInterface $form, Enseigne $enseigne = null) { $magasins = null === $enseigne ? array() : $enseigne->getMagasin(); $form->add('Magasin', EntityType::class, array( 'class' => 'BRSuivicommercialBundle:Magasin', 'placeholder' => '', 'choices' => $magasins, )); }; $builder->addEventListener( FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) { $data = $event->getData(); $formModifier($event->getForm(), $data->getMagasin()); } ); $builder->addEventListener( FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) { $enseigne = $event->getForm()->getData(); $formModifier($event->getForm()->getParent(), $enseigne); } ); }
Enfin, voici l'extrait de mon controller:
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 <h1>{{ titre }}</h1> {{ form(form) }} <script type="text/JavaScript"> $(function () { jQuery(document).ready(function() { console.log("jQuery est prêt !"); $("#br_suivicommercialbundle_visite_Enseigne").change(function() { mafonctionchange('Magasin','Enseigne'); }).trigger('change'); function mafonctionchange(selecteur,selecteurparent) { $.ajax({ url: '{{ path('br_suivicommercial_visites_add')}}', type: 'POST', data: { idEnseigne : $("select#br_suivicommercialbundle_visite_"+selecteurparent+" option:selected").val(), select : selecteur }, dataType: 'data', success: function(html) { $('#br_suivicommercialbundle_visite_'+selecteur).replaceWith( $(html).find('#br_suivicommercialbundle_visite_'+selecteur) ); }, error: function() { console.log('error'); } }); } }); }); </script>
Le chargement du formulaire se fait bien, cependant, je n'ai aucun magasin qui apparaît suite à ce code. J'ai réussi à la faire apparaître auparavant sans malheureusement pouvoir les filtrer. Je peux sélectionner les enseignes mais aucun changement n'apparait dans mon formulaire. Pourtant, j'ai bien mon script qui tourne car j'ai le message 'error' qui apparaît dans ma console.
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 public function visiteEditAction(Request $request, $id = null) { $visite = new Visite(); $form = $this->createForm(VisiteType::class, $visite); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // ... save the meetup, redirect etc. } return $this->render( 'BRSuivicommercialBundle:Visites:_ajout.html.twig', array('form' => $form->createView(), 'titre' => 'test' ) ); }
Je suis en train de tourner dingue après tous les essais effectués. Je sens que le code qui ne va pas est le suivant:
Je n'arrive pas à voir à quel moment je récupère mes infos de mon formulaire, ainsi qu'à l'endroit ou il est transmis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $formModifier = function (FormInterface $form, Enseigne $enseigne = null) { $magasins = null === $enseigne ? array() : $enseigne->getMagasinParEnseigne($enseigne);
Si une ame bienveillante pouvait m'aiguiller et m'expliquer, je lui en serai reconnaissant.
Merci
Partager