Bonjour,
Je me casse la tête depuis plusieurs jours pour imbriquer des champs select entre eux.
J'ai trois niveaux.

  • Catégorie
  • Sous-catégorie
  • Source


Ce que je souhaite, c'est que lorsque l'utilisateur choisi une catégorie, le champ sous-catégorie soit alimenté par les sous-catégories correspondantes à la catégorie et quand la sous-catégorie est sélectionnée, le champ source soit alimenté par les sources relatives à la sous-catégorie choisie.

J'ai suivi deux méthodes différentes, celle sur le site de symfony (https://symfony.com/doc/current/form...ification.html) et celle de GrafikArt (https://www.grafikart.fr/tutoriels/champs-imbriques-888)

Et malheureusement je fais choux blanc pour lier le champ "sous-catégorie" et le champ "source", la liaison entre "catégorie" et "sous-catégorie" fonctionne sans souci.
L'erreur que je reçois avec le deuxième tuto me semble la plus facile à corriger alors je vous partage le code de celle-ci.

Erreur reçue : Argument 2 passed to App\Form\TicketType::addSource() must be an instance of App\Form\Subcategory or null, instance of App\Entity\Subcategory given

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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 
<?php
 
namespace App\Form;
 
use App\Entity\Source;
use App\Entity\Ticket;
use App\Entity\Category;
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\SubmitType;
 
class TicketType extends AbstractType {
    public function buildForm( FormBuilderInterface $builder, array $options ) {
        $builder
        ->add( 'title', null, [
            'label' => 'Sujet',
            'attr' => [
                'placeholder' => 'Sujet',
                'class' => 'form-control form-control-sm col-12'
            ]
        ] );
 
        $builder->add( 'category', EntityType::class, [
            'class'       => 'App\Entity\Category',
            'placeholder' => 'Sélectionnez votre catégorie',
            'mapped'      => false,
            'attr' => [
                'class' => 'form-control form-control-sm col-12'
            ],
            'required'    => false
        ] );
 
        $builder
        ->get( 'category' )->addEventListener(
            FormEvents::POST_SUBMIT,
 
            function ( FormEvent $event ) {
                $form = $event->getForm();
                $this->addSubcategory( $form->getParent(), $form->getData() );
            }
        );
 
        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
 
            function ( FormEvent $event ) {
                $data = $event->getData();
                $source = $data->getSource();
                $form = $event->getForm();
                if ( $source ) {
                    $subcategory = $source->getSubcategory();
                    $category = $subcategory->getCategory();
                    $this->addSubcategory( $form, $category );
                    $this->addSource( $form, $subcategory );
                    $form->get( 'category' )->setData( $category );
                    $form->get( 'subcategory' )->setData( $subcategory );
                } else {
                    $this->addSubcategory( $form, null );
                    $this->addSource( $form, null );
                }
            }
        );
 
        $builder -> add( 'description', null, [
            'label' => 'Description',
            'attr' => [
                'placeholder' => 'Sujet',
                'class' => 'form-control form-control-sm col-12',
                'rows' => 8
            ]
        ] );
 
        $builder
        ->add( 'submit', SubmitType::class, [
            'label' => 'Enregistrer',
            'attr' => [
                'class' => 'btn btn-info btn-sm col-8'
            ]
        ] );
 
    }
 
    private function addSubcategory( FormInterface $form, ?Category $category ) {
        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder(
            'subcategory',
            EntityType::class,
            null,
            [
                'class'           => 'App\Entity\Subcategory',
                'placeholder'     => $category ? 'Sélectionnez votre sous-catégorie' : 'Sélectionnez votre catégorie',
                'mapped'          => false,
                'required'        => false,
                'auto_initialize' => false,
                'attr' => [
                    'class' => 'form-control form-control-sm col-12'
                ],
                'choices'         => $category ? $category->getSubcategories() : []
            ]
        );
        $builder->addEventListener(
            FormEvents::POST_SUBMIT,
 
            function ( FormEvent $event ) {
                $form = $event->getForm();
                $this->addSource( $form->getParent(), $form->getData() );
            }
        );
        $form->add( $builder->getForm() );
    }
 
    private function addSource( FormInterface $form, ?Subcategory $subcategory ) {
        $form->add( 'source', EntityType::class, [
            'class'       => 'App\Entity\Source',
            'required'    => false,
            'placeholder' => $subcategory ? 'Sélectionnez votre Source' : 'Sélectionnez votre sous-catégorie',
            'attr' => [
                'class' => 'form-control form-control-sm col-12'
            ],
            'choices'     => $subcategory ? $subcategory->getSources() : []
        ] );
    }
 
    public function configureOptions( OptionsResolver $resolver ) {
        $resolver->setDefaults( [
            'data_class' => Ticket::class,
        ] );
    }
}

A priori l'erreur survient ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    private function addSource( FormInterface $form, ?Subcategory $subcategory ) {
        $form->add( 'source', EntityType::class, [
            'class'       => 'App\Entity\Source',
            'required'    => false,
            'placeholder' => $subcategory ? 'Sélectionnez votre Source' : 'Sélectionnez votre sous-catégorie',
            'attr' => [
                'class' => 'form-control form-control-sm col-12'
            ],
            'choices'     => $subcategory ? $subcategory->getSources() : []
        ] );
    }
Ca fait plusieurs jours que je bloque dessus, vous l'aurez sans doute compris je débute avec Symfony, du coup si quelqu'un peut m'aider à résoudre le souci ce serait vraiment ultra sympa
D'avance merci et bonne journée à tous.