Bonjour,

J'ai un formulaire basé sur une entité Véhicule. Ce véhicule peut posséder des équipements de deux types différents. J'ai donc créer une entité Equipement qui possède un attribut qui détermine sont type :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
    private $id;
 
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $equipment;
 
    /**
     * @ORM\Column(type="string", length=25)
     * @Assert\Choice({"Porteur", "Cellule"})
     */
    private $belonging;
Dans le formulaire d'encodage d'un véhicule, je voudrais présenter les différents équipements afin que l'utilisateur puisse cocher ceux qui sont présents dans le véhicule. Cependant, je voudrais que la présentation de ces équipements soit scindée en deux, en fonction des deux types.

Donc, dans mon repository lié à l'équipement, j'ai créé les fonctions qui me permettent de lister les équipement d'un type :

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
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Equipment::class);
    }
 
    public function queryFindByBelonging($belonging) {
 
        $query = $this->createQueryBuilder('r')
                      ->andWhere('r.belonging = :belonging')
                      ->setParameter('belonging', $belonging);
 
        return $query;
    }
 
    public function findByBelonging(String $belonging)
    {
        return $this->createQueryBuilder('r')
                    ->getQuery()
                    ->getResult();
    }
Dans le builder de mon formulaire, je sais comment lié le type entityType à ce filtre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
...
        $belongingCarrier = 'Porteur';
...
 $builder->add('equipments', EntityType::class, array('class' => 'App\Entity\Equipment', 'multiple' => true, 'expanded' => true, 'choice_label' => 'equipment',
                  'query_builder' => function(EquipmentRepository $er) use ($belongingCarrier) {
                                        return $er->queryFindByBelonging($belongingCarrier);
                                     }            
                                                                )
                 )
...
Cependant, je ne sais pas faire comment faire coexister le second contrôle ramenant l'autre type d'équipement qui lui, donnerait ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
...
        $belongingCell = 'Cellule';
...
 $builder->add('equipments', EntityType::class, array('class' => 'App\Entity\Equipment', 'multiple' => true, 'expanded' => true, 'choice_label' => 'equipment',
                  'query_builder' => function(EquipmentRepository $er) use ($belongingCell) {
                                        return $er->queryFindByBelonging($belongingCell);
                                     }            
                                                                )
                 )
...
J'ai tenté de ne pas effectuer le filtre dans mon builder mais dans mon template, mais je tombe sur une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
         {% for equipment in formAdvert.vehicle.equipments if equipment.belonging == 'Porteur' %}                        
{{ form_row(equipment.equipment) }}        
{% endfor %}
Neither the property "belonging" nor one of the methods "belonging()", "getbelonging()"/"isbelonging()"/"hasbelonging()" or "__call()" exist and have public access in class "Symfony\Component\Form\FormView".
Auriez-vous une idée?

Merci d'avance pour votre aide.