Bonjour à tous,

J'ai 2 questions pour mon projet en cours, sous Symfony 4.4 : D'abord, est ce que la conception de mes entités est correcte, et ensuite, à l'utilisation de ces entités, comment récupérer les valeurs de checkbox dans le controller.

J'ai un formulaire de réservation, auquel je veux ajouter des checkbox pour choisir des prestations supplémentaires.
J'ai une entité pour la réservation, une pour le référentiel des prestations, et une entité intermédiaire qui lie les 2 précédentes : ReservationPrestation.
L'entité Reservation est liée en OneToMany à l'entité ReservationPrestation, qui est liée en ManyToOne à l'entité Prestation.

Je n'ai pas fait une relation ManyToMany entre Reservation et Prestation, car j'ai besoin dans ReservationPrestation du champ quantité.
ça vous semble correct ?

Entité réservation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ReservationPrestation", mappedBy="idReservation", orphanRemoval=true)
     */
    private $reservationPrestations;
Entité prestation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ReservationPrestation", mappedBy="idPrestation", orphanRemoval=true)
     */
    private $reservationPrestations;
 
    /**
     * @ORM\Column(type="string", length=200)
     */
    private $nom;
 
    /**
     * @ORM\Column(type="decimal", precision=8, scale=2)
     */
    private $prix;
Entité reservationprestation :
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
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Reservation", inversedBy="reservationPrestations")
     * @ORM\JoinColumn(nullable=false)
     */
    private $idReservation;
 
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Prestation", inversedBy="reservationPrestations")
     * @ORM\JoinColumn(nullable=false)
     */
    private $idPrestation;
 
    /**
     * @ORM\Column(type="smallint")
     */
    private $quantite;
Ensuite, avec ces entités, je veux afficher, dans mon formulaire de réservation, des checkbox avec comme libellé les champs 'nom' de prestation.
L'entité réservation n'ayant que le champ reservationPrestations, j'ai mis le code suivant dans reservationType :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
->add('reservationPrestations', EntityType::class, array(
'label'        => 'Prestation', 
'placeholder'  => false,
'class'        => 'App:Prestation',
'choice_label' => 'nom',
'multiple'     => true,
'expanded'     => true,
'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('pr')
        ->orderBy('pr.nom', 'ASC');
    }
));
ça fonctionne, j'ai bien mes checkbox pour chaque ligne dans prestation, avec le nom comme libellé.

Mais ensuite, dans mon controller, quand le formulaire de réservation a été soumis et est valide, je veux récupérer les valeurs de mes checkbox, et savoir lesquelles sont cochées, pour ensuite alimenter l'entité ReservationPrestation et flusher ma création de réservation.

Pour mon formulaire, le code html généré est le suivant :
Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<h3>Prestations supplémentaires</h3>
<div id="App_reservation_reservationPrestations" style="width: 200px">
<div class="form-check">
<input type="checkbox" id="App_reservation_reservationPrestations_1" name="App_reservation[reservationPrestations][]" class="form-check-input" value="1" checked="checked" />
<label class="form-check-label" for="App_reservation_reservationPrestations_1">titi</label>
</div>
<div class="form-check">
<input type="checkbox" id="App_reservation_reservationPrestations_2" name="App_reservation[reservationPrestations][]" class="form-check-input" value="2" />
<label class="form-check-label" for="App_reservation_reservationPrestations_2">toto</label>
</div>
</div>

Dans mon controller, je souhaite récupérer mes checkbox des prestations. J'ai essayé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$liste_prestations = $form_reservation->get("App_reservation[reservationPrestations][]")->getData();
Et là, j'ai le message d'erreur :
Child "App_reservation[reservationPrestations][]" does not exist
Dans mon get, j'ai mis le nom du champ 'name' de mes checkbox. Ce n'est pas ce qu'il faut mettre ?
Et dans mon controller, comment identifier quelles checkbox sont "checked" ?

Merci d'avance pour votre aide !