Bonjour, j'utilise le framework Symfony 4
J'essaie de faire une barre de recherche avec des champs imbriqués, pour ceci, je suis le tuto de Grafikart.
Le problème, le javascript ne marche pas (le champs club de la barre de recherche ne change pas en fonction de la league)
et le club n'apparait pas dès le début, je dois d'abord faire une première recherche pour que le champs apparaisse.
Voici mon PropertySearchType qui me permet de faire la barre de recherche
Code php : 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
 
namespace App\Form;
 
use App\Entity\Club;
use App\Entity\League;
use App\Entity\Nationalite;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
 
class PropertySearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('nom', TextType::class, [
                'required'=> false, 
                'label'=>false,
                'attr'=>[
                   'placeholder' => "Nom du joueur",
                   'id'=>"buttonrecherche"
                ]
            ])
            ->add('libelle', EntityType::class, [
                'class' => Nationalite::class,
                // 'query_builder' => function (EntityRepository $er) {
                //     return $er->createQueryBuilder('u');
                // },
                'required'=> false, 
                'placeholder' => 'natio',
                'choice_label' => 'libelle',
                'empty_data' => '',
                'label' => false
            ])
 
            ->add('nom_league', EntityType::class, [
                'class' => League::class,
                // 'query_builder' => function (EntityRepository $er) {
                //     return $er->createQueryBuilder('u');
                // },
                'required'=> false, 
                'placeholder' => 'league',
                'choice_label' => 'nom_league',
                'empty_data' => '',
                'label' => false
            ]);
 
                $builder->get('nom_league')->addEventListener(
                    FormEvents::POST_SUBMIT,
                    function(FormEvent $event){
                        $form = $event->getForm();
                        $form->getParent()->add('nom_club', EntityType::class, [
                            'class' => Club::class,
                            'required'=> false, 
                            'placeholder' => 'club',
                            'choice_label' => 'nom_club',
                            'empty_data' => '',
                            'label' => false,
                            // 'auto_initialize' => false,
                            'choices' => $form->getData()->getClubs()
                            ]);
                    }
                )
 
        ;
        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function (FormEvent $event) {
                $data = $event->getData();
                $club = $data->getNomClub();
                if ($club){
                    $league = $club->getLeague();
                    $this->addClubField($event->getForm(), $club);
                    $event->getForm()->get('nom_league')->setData($league);
                    $event->getForm()->get('nom_club')->setData($club);
                }
 
            }
        );
    }
 
    private function addClubField(FormInterface $form, ?League $league){
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
            'nom_club', EntityType::class, null,[
                'class' => Club::class,
                            'required'=> false, 
                            'placeholder' => 'club',
                            'choice_label' => 'nom_club',
                            'empty_data' => '',
                            'label' => false,
                            'auto_initialize' => false,
                            'choices' => $form->getData()->getNomClub()
            ]
        );
        $builder->addEventListener(
            FormEvents::POST_SUBMIT,
            function(FormEvent $event) {
                dump($event->getForm());
            }
 
        );
    }
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            // Configure your form options here
        ]);
    }
}

JavaScript qui me permet "normalement" de changer le champ club en fonction de la ligue :
Code JavaScript : 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
$(document).on('change', '#property_search_nom_league', function () {
  function Post(id) {
    $.post('index.php', { id: id }, function (data) {alert(data) });
  }
  console.log("toto")
    let $field = $(this)
    let $regionField = $('#property_search_nom_league')
    let $form = $field.closest('form')
    let target = '#' + $field.attr('id').replace('nom_club', 'nom_club')
    let data = {}
    data[$regionField.attr('name')] = $regionField.val()
    data[$field.attr('name')] = $field.val()
    // On soumet les données
    $.post($form.attr('name'), data).then(function (data) {
      // On récupère le nouveau <select>
      let $input = $(data).find(target)
      // On remplace notre <select> actuel
      $(target).replaceWith($input)
    })
  })
ps : je m'y connait pas en js