Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Formulaire rôles utilisateur

Sujet résolu
    2 février 2023 à 12:02:43

    Bonjour,

    J'aimerai si l'utilisateur est un admin afficher les rôles dans le formulaire sous formes de checkbox avec au moins une case à cocher obligatoirement. Si pas admin on affiche pas les rôles et on set rôles à ROLE_USER. Pour cela :

    UserType.php

    if($this->security->getUser()){
                $userAdmin = $this->security->getUser()->getRoles();
                if (in_array('ROLE_ADMIN', $userAdmin)) {
                    $builder
                        ->add('roles', ChoiceType::class, [
                            'label' => 'Rôles',
                            'expanded' => true,
                            'multiple' => true,
                            'required' => true,
                            'choices' => [
                                'Utilisateur' => 'ROLE_USER',
                                'Contributeur' => 'ROLE_CONTRIBUTOR',
                                'Admin' => 'ROLE_ADMIN'
                            ]
                        ]);
                }
            }

    Problème rencontrés :

    - Le required, n'est pas pris en compte, je peux ne rien cocher

    - Problème avec le rôle user :

            - Si je coche que le rôle user ça ne marche pas alors que pour les autres rôles ça marche.

            - Si je coche plusieurs rôles ça marche même avec user

            - Si je coche plusieurs rôles dont user et que j'edit puis décoche les rôles différents de user ça marche

    - Si rôle pas admin, j'arrive pas à set automatiquement le rôle user, je peux le faire facilement dans le controller mais il me semblait qu'on pouvait le faire simplement dans le resolver de la manière suivante :

        public function configureOptions(OptionsResolver $resolver): void
        {
            $resolver->setDefaults([
                'data_class' => User::class,
                'params' => null,
                'roles' => 'ROLE_USER'
            ]);
        }


    Merci d'avance pour votre aide,

    Tomi

    -
    Edité par Mr_Craw 2 février 2023 à 12:03:35

    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2023 à 11:39:32

      Salut

      Douma-Tomi a écrit:

      - Le required, n'est pas pris en compte, je peux ne rien cocher

      Il te faudra utiliser la validation pour déterminer que ce champ a une valeur. Probablement la contrainte Count avec un minimum de 1.

      Pour ces histoires de rôles qui marchent ou pas, tu pourrais expliciter un peu, notamment qu'est-ce qui qui te fait dire que ça ne marche pas et à quoi tu t'attends ?

      • Partager sur Facebook
      • Partager sur Twitter
        4 février 2023 à 12:11:50

        Bonjour et merci de t'as réponse, 

        C'est en vérifiant dans ma base de donnée que je vois que ça ne marche pas.

        • Partager sur Facebook
        • Partager sur Twitter
          4 février 2023 à 12:15:47

          Peut-on voir la définition de la propriété roles ainsi que les getter/setter, et aussi le code complet de l'action ?

          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2023 à 12:23:16

            Oui bien sûr,

            User.php

            #[ORM\Column()]
                private $roles = [];
            
                public function getRoles(): array
                {
                    $roles = $this->roles;
                    $roles[] = 'ROLE_USER';
            
                    return array_unique($roles);
                }
            
                public function setRoles(array $roles): self
                {
                    $this->roles = $roles;
                    return $this;
                }

            UserType

                    if($this->security->getUser()){
                        $userAdmin = $this->security->getUser()->getRoles();
                        if (in_array('ROLE_ADMIN', $userAdmin)) {
                            $builder
                                ->add('roles', ChoiceType::class, [
                                    'label' => 'Rôles',
                                    'expanded' => true,
                                    'multiple' => true,
                                    'required' => true,
                                    'choices' => [
                                        'Utilisateur' => 'ROLE_USER',
                                        'Contributeur' => 'ROLE_CONTRIBUTOR',
                                        'Admin' => 'ROLE_ADMIN'
                                    ]
                                ]);
                        }
                    }
            
                public function configureOptions(OptionsResolver $resolver): void
                {
                    $resolver->setDefaults([
                        'data_class' => User::class,
                        'params' => null,
                        'roles' => 'ROLE_USER'
                    ]);
                }


            Rien de particulier fait dans le controller pour les rôles

            • Partager sur Facebook
            • Partager sur Twitter
              4 février 2023 à 12:26:01

              Mais c'est pourtant ce code que je demandais, parce que celui du formulaire était déjà fourni…

              Edit

              Attention avec le fait de n'avoir que setRoles(), a mon avis il faudrait prévoir deux méthodes addRole() et removeRole().

              -
              Edité par Ymox 4 février 2023 à 12:27:26

              • Partager sur Facebook
              • Partager sur Twitter
                4 février 2023 à 13:03:58

                Je veux dire dans le controller je fais rien de particulier,

                UserController.php

                 public function registration(Request $request, EntityManagerInterface $manager): Response
                    {
                        $user = new User();
                
                        $form = $this->createForm(RegistrationType::class, $user);
                
                        $form->handleRequest($request);
                        if ($form->isSubmitted() && $form->isValid()) {
                            $user = $form->getData();
                
                            $this->addFlash(
                                'success',
                                'Votre compte a bien été créé.'
                            );
                
                            $manager->persist($user);
                            $manager->flush();
                
                            return $this->redirectToRoute('security.login');
                        }
                
                        return $this->render('pages/security/registration.html.twig', [
                            'form' => $form->createView()
                        ]);
                    }
                


                Je pourrais ajouter   $user->setRoles(['ROLE_USER']); mais il me semblait que la ligne 'roles' => 'ROLE_USER' dans le resolver faisait la même chose, j'ai peut être mal compris?

                Et pourquoi ajouter un addRole()? Le make user de symfony ne le créer pas par défaut

                -
                Edité par Mr_Craw 4 février 2023 à 13:04:33

                • Partager sur Facebook
                • Partager sur Twitter
                  4 février 2023 à 13:13:12

                  Le fait que par défaut tu ajoutes ROLE_USER dans la méthode getRoles() fait que tu n'as normalement aucun besoin de mettre cette valeur par défaut dans le formulaire à quelque endroit que ce soit, cela fait office de valeur par défaut.

                  Le fait que le générateur de code de Symfony ne créé pas de méthode addRole() ou removeRole() vient probablement de ce que la manière de le gérer reste avec des tableaux simples. Si lors de la génération on spécifie qu'on veut utiliser la gestion des rôles (il me semble que la commande le propose à une étape), alors il les créera parce que les rôles seront gérés par une entité et avec une collection. Actuellement, c'en est une très simplifiée.

                  Dans tous les cas, cela ne coûte rien de les mettre pour voir ce que ça donne.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 février 2023 à 13:36:48

                    D'accord merci pour ces informations je vais checker ça
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Symfony] Formulaire rôles utilisateur

                    × 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