Salut à tous,

J'ai un souci au niveau de la construction d'un formulaire sur une relation ManyToMany avec attributs.

J'explique mon problème :
J'ai un objet Opportunite et un objet Technologie. Une Opportunite peut avoir plusieurs technologies et une technologie peut être affectée à plusieurs opportunités. J'ai donc une relation ManyToMany avec attributs (car j'ai un attribut date) comme ceci :
Opportunite OneToMany TechnologieOpportunite ManyToOne Technologie.
Une Technologie possède un type, j'ai donc ma liste de technologie qui apparaît en fonction du TypeTechnologie sélectionné.

J'ai ce type de formulaire :


Je construis mon formulaire comme ceci :
OpportuniteType
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$builder->add('technologieopportunites', 'collection', array('type' => new TechnologieOpportuniteType(), 'label'=> ' ', 'allow_add' => true, 'prototype' => true));
TechnologieOpportuniteType
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
public function buildForm(FormBuilder $builder, array $options) {
        $builder
            ->add('typetechnologie', 'entity', array('property_path' => false, 'label' => 'Type :', 'required' => true, 'property' => 'libelle', 'empty_value' => 'Choississez...', 'empty_data' => null, 'class' => "IcmeMainBundle:TypeTechnologie", 'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('tt')
                        ->orderBy('tt.libelle', 'ASC');
            }));
            //->add('technologie', 'collection', array('type' => new TechnologieType(), 'label'=> ' '));
            $factory = $builder->getFormFactory();
            $rafraichirTechnologie = function ($form, $type) use ($factory) {
            $form->add($factory->createNamed('entity', 'technologie', null, array(
                'class'         => 'IcmeMainBundle:Technologie',
                'empty_value'   => 'Choisissez...',
                'label'         => 'Libellé :',
                'multiple'      => true,
                'expanded'      => true,
                'query_builder' => function (EntityRepository $repository) use ($type) {
                                       $qb = $repository->createQueryBuilder('t')
                                                        ->innerJoin('t.typetechnologie', 'typetechnologie');
 
                                       if($type instanceof TypeTechnologie) {
                                           $qb = $qb->where('t.typetechnologie = :typetechnologie')
                                                    ->setParameter('typetechnologie', $type);
                                       } elseif(is_numeric($type)) {
                                           $qb = $qb->where('typetechnologie.id = :idTypetechnologie')
                                                    ->setParameter('idTypetechnologie', $type);
                                       } else {
                                           $qb = $qb->where('typetechnologie.id = 1');
                                       }
 
                                       return $qb;
                                   }
                 )));
            };
 
            $builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($rafraichirTechnologie) {
                $form = $event->getForm();
                $data = $event->getData();
 
                if($data === null)
                    $rafraichirTechnologie($form, null); //As of beta2, when a form is created setData(null) is called first
 
                if($data instanceof TypeTechnologie) 
                    $rafraichirTechnologie($form, $data->getTypetechnologie());
           });
 
            $builder->addEventListener(FormEvents::PRE_BIND, function (DataEvent $event) use ($rafraichirTechnologie) {
                $form = $event->getForm();
                $data = $event->getData();
 
                if(array_key_exists('typetechnologie', $data)) {
                    $rafraichirTechnologie($form, $data['typetechnologie']);
                }
            });
 
    }
Sauf qu'à l'ajout d'une technologie, j'ai cette erreur :
Catchable Fatal Error: Argument 1 passed to Icme\AffaireBundle\Entity\TechnologieOpportunite::setTechnologie() must be an instance of Icme\MainBundle\Entity\Technologie, instance of Doctrine\Common\Collections\ArrayCollection given, called in C:\wamp\www\icme\vendor\symfony\src\Symfony\Component\Form\Util\PropertyPath.php on line 347 and defined in C:\wamp\www\icme\src\Icme\AffaireBundle\Entity\TechnologieOpportunite.php line 112

Je comprends tout à fait cette erreur, puisque multiple true lui renvoie un tableau de technologie alors que mon setTechnologie attend une technologie. Je ne sais pas comment construire mon formulaire en mettant un multiple à true.

Merci beaucoup à ceux qui pourraient me mettre sur la bonne voie

Cordialement.