Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserType
0.00% covered (danger)
0.00%
0 / 48
0.00% covered (danger)
0.00%
0 / 2
12
0.00% covered (danger)
0.00%
0 / 1
 buildForm
0.00% covered (danger)
0.00%
0 / 44
0.00% covered (danger)
0.00%
0 / 1
6
 configureOptions
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Form;
4
5use App\Entity\User;
6use Symfony\Component\Form\AbstractType;
7use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
8use Symfony\Component\Form\Extension\Core\Type\EmailType;
9use Symfony\Component\Form\Extension\Core\Type\PasswordType;
10use Symfony\Component\Form\FormBuilderInterface;
11use Symfony\Component\Form\FormEvent;
12use Symfony\Component\Form\FormEvents;
13use Symfony\Component\OptionsResolver\OptionsResolver;
14use Symfony\Component\Validator\Constraints\NotBlank;
15use Symfony\Component\Validator\Constraints\Regex;
16
17class UserType extends AbstractType
18{
19    public function buildForm(FormBuilderInterface $builder, array $options): void
20    {
21        $builder
22            ->add('email', EmailType::class, [
23                "label" => "Email pour se logger"
24            ])
25            // on utilise l'event avant de mettre les données dans le formulaire
26            ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
27                // On récupère le form depuis l'event (pour travailler avec)
28                $builder = $event->getForm();
29                // On récupère le user mappé sur le form depuis l'event
30                /** @var User $user */
31                $user = $event->getData();
32
33                // On conditionne le champ "password"
34                // Si user existant, il a id non null
35                if ($user->getId() !== null) {
36                    // * mode Edition
37                    $builder->add('password', PasswordType::class, [
38                        // je ne veux pas que le formulaire mettes automatiquement à jour la valeur
39                        // je désactive la mise à jour automatique de mon objet par le formulaire
40                        // ? https://symfony.com/doc/5.4/reference/forms/types/form.html#mapped
41                        "mapped" => false,
42                        "label" => "le mot de passe",
43                        "attr" => [
44                            "placeholder" => "laisser vide pour ne pas modifier ..."
45                        ],
46                        // On déplace les contraintes de l'entité vers le form d'ajout
47                        'constraints' => [
48                            new Regex(
49                                "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/",
50                                "Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"
51                            ),
52                        ],
53                    ]);
54                } else {
55                    // * mode Création : New
56                    $builder->add('password', null, [
57                        // En cas d'erreur du type
58                        // Expected argument of type "string", "null" given at property path "password".
59                        // (notamment à l'edit en cas de passage d'une valeur existante à vide)
60                        'empty_data' => '',
61                        // On déplace les contraintes de l'entité vers le form d'ajout
62                        'constraints' => [
63                            new NotBlank(),
64                            new Regex(
65                                "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/",
66                                "Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"
67                            ),
68                        ],
69                    ]);
70                }
71            })
72            ->add('roles', ChoiceType::class, [
73                "multiple" => true,
74                "expanded" => true,
75                "choices" => [
76                    "ADMIN" => "ROLE_ADMIN",
77                    "MANAGER" => "ROLE_MANAGER",
78                    "USER" => "ROLE_USER",
79                    "RADIUM" => "ROLE_RADIUM"
80                ]
81            ])
82        ;
83    }
84
85    public function configureOptions(OptionsResolver $resolver): void
86    {
87        $resolver->setDefaults([
88            'data_class' => User::class,
89            "attr" => ["novalidate" => "novalidate"]
90        ]);
91    }
92}