IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

SF 4.4 - Relations one-many-one et valeurs de checkbox dans le controller


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut SF 4.4 - Relations one-many-one et valeurs de checkbox dans le controller
    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 !

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    bonjour,
    pour identifier un champ ( ->add('reservationPrestations' ) du formulaire de SF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $form->get('reservationPrestations')->getData()  ;
     
    //pour recuprer les id des $reservationPrestations à insérer dans la bd
    array_values( $form->get('reservationPrestations')->getData()  )

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Merci beaucoup Armel18 pour ces indications !
    En effet, je me suis replongé dans la doc de Symfony, et c'est la bonne manière de faire pour récupérer une valeur d'un formulaire.

    Sauf que dans mon cas, dans le add de mon reservationType de mon formulaire de réservation, j'utilise la classe Prestation, et non la classe ReservationPrestation.

    Pour pouvoir récupérer mes checkbox par $form->get('reservationPrestations')->getData(), je pense (peut être que je me trompe...) qu'il faut que j'utilise la classe ReservationPrestation, avec une jointure sur Prestation pour récupérer les noms.

    J'ai donc modifié mon add dans ReservationType :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ->add('reservationPrestations', EntityType::class, array(
    	'label'        => 'Prestation', 
    	'placeholder'  => false,
    	'class'        => 'App:ReservationPrestation',
    	'choice_label' => 'quantite',
    	'multiple'     => true,
    	'expanded'     => true,
    	'query_builder' => function (EntityRepository $er) {
    		return $er->createQueryBuilder('rp')
    			->join('App:Prestation', 'pr')
    			->orderBy('pr.nom', 'ASC');
    		}
    	));
    Sauf que la liste qui s'affiche pour ce champ dans mon formulaire de réservation est vide.

    J'ai ajouté manuellement en base une ligne dans ReservationPrestation, avec :
    idReservation = celui d'une réservation qui existe déjà
    idPrestation = 1 = id de la ligne ayant pour nom 'titi'
    quantite = 3

    Là, dans mon formulaire, le add m'affiche une checkbox avec le libellé '3', vu que j'ai mis 'choice_label' => 'quantite' dans le add du champ.

    Donc si je ne me trompe pas, j'ai 2 problèmes :
    - Comment faire dans un querybuilder un rightjoin pour avoir toutes mes lignes de Prestation, qui est mon référentiel de toutes les prestations possibles ? J'ai googlé comment faire un rightjoin sous Symfony, et je tombe sur des trucs vachement compliqués !
    - Comment afficher dans le formulaire de réservation le 'nom' de Prestation comme libellé, au lieu de la quantité qui vient de ReservationPrestation ? J'ai essayé 'choice_label' => 'pr.nom', et j'ai un gros écran rouge d'erreur !

    Bon, pour moi, c'est un sacré casse tête... Peut être que je prends le problème du mauvais côté. Si c'est plus simple de recréer des entités avec d'autres types de relation, je veux bien.

    Merci d'avance pour vos idées !

Discussions similaires

  1. Relation one-to-many qui ne se crée pas
    Par Julien G dans le forum Hibernate
    Réponses: 4
    Dernier message: 01/08/2007, 18h02
  2. Réponses: 4
    Dernier message: 18/06/2007, 08h30
  3. [Hibernate] Relation one to many
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/08/2006, 11h51
  4. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 14h47
  5. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo