src/Form/UserType.php line 20

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\User;
  4. use App\Validator\Constraints\IsEmailOrigin;
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\Validator\Constraints\Email;
  8. use Symfony\Component\Validator\Constraints\Regex;
  9. use Symfony\Component\Validator\Constraints\IsTrue;
  10. use Symfony\Component\Validator\Constraints\NotBlank;
  11. use Symfony\Component\OptionsResolver\OptionsResolver;
  12. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  13. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  15. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  16. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  17. class UserType extends AbstractType
  18. {
  19.     public function buildForm(FormBuilderInterface $builder, array $options): void
  20.     {
  21.         $valeurSexe $options['sexeDefaut'];
  22.         $value = ($valeurSexe) ? $valeurSexe 'f';
  23.        
  24.         if($options['email'])
  25.         {
  26.             $builder
  27.                 ->add('email'EmailType::class, [
  28.                     'label' => 'Email<span class=\'text-danger\'>*</span>',
  29.                     'label_html'=> true,
  30.                     'required' => false,
  31.                     'constraints' => [
  32.                         new Email([
  33.                             'message' => 'Veuillez entrer un email valide',
  34.                         ]),
  35.                         new NotBlank([
  36.                             'message' => 'Veuillez entrer un email',
  37.                         ]),
  38.                         new IsEmailOrigin()
  39.                     ],
  40.                     'attr' => [
  41.                         'placeholder' => 'Saisir une adresse email',
  42.                         'autocomplete' => 'email'
  43.                     ]
  44.                 ])
  45.             ;
  46.         }
  47.         if($options['password'])
  48.         {
  49.             $builder
  50.                 ->add('password'RepeatedType::class, [
  51.                     'type' => PasswordType::class,
  52.                     'invalid_message' => 'Les mots de passe doivent être identiques',
  53.                     'options' => [
  54.                         'attr' => [
  55.                             'class' => 'password-field'
  56.                         ]
  57.                     ],
  58.                     'required' => false,
  59.                     'first_options'  => [
  60.                         'label' => 'Mot de passe<span class=\'text-danger\'>*</span>',
  61.                         'label_html'=> true,
  62.                         'attr' => [
  63.                             'placeholder' => 'Saisir un mot de passe',
  64.                             'class' => 'password-field-first'
  65.                         ],
  66.                         'help' => '(En savoir plus)',
  67.                         'help_attr' => [
  68.                             'data-bs-toggle' => 'modal',
  69.                             'data-bs-target' => '#modalPassword',
  70.                             'class' => 'd-inline'
  71.                         ],
  72.                         'label_attr' => [
  73.                             'class' => 'd-inline mb-2'
  74.                         ]
  75.                     ],
  76.                     'second_options' => [
  77.                         'label' => 'Confirmation du mot de passe<span class=\'text-danger\'>*</span>',
  78.                         'label_html'=> true,
  79.                         'attr' => [
  80.                             'placeholder' => 'Confirmer le mot de passe',
  81.                             'class' => 'password-field-second'
  82.                         ],
  83.                         'label_attr' => [
  84.                             'class' => 'mb-2'
  85.                         ]
  86.                     ],
  87.                     'constraints' => [
  88.                         new NotBlank([
  89.                             'message' => 'Veuillez entrer un mot de passe',
  90.                         ]),
  91.                         new Regex([
  92.                             'pattern' =>  '/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_?.])([-+!*$@%_?.\w]{8,15})$/',
  93.                             'match'=> true,
  94.                             'message'=>'Votre mot de passe doit comporter au moins huit caractères, dont des lettres majuscules et minuscules, un chiffre et un symbole : - + ! * $ @ % _ ? .'
  95.                         ])
  96.                     ],
  97.                 ])
  98.             ;
  99.         }
  100.         if($options['nom'])
  101.         {
  102.             $builder
  103.                 ->add('nom'null, [
  104.                     'label' => 'Nom<span class=\'text-danger\'>*</span>',
  105.                     'label_html'=> true,
  106.                     'required' => false,
  107.                     
  108.                     'constraints' => [
  109.                         new NotBlank([
  110.                             'message' => 'Veuillez entrer un nom',
  111.                         ]),
  112.                     ],
  113.                     'attr' => [
  114.                         'placeholder' => 'Saisir un nom'
  115.                     ]
  116.                 ])
  117.             ;
  118.         }
  119.         if($options['prenom'])
  120.         {
  121.             $builder
  122.                 ->add('prenom'null, [
  123.                     'label' => 'Prénom<span class=\'text-danger\'>*</span>',
  124.                     'label_html'=> true,
  125.                     'required' => false,
  126.                     
  127.                     'constraints' => [
  128.                         new NotBlank([
  129.                             'message' => 'Veuillez entrer un prénom',
  130.                         ]),
  131.                     ],
  132.                     'attr' => [
  133.                         'placeholder' => 'Saisir un prénom'
  134.                     ]
  135.                 ])
  136.             ;
  137.         }
  138.         if($options['agree'])
  139.         {
  140.             $builder
  141.                 ->add('agreeTerms'CheckboxType::class, [
  142.                     'mapped' => false,
  143.                     'label' => 'J\'accepte les conditions générales d\'utilisation du site<span class=\'text-danger\'>*</span>',
  144.                     'label_html'=> true,
  145.                     'required' => false,
  146.                     'constraints' => [
  147.                         new IsTrue([
  148.                             'message' => 'Vous devez accepter les conditions générales d\'utilisation du site',
  149.                         ]),
  150.                     ],
  151.                     'help' => 'Lire les conditions générales d\'utilisation du site',
  152.                     'help_attr' => [
  153.                         'data-bs-toggle' => 'modal',
  154.                         'data-bs-target' => '#modalConditions',
  155.                         'class' => 'd-inline'
  156.                     ],
  157.                     'label_attr' => [
  158.                         'class' => 'd-inline mb-2'
  159.                     ]
  160.                 ])
  161.             ;
  162.         }
  163.         
  164.         if($options['roles'])
  165.         {
  166.             $builder
  167.                 // ->add('roles', ChoiceType::class, [
  168.                 //     'choices' => [
  169.                 //         //'Utilisateur' => 'ROLE_USER',
  170.                 //         'Administrateur' => 'ROLE_ADMIN'
  171.                 //     ],
  172.                 //     'label' => 'Rôles',
  173.                 //     'multiple' => true,
  174.                 //     'expanded' => true
  175.                 // ])
  176.                 ->add('role'ChoiceType::class, [
  177.                     'label' => 'Rôle<span class=\'text-danger\'>*</span>',
  178.                     'label_html'=> true,
  179.                     'placeholder' => 'Saisir un rôle',
  180.                     'choices' => [
  181.                         'User' => 'ROLE_USER',
  182.                         'Modérateur' => 'ROLE_MODO',
  183.                         'Administrateur' => 'ROLE_ADMIN',
  184.                     ],
  185.                     'required' => false,
  186.                     'constraints' => [
  187.                         new NotBlank([
  188.                             'message' => 'Veuillez saisir un rôle',
  189.                         ]),
  190.                     ],
  191.                 ])
  192.             ;
  193.         }
  194.         if($options['update'])
  195.         {
  196.             $builder
  197.                 ->add('oldPassword'PasswordType::class, [
  198.                     'required' => false,
  199.                     'mapped' => false,
  200.                     'label' => 'Mot de passe actuel<span class=\'text-danger\'>*</span>',
  201.                     'label_html'=> true,
  202.                     'attr' => [
  203.                         'placeholder' => 'Mot de passe actuel',
  204.                         'class' => 'password-field-alone'
  205.                     ]
  206.                 ])
  207.                 ->add('newPassword'PasswordType::class, [
  208.                     'required' => false,
  209.                     'mapped' => false,
  210.                     'label' => 'Nouveau mot de passe<span class=\'text-danger\'>*</span>',
  211.                     'label_html'=> true,
  212.                     'attr' => [
  213.                         'placeholder' => 'Nouveau mot de passe',
  214.                         'class' => 'password-field-first'
  215.                     ],
  216.                     'help' => '(En savoir plus)',
  217.                     'help_attr' => [
  218.                         'data-bs-toggle' => 'modal',
  219.                         'data-bs-target' => '#modalPassword',
  220.                         'class' => 'd-inline'
  221.                     ],
  222.                     'label_attr' => [
  223.                         'class' => 'd-inline'
  224.                     ]
  225.                 ])
  226.                 ->add('confirmPassword'PasswordType::class, [
  227.                     'required' => false,
  228.                     'mapped' => false,
  229.                     'label' => 'Confirmation du nouveau mot de passe<span class=\'text-danger\'>*</span>',
  230.                     'label_html'=> true,
  231.                     'attr' => [
  232.                         'placeholder' => 'Confirmation du nouveau mot de passe',
  233.                         'class' => 'password-field-second'
  234.                     ]
  235.                 ])
  236.             ;
  237.         }
  238.         if($options['emailReset'])
  239.         {
  240.             $builder
  241.                 ->add('emailReset'EmailType::class, [
  242.                     'label' => 'Email<span class=\'text-danger\'>*</span>',
  243.                     'label_html'=> true,
  244.                     'required' => false,
  245.                     'mapped' => false,
  246.                     'constraints' => [
  247.                         new Email([
  248.                             'message' => 'Veuillez entrer un email valide',
  249.                         ]),
  250.                         new NotBlank([
  251.                             'message' => 'Veuillez entrer un email',
  252.                         ]),
  253.                     ],
  254.                     'attr' => [
  255.                         'placeholder' => 'Saisir une adresse email'
  256.                     ]
  257.                 ])
  258.             ;
  259.         }
  260.         if($options['sexe'])
  261.         {
  262.             $builder
  263.                 ->add('sexe'ChoiceType::class, [
  264.                     'label' => 'Sexe<span class=\'text-danger\'>*</span>',
  265.                     'label_html'=> true,
  266.                     'required' => false,
  267.                     'expanded' => true,
  268.                     'placeholder' => false,
  269.                     'choices' => [
  270.                         'Homme' => 'm',
  271.                         'Femme' => 'f'
  272.                     ],
  273.                     'data' => $value,
  274.                     'placeholder' => false,
  275.                     'constraints' => [
  276.                         new NotBlank([
  277.                             'message' => 'Veuillez saisir un sexe'
  278.                         ])
  279.                     ]
  280.                 ])
  281.             ;
  282.         }   
  283.         
  284.         if($options['newsletter'])
  285.         {
  286.             $builder
  287.                 ->add('newsletter'CheckboxType::class, [
  288.                     'required' => false,
  289.                     'mapped' => false,
  290.                     'label' => 'S\'inscrire à la newsletter ?'
  291.                 ])
  292.             ;
  293.         }
  294.         
  295.         
  296.         
  297.     }
  298.     public function configureOptions(OptionsResolver $resolver): void
  299.     {
  300.         $resolver->setDefaults([
  301.             'data_class' => User::class,
  302.             'email' => false,
  303.             'password' => false,
  304.             'nom' => false,
  305.             'prenom' => false,
  306.             'agree' => false,
  307.             'roles' => false,
  308.             'update' => false,
  309.             'emailReset' => false,
  310.             'sexe' => false,
  311.             'sexeDefaut' => null,
  312.             'newsletter' => false
  313.         ]);
  314.     }
  315. }