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 :

Afficher le rôle utilisateur avant modification


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut Afficher le rôle utilisateur avant modification
    Bonjour,

    je suis en train de m'atteler au crud utilisateurs avec Symfony !

    Au départ , j'avais créé un fichier UserFormType.php dans mon dossier Form.
    Et dans mon controller, ... du classique pour afficher l'entité user en utilisant ce même fichier et je faisais mes modifications, ...
    Bref tout fonctionnait normalement , car je faisais tout normalement...

    Mais voilà, ( toujours à bidouiller, optimiser, ... ), le RegistrationFomrType.php , créé avec la commande make:registerpeut convenir aussi: si j'enlève le champ plainPassword et le champ agreeTerms, j'ai exactement le mêmes champs dans mon formulaire d'édition .

    voici la fonction dans mon controller ( méthode classique ):
    Code php : 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
    #[Route('/user/edit/{id}', name: 'app_user_edit')]
        public function edit(Request $request, User $user, UserRepository $userRepository, EntityManagerInterface $em)
        {
            $form = $this->createForm(UserFormType::class, $user);
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $em->persist($user);
                $em->flush();
     
                return $this->redirectToRoute('app_user_research');
            }
     
            return $this->render('user/edit.html.twig', [
                'form'  => $form->createView(),
                'user' => $user,
            ]);
        }

    Voici ce que je voudrais faire:
    Code php : 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
    #[Route('/user/edit/{id}', name: 'app_user_edit')]
        public function edit(Request $request, User $user, UserRepository $userRepository, EntityManagerInterface $em)
        {
            $form = $this->createForm(RegistrationFormType::class, $user);
            $form->remove('agreeTerms');
            $form->remove('plainPassword');
     
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $em->persist($user);
                $em->flush();
     
                return $this->redirectToRoute('app_user_research');
            }
     
            return $this->render('user/edit.html.twig', [
                'form'  => $form->createView(),
                'user' => $user,
            ]);
        }

    Et ça fonctionne presque !
    Le problème , c'est le champ role du builder ( RegistrationFormType ):
    Code php : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public function buildForm(FormBuilderInterface $builder, array $options): void
        {
            $builder
                ->add('email', EmailType::class, [
                    'attr' => ['placeholder' => 'Ex: <a href="mailto:jeanDUPONT@sfr.fr">jeanDUPONT@sfr.fr</a>']
                ])
                ->add('role', ChoiceType::class, [
                    'mapped' => false,
                    'label'   => 'Rôle',
                    'expanded' =>true,
                    'multiple' => true,
                    'constraints' => [
                        new NotBlank(['message' => 'Vous devez choisir un rôle'])
                    ],
                    'choices' => [
                        'Collaborateur'  => 'ROLE_COLL',
                        'Administrateur' => 'ROLE_ADMIN',
                    ]
                ])
                ->add('firstName', null, [
                    'label' => 'Prénom',
                    'attr' => ['placeholder' => 'Ex: Jean']
                ])
                ->add('lastName', null, [
                    'label' => 'Nom',
                    'attr' => ['placeholder' => 'Ex: DUPONT']
                ])
                ->add('agreeTerms', CheckboxType::class, [
                    'mapped' => false,
                    'constraints' => [
                        new IsTrue([
                            'message' => 'Vous devez être d\'accord avec les termes.',
                        ]),
                    ],
                ])
                ->add('plainPassword', RepeatedType::class, [
                    // instead of being set onto the object directly,
                    // this is read and encoded in the controller
                    'type' => PasswordType::class,
                    'invalid_message' => 'les deux mots de passe ne correspondent pas',
                    'mapped' => false,
                    'attr' => ['autocomplete' => 'new-password'],
                    'required' => true,
                    'first_options' => ['label' => 'Entrez un mot de passe'],
                    'second_options' => ['label' => 'Entrez une seconde fois le mot de passe'],
                    'constraints' => [
                        new NotBlank([
                            'message' => 'Please enter a password',
                        ]),
                        new Length([
                            'min' => 6,
                            'minMessage' => 'Your password should be at least {{ limit }} characters',
                            // max length allowed by Symfony for security reasons
                            'max' => 4096,
                        ]),
                    ],
                ])
            ;
        }

    Pour l'instant, il n'y a aucune case de cochée... même chose pour un autre type de choix.
    Normalement , il faudrait avoir le rôle actuel de l'utilisateur coché, pour une éventuelle modification.
    Je n'ai aucun problème pour les autres champs ( affichage et modification ).

    La question: comment fait-on ? je retourne dans le classique qui fonctionne ou bien il y a un moyen de faire avec le RegistrationForm
    Autre question: est-ce que c'est correct d'utiliser le RegistrationFormType pour les modifications ( vu que ce n'est pas prévu pour ça à la base...) ?

    Merci pour vos réponses,
    Laurent.

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Bon , j'avance un peu: dans mon builder.

    Déjà je supprime le 'mapped' => false
    Et le problème, finalement, vient des lignes du dessous:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'expanded' =>true,
    'multiple' => false,

    Pour l'instant, j'ai trouvé une seule combinaison qui permet un bon fonctionnement:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'expanded' =>true,
    'multiple' => true,
    Qui génère le champ (en mode modification ):

    Nom : role.jpg
Affichages : 256
Taille : 9,8 Ko

    Collaborateur étant le rôle actuel de l'utilisateur à modifier...Et je peux cocher, décocher, cocher les deux, ...
    Mais justement, je voudrais ne pas pouvoir cocher les deux !

    Même apparence lorsque j'utilise ce builder pour enregistrer un nouvel utilisateur ...(les cases sont décochées )


    Alors, après tâtonnnement:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'expanded' =>false,
    'multiple' => true,

    Me donne:

    Nom : role_single.jpg
Affichages : 253
Taille : 9,7 Ko

    Ce que je cherche à obtenir:

    Nom : role_bon.jpg
Affichages : 248
Taille : 10,1 Ko

    que ce soit pour un enregistrement ou une modification...

    Les codes

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'expanded' =>true,
    'multiple' => false,

    et
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'expanded' =>false,
    'multiple' => false,

    Me renvoient systématiquement une erreur: Warning: Array to string conversion
    J'avoue être un peu perdu pour l'instant...

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Alors , j'ai potassé la doc un moment et j'ai trouvé un moyen !

    Je suis obligé de mettre 'mapped' => false. pour obtenir le rendu que je souhaite. Associé à rein: pas d'option expanded, ni de multiple ...

    Ensuite, il faut que je puisse afficher les données de l'utilisateur à l'affichage du formulaire.
    j'ai pour cela l'option data

    Ensuite il va falloir récupérer le rôle de l'utilisateur pour le mettre dans la data. Ce que je peux faire. avec les Form Events

    En combinant les deux voici à quoi ressemble mon champ de formulaire dans le builder:
    Code php : 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
    ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
                        $entity = $event->getData();
                        $form1 = $event->getForm();
                        $form1->add('roles', ChoiceType::class, [
                            'mapped' => false,
                            // combine these two options to find the right display of choices
                            //'expanded' =>true,
                            //'multiple' => false,
                            'data' => $entity->getRoles() ? $entity->getRoles()[0] : '',
                            'label'   => 'Rôle',
                            'choices' => [
                                'Collaborateur'  => 'ROLE_COLL',
                                'Administrateur' => 'ROLE_ADMIN',
                            ],
                            'constraints' => [
                                new NotBlank(['message' => 'Vous devez choisir un rôle'])
                            ],
                        ]);
                    })

    Et ça marche le bon rôle utilisateur est affiché dans le formulaire avent une éventuelle modification !
    S'il y a d'autre façons de faire, mieux ou pas, je suis curieux...

    Laurent.

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

Discussions similaires

  1. Problème pour afficher une jtable après modification
    Par nadong94 dans le forum Composants
    Réponses: 1
    Dernier message: 21/04/2016, 12h12
  2. Problème pour afficher une image bmp
    Par homeostasie dans le forum MFC
    Réponses: 6
    Dernier message: 08/05/2005, 18h36
  3. [MFC]Problème pour afficher une image.
    Par Deedier dans le forum MFC
    Réponses: 4
    Dernier message: 25/03/2005, 16h13
  4. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  5. Réponses: 3
    Dernier message: 29/08/2003, 10h57

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