Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 4] EntityType récupérer user par rôle

Sujet résolu
    17 novembre 2018 à 0:33:18

    Bonjour,

    J'espère que vous allez bien,

    J'essaie de récupérer depuis un champs EntityType seulement les utilisateurs ayant un rôle spécifique.

    Je me suis tourner vers le query builder mais je ne comprends pas vraiment comment l'utiliser j'ai beaucoup de difficulté a l'emploi du query builder et je me demande si c'est la meilleur façon de faire pour filtrer seulement les utilisateurs ayant le rôle voulu

    Mon controlleur :

    <?php
    
    namespace App\Controller\Admin\Projet;
    
    use App\Entity\Client\Projet\Evenement;
    use App\Form\Admin\Projet\EvenementType;
    use App\Repository\Client\Projet\EvenementRepository;
    
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
     * @Route("/admin/projet/evenement")
     */
    class EvenementController extends AbstractController
    {
        /**
         * @Route("/modifier/{id}", name="admin_projet_evenement_edit", methods="GET|POST")
         */
        public function edit(Request $request, Evenement $evenement): Response
        {
            $form = $this->createForm(EvenementType::class, $evenement);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
    
                $this->addFlash(
                'notice',
                'Le projet a correctement été modifier.'
                );
    
                return $this->redirectToRoute('admin_projet_evenement_edit', ['id' => $evenement->getId()]);
            }
    
            return $this->render('admin/projet/evenement/edit.html.twig', [
                'evenement' => $evenement,
                'form' => $form->createView(),
            ]);
        }
    }
    



    Mon FormType :

    <?php
    
    namespace App\Form\Admin\Projet;
    
    use App\Entity\Intervenant\Profil\Profil;
    use App\Entity\Client\Projet\Evenement;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    
    class EvenementType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('nom')
                ->add('dateDepart', DateTimeType::class, array(
                    'widget' => 'single_text',
                ))
                ->add('dateFin', DateTimeType::class, array(
                    'widget' => 'single_text',
                ))
                ->add('lieu')
                ->add('gestionnaires', EntityType::class, array(
                    'class' => Profil::class,
                    'expanded'     => true,
                    'multiple'     => true,
                    'choice_label' => function(Profil $profil) {
                        return $profil->getFirstname() . ' ' . $profil->getLastname(); }
                ))
            ;
        }
    
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => Evenement::class,
            ]);
        }
    }
    


    Le champs "gestionnaires" concernent le champs auquel j'aimerais filtrer la récupération d'utilisateur, afin de n'afficher que les utilisateurs ayant le rôle souhaiter

    -
    Edité par TuxZero 17 novembre 2018 à 3:56:23

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2018 à 8:05:35

      Bonjour,

      Oui le query builder dans le champ gestionnaires est une bonne manière de faire.

      Plusieurs choses :

      soit tu veux toujours récupérer le même rôle et du met en dur dans la requête le rôle que tu veux filtrer

      soit tu passes en paramètre du contrôleur vers le form le rôle et tu récupères ce rôle pour la requête query builder

      Pour la requête c'est juste un where sur la propriété qui contient le rôle.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2018 à 13:19:31

        Bonjour,

        Merci pour ta réponse,

        Je veux récupérer toujours le même rôle, je l'ai donc fais en dur :

                    ->add('gestionnaires', EntityType::class, array(
                        'class' => Utilisateur::class,
                        'expanded'     => true,
                        'multiple'     => true,
                        'query_builder' => function (UtilisateurRepository $er) {
                            return $er->createQueryBuilder('u')
                            ->orderBy('u.roles', 'ASC')
                            ->andWhere('u.roles = :role')
                            ->setParameter('role', 'ROLE_GESTIONNAIRE');
                            },
                        'choice_label' => function(Utilisateur $utilisateur) {
                            return $utilisateur->getProfil()->getFirstname() . ' ' . $utilisateur->getProfil()->getLastname();
                             }
                    ))

        Cependant rien ne s'affiche et pourtant des utilisateurs ayant le rôle Gestionnaire existe bien

        -
        Edité par TuxZero 17 novembre 2018 à 14:14:55

        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2018 à 16:13:20

          Quel est le type du champ roles ?

          Tu te sers de FOSUser ?

          ==> car dans ce cas role est de type array donc ta requête n'est pas bonne : il faut remplacer le = par IN

          Mettre where suffit puisque tu n'as pas 2 clauses.

          A+

          • Partager sur Facebook
          • Partager sur Twitter
            17 novembre 2018 à 16:23:16

            Mon champs rôle est de type Array,

            Je n'utilise pas FOSUser,

            J'ai essayer de remplacer le = par IN, hors j'ai une erreur peu compréhensible a mon sens

            [Syntax Error] line 0, col 68: Error: Expected Doctrine\ORM\Query\Lexer::T_OPEN_PARENTHESIS, got ':role'
            
            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2018 à 16:27:26

              Ok donc c'est bien un array.

              Et tu as une erreur dans la syntaxe.

              Tu peux faire voir ton query builder ?

              A+

              -
              Edité par monkey3d 17 novembre 2018 à 16:27:53

              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2018 à 16:38:07

                                'query_builder' => function (UtilisateurRepository $er) {
                                    return $er->createQueryBuilder('u')
                                    ->orderBy('u.roles', 'ASC')
                                    ->andWhere('u.roles IN (:role)')
                                    ->setParameter('role', 'ROLE_GESTIONNAIRE');
                                    },

                Il manquer simplement des parenthèse après IN, là je me retrouve encore avec le soucis de taleur, aucune erreur, mais cela ne liste pas non plus les utilisateurs ayant le rôle gestionnaire, je ne vois aucun utilisateur

                -
                Edité par TuxZero 17 novembre 2018 à 17:32:36

                • Partager sur Facebook
                • Partager sur Twitter
                  17 novembre 2018 à 17:56:07

                  Rappel : remplace le andWhere par where puisque tu n'as qu'une seule condition.

                  Je pense que c'est le set qui ne va pas car ton paramètre devrait être un array.

                  Tu peux tester :

                  ->setParameter('role', array('ROLE_GESTIONNAIRE'));

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 novembre 2018 à 18:08:14

                    Oui désoler je l'avais fait tout à leur (pour le where) mais en remettant mon code après des tests j'ai du trop revenir en arrière,

                    ça ne change rien quand j'ajoute array('') malheuresement, toujours pas d'érreur et toujours pas d'utilisateur afficher

                                    'query_builder' => function (UtilisateurRepository $er) {
                                        return $er->createQueryBuilder('u')
                                        ->orderBy('u.roles', 'ASC')
                                        ->where('u.roles IN (:role)')
                                        ->setParameter('role', array('ROLE_GESTIONNAIRE'));
                                        },



                    -
                    Edité par TuxZero 17 novembre 2018 à 18:19:13

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 novembre 2018 à 18:40:05

                      Tu as quoi comme choice_label ?

                      A+

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 novembre 2018 à 19:25:08

                                    ->add('gestionnaires', EntityType::class, array(
                                        'class' => Utilisateur::class,
                                        'expanded'     => true,
                                        'multiple'     => true,
                                        'query_builder' => function (UtilisateurRepository $er) {
                                            return $er->createQueryBuilder('u')
                                            ->orderBy('u.roles', 'ASC')
                                            ->where('u.roles IN (:role)')
                                            ->setParameter('role', array('ROLE_GESTIONNAIRE'));
                                            },
                                        'choice_label' => function(Utilisateur $utilisateur) {
                                            return $utilisateur->getProfil()->getFirstname() . ' ' . $utilisateur->getProfil()->getLastname();
                                             }
                                    ))

                         Si j'enlève le query_builder cela affiche bien tout les utilisateurs, hors si je le rajoute plus rien, aucune erreur, mais aucun utilisateur afficher.

                        Faut-il ajouter quelque chose en plus dans le Repository ?

                        -
                        Edité par TuxZero 18 novembre 2018 à 1:44:55

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 novembre 2018 à 8:48:40

                          Tu peux choisir un choice_label avec une propriété simple de type string si possible qui est dans l'entité Utilisateur et voir ce que cela donne ?

                          A+

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 novembre 2018 à 12:14:08

                            Bonjour,

                            Voilà ma requete pour obtenir les utilisateurs qui ont le role par exemple ROLE_GESTIONNAIRE, la requete prend en variable $role instantiée avec cette chaîne.

                            Les rôles sont archivés dans l'entité user sous forme d'array.

                            La requête renvoie les utulisateurs qui ont ce rôle, ce qui est différend des utilisateurs autorisés. EN effet, si ROLE_ADMIN est le hiérarchique de ROLE_GESTIONNAIRE alors un user qui a dans son entité un array contenant ROLE_ADMIN est autorisé à ROLE_GESTIONNAIRE mais ne sera pas dans la requête présentée ci-dessous.

                                public function findByRole($role)//par exemple $role ="ROLE_GESTIONNAIRE"
                                {
                                    $qb = $this->_em->createQueryBuilder();
                                    $qb->select('u')
                                    ->from($this->_entityName, 'u')
                                    ->where('u.roles LIKE :roles')
                                    ->andwhere('u.enabled = :enabled')
                                    ->setParameter('roles', '%"'.$role.'"%')
                                    ->setParameter('enabled', true)
                                    ;
                                    return $qb->getQuery()->getResult();
                                }

                            Pour le fun, la requête ne renvoie que les users dont le compte est activé (enabled).

                            A toi

                            -
                            Edité par CarréDas1 18 novembre 2018 à 12:16:16

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 novembre 2018 à 16:50:30

                              Bonjour,

                              Merci à vous deux d'avoir pris le temps de m'aider, en fait il fallait tout simplement que je procèdent de la manière que Carrédas a exposer en utilisant LIKE a la place de IN

                                              'query_builder' => function (UtilisateurRepository $er) {
                                                  return $er->createQueryBuilder('u')
                                                  ->orderBy('u.roles', 'ASC')
                                                  ->where('u.roles LIKE :role')
                                                  ->setParameter('role', '%"'.'ROLE_GESTIONNAIRE'.'"%');
                                                  },

                              Là cela fonctionne parfaitement, je vous remercie ça me sauve j'ai perdu énormément de temps sur ça et j'en aurais perdu beaucoup plus sans votre aide.


                              Merci.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              [Symfony 4] EntityType récupérer user par rôle

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown