src/Form/UserRegisterType.php line 161

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Entity;
  4. use App\Entity\Profile;
  5. use App\Entity\User;
  6. use App\Repository\EntityRepository;
  7. use App\Repository\ProfileRepository;
  8. use Symfony\Component\Form\AbstractType;
  9. use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
  10. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  11. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  12. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  13. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  14. use Symfony\Component\Form\Extension\Core\Type\TelType;
  15. use Symfony\Component\Form\Extension\Core\Type\TextType;
  16. use Symfony\Component\Form\FormBuilderInterface;
  17. use Symfony\Component\Form\FormEvent;
  18. use Symfony\Component\Form\FormEvents;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\OptionsResolver\OptionsResolver;
  21. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  22. use Karser\Recaptcha3Bundle\Form\Recaptcha3Type;
  23. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
  24. use Symfony\Component\Validator\Constraints\NotBlank;
  25. class UserRegisterType extends AbstractType
  26. {
  27.     public function __construct(private readonly RequestStack $request)
  28.     {
  29.     }
  30.     public function buildForm(FormBuilderInterface $builder, array $options)
  31.     {
  32.         $route $this->request->getCurrentRequest()->attributes->get('_route');
  33.         $builder->setAction("#");
  34.         $builder->setMethod("post");
  35.         $builder->addEventListener(FormEvents::PRE_SET_DATA,
  36.             function(FormEvent $event) use ($builder) {
  37.                 $user $event->getData();
  38.                 // Create
  39.                 if (!$user || null === $user->getId()) {
  40.                     $event->getForm()
  41.                         ->add('lastName'TextType::class, [
  42.                             'label' => 'Nom',
  43.                             'required' => true,
  44.                             'constraints' => [new NotBlank(null,'Le champ "Nom" est obligatoire.')],
  45.                         ])
  46.                         ->add('name'TextType::class, [
  47.                             'label' => 'Prénom',
  48.                             'required' => true,
  49.                             'constraints' => [new NotBlank(null,'Le champ "Prénom" est obligatoire.')],
  50.                         ])
  51.                         ->add('email' EmailType::class, [
  52.                             'label' => 'Email',
  53.                             'required' => true,
  54.                             'constraints' => [new NotBlank(null,'Le champ "Email" est obligatoire.')],
  55.                         ])
  56.                         ->add('phone'TelType::class, [
  57.                             'label' => 'Téléphone',
  58.                             'required' => true,
  59.                             'constraints' => [new NotBlank(null,'Le champ "Téléphone" est obligatoire.')],
  60.                         ])
  61.                         ->add('password'RepeatedType::class, [
  62.                             'type' => PasswordType::class,
  63.                             'invalid_message' => 'Mot de passe non identique',
  64.                             'options' => [
  65.                                 'attr' => [
  66.                                     'class' => 'form-control'
  67.                                 ]
  68.                             ],
  69.                             'required' => true,
  70.                             'first_options' => [
  71.                                 'label' => 'Mot de passe'
  72.                             ],
  73.                             'second_options' => [
  74.                                 'label' => 'Confirmer le mot de passe'
  75.                             ]
  76.                             ,
  77.                             'constraints' => [new NotBlank(null,'Le champ "Mot de passe" est obligatoire.')],
  78.                         ])
  79.                         ->add('isAccept'CheckboxType::class, [
  80.                             'required' => true,
  81.                             'attr' => [
  82.                                 'class' => 'form-check-label'
  83.                             ],
  84.                             'label_attr' => [
  85.                                 'style' => 'display: none',
  86.                             ]
  87.                         ])
  88.                     ;
  89.                     // Edit
  90.                 } else {
  91.                     $event->getForm()
  92.                         ->add('email' EmailType::class, [
  93.                             'label' => 'Email',
  94.                             'required' => false
  95.                         ])
  96.                         ->add('lastName'TextType::class, [
  97.                             'label' => 'Nom',
  98.                             'required' => false
  99.                         ])
  100.                         ->add('name'TextType::class, [
  101.                             'label' => 'Prénom',
  102.                             'required' => false
  103.                         ])
  104.                         ->add('phone'TelType::class, [
  105.                             'label' => 'Téléphone',
  106.                             'required' => false
  107.                         ])
  108.                         ->add('birthDate'BirthdayType::class, [
  109.                             'label' => 'Date de naissance *',
  110.                             'required' => false,
  111.                             'widget' => 'single_text'
  112.                         ])
  113.                         ->add('address'TextType::class, [
  114.                             'label' => 'Adresse',
  115.                             'required' => false
  116.                         ])
  117.                         ->add('city'TextType::class, [
  118.                             'label' => 'Ville',
  119.                             'required' => false
  120.                         ])
  121.                         ->add('postalCode'TextType::class, [
  122.                             'label' => 'Code postal',
  123.                             'required' => true,
  124.                             'constraints' => [new NotBlank(null,'Le champ "Code postal" est obligatoire.')],
  125.                         ])
  126.                     ;
  127.                 }
  128.             }
  129.         );
  130.         $builder
  131.             ->add('captcha'Recaptcha3Type::class, [
  132.                 'constraints' => new Recaptcha3(),
  133.                 'action_name' => 'homepage',
  134.             ])
  135.         ;
  136.         if ($route == 'user_register_no_entity') {
  137.             $builder
  138.                 ->add('profiles'EntityType::class, [
  139.                     'class' => Profile::class,
  140.                     'query_builder' => fn(ProfileRepository $repository) =>
  141.                         $repository->createQueryBuilder('p')->orderBy('p.name''ASC'),
  142.                     'choice_label' => 'name',
  143.                     'label' => 'Profils',
  144.                     'multiple' => true,
  145.                     'required' => false,
  146.                     'attr' => [
  147.                         'data-plugin' => "select2",
  148.                         'style' => 'width: 100%'
  149.                     ]
  150.                 ])
  151.                 ->add('entities'EntityType::class, [
  152.                     'class' => Entity::class,
  153.                     'query_builder' => fn(EntityRepository $repository) =>
  154.                         $repository->createQueryBuilder('e')->orderBy('e.name''ASC'),
  155.                     'choice_label' => 'name',
  156.                     'label' => 'Entité',
  157.                     'multiple' => true,
  158.                     'attr' => [
  159.                         'data-plugin' => "select2",
  160.                         'style' => 'width: 100%'
  161.                     ]
  162.                 ])
  163.                 ->add('birthDate'BirthdayType::class, [
  164.                     'label' => "Date de naissance *",
  165.                     'widget' => 'single_text'
  166.                 ])
  167.                 ->add('postalCode'TextType::class, [
  168.                     'label' => 'Code postal',
  169.                     'required' => true,
  170.                     'constraints' => [new NotBlank(null,'Le champ "Code postal" est obligatoire.')],
  171.                 ])
  172.             ;
  173.         }
  174.     }
  175.     public function configureOptions(OptionsResolver $resolver)
  176.     {
  177.         $resolver->setDefaults([
  178.             'data_class'      => User::class,
  179.             // enable/disable CSRF protection for this form
  180.             //'csrf_protection' => false,
  181.             // the name of the hidden HTML field that stores the token
  182.             'csrf_field_name' => '_token',
  183.             // an arbitrary string used to generate the value of the token
  184.             // using a different string for each form improves its security
  185.             'csrf_token_id'   => 'task_item',
  186.         ]);
  187.     }
  188. }