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.
Partager