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 :

ManyToMany bidirectionnelle dans un formulaire [3.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Par défaut ManyToMany bidirectionnelle dans un formulaire
    Bonjour,

    Je viens quérir votre aide concernant un point dont je suis persuadé de l'avoir déjà réussis mais qui cette fois refuse de fonctionner.

    Pour faire simple, je n'arrive pas à utiliser la moindre relation manyToMany bidirectionnelle dans un formulaire...

    Pour exemple, une classe UserUser et une classe UserGroup.
    Un utilisateur peut appartenir a différent groupe et bien évidement un groupe peu contenir plusieur user.

    Lorsque je génér mon formulaire UserGroup:
    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
     
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('name')
                ->add('description')
     
                ->add('userUsers', EntityType::class, array(
                    'class' => 'AcmeUserBundle:UserUser',
     
                    'query_builder' => function( \Doctrine\ORM\EntityRepository $er ) use ($options) {
                      return $er->createQueryBuilder('g')
                                ->where('g.deleted = false');
                    },
     
                    'choice_label' => 'username',
                    'multiple' => true,
                    'expanded' => true,
                    'required' => false
                  ))  
                ->add('submit', SubmitType::class)
            ;
        }
    Pas le moindre soucis, je peux ajouter les users, les supprimer. Ça fonctionne parfaitement.

    Mais si je tente la même chose dans le formulaire Useruser:
    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 buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('username')
                ->add('userGroups', EntityType::class, array(
                    'class' => 'AcmeUserBundle:UserGroup',
                    //'choices' => $options['userGroups'],
                    'query_builder' => function( \Doctrine\ORM\EntityRepository $er ) use ($options) {
                      return $er->createQueryBuilder('g')
                                ->where('g.deleted = false');
                    },
                    'choice_label' => 'name',
                    'multiple' => true,
                    'expanded' => true,
                    'required' => false
                  ))    
                ->add('submit', Type\SubmitType::class)
            ;
        }
    Et bien ici, le formulaire se valide mais ne semble pas propager la modification...
    J'ai tenté diverses modifications dans le controller pour vérifier et dans aucun cas, il ne sauvegarde mes changements.

    La logique voudrais que je me sois planté dans la déclaration des relations...
    UserGroup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        /**
         * @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\UserUser", inversedBy="userGroups", cascade={"persist"})
         * @ORM\JoinTable(name="join_usergroups_userusers")
         */
        private $userUsers;
    UserUser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /**
         * @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\UserGroup", mappedBy="userUsers", cascade={"persist"})
         */
        private $userGroups;
    A vous de me dire, mais celà me semble correct...

    Je suis persuadé que mon erreur est une bêtise, mais pas moyen de la résoudre...

    Merci à vous,
    Dyron

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    c est intéressant de voir le code controlleur si possible.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Par défaut
    Je ne l'avais pas précisé car il est brut. C'est le code généré par le CRUD.
    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
     
    /**
         * Displays a form to edit an existing UserUser entity.
         *
         * @Route("/{id}/edit", name="useruser_edit")
         * @Method({"GET", "POST"})
         */
        public function editAction(Request $request, UserUser $userUser)
        {
            $editForm = $this->createForm(UserUserType::class, $userUser);
            $editForm->handleRequest($request);
     
            if ($editForm->isSubmitted() && $editForm->isValid()) {
                $em = $this->getDoctrine()->getManager();
                // Ici j'ai deja tente de modifier le contenu de $userUser->getUserGroups() mais sans succes...
                $em->persist($userUser);
                $em->flush();
     
                return $this->redirectToRoute('useruser_show', array('id' => $userUser->getId()));
            }
     
            return $this->render('AcmeUserBundle:UserUser:edit.html.twig', array(
                'userUser' => $userUser,
                'edit_form' => $editForm->createView(),
            ));
        }

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    juste apres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $em->persist($userUser);
    rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($userUser);exit;
    et tu va voir que dans ton objet il manque l'association avec l'autre .
    Je propose aussi d'assigner au user une liste (array) à la main pour voir d'ou viens le probleme .

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2012
    Messages : 46
    Par défaut
    Alors lorsque je dump mon entité, la relation avec UserGroup est bien présente mais le array est vide.

    J'ai donc tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                $userGroup = $em->getRepository('AcmeUserBundle:UserGroup')->findOneBy(array('id'=>1,'deleted' => false)); //Il existe j ai verifie
                $userUser->addUserGroup($userGroup);
                $em->persist($userUser);
                var_dump($userGroup); exit();
    Le resultat est le même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      private 'userGroups' => 
        object(Doctrine\ORM\PersistentCollection)[990]
          private 'snapshot' => 
            array (size=0)
              empty
    Et pour la question a quoi ressemble les getter et setter:
    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
     
        /**
         * @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\UserGroup", mappedBy="userUsers", cascade={"persist"})
         */
        private $userGroups;
     
        /**
         * Constructor
         */
        public function __construct()
        {
            //...
            $this->userGroups = new \Doctrine\Common\Collections\ArrayCollection();
            //...
        }
     
        /**
         * Add userGroup
         *
         * @param \Acme\UserBundle\Entity\UserGroup $userGroup
         *
         * @return UserUser
         */
        public function addUserGroup(\Acme\UserBundle\Entity\UserGroup $userGroup)
        {
            $this->userGroups[] = $userGroup;
     
            return $this;
        }
     
        /**
         * Remove userGroup
         *
         * @param \Acme\UserBundle\Entity\UserGroup $userGroup
         */
        public function removeUserGroup(\Acme\UserBundle\Entity\UserGroup $userGroup)
        {
            $this->userGroups->removeElement($userGroup);
        }
    On y réfléchissant, j'ai testé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                $userGroup = $em->getRepository('MercureUserBundle:UserGroup')->findOneBy(array('id'=>1,'deleted' => false));
                $userGroup->addUserUser($userUser);
                $em->persist($userGroup);
                $em->persist($userUser);
    Ce qui à le mérite de fonctionner... Mais qui n'a pas de raison d'être. Je dois modifier l'élement UserGroup alors que le formulaire travaille sur UserUser...

    Bon dans le pire des cas ca me fait une solution de secours mais ce n'es tout de même pas logique...

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    J'ai remarqué un truc trés important .
    d'une part , tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $em->getRepository('MercureUserBundle:UserGroup');
    d'autre part, tu mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $em->getRepository('AcmeUserBundle:UserGroup');
    c'est normal de trouver parfois un array vide
    et dans le mappage targetEntity ..

    N'oublie pas de mettre et .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Response.BinaryWrite dans un formulaire
    Par faamugol dans le forum ASP
    Réponses: 4
    Dernier message: 12/05/2004, 12h45
  2. Forcer la saisie en MAJ dans un Formulaire
    Par lolos dans le forum IHM
    Réponses: 4
    Dernier message: 12/08/2003, 10h57
  3. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  4. Réponses: 2
    Dernier message: 12/02/2003, 15h26
  5. [CR][Access] intégrer un viewer dans un formulaire access
    Par nicolak dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 13/01/2003, 15h52

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