src/Form/RegistrationFormType.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Enum\RoleEnum;
  4. use App\Entity\RoleManagement;
  5. use App\Entity\User;
  6. use App\Form\Type\ImageFieldType;
  7. use App\Service\Settings\RoleService;
  8. use Doctrine\ORM\EntityRepository;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use Symfony\Component\Form\AbstractType;
  13. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  14. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  15. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  16. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  17. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  18. use Symfony\Component\Form\Extension\Core\Type\TelType;
  19. use Symfony\Component\Form\Extension\Core\Type\TextType;
  20. use Symfony\Component\Form\FormBuilderInterface;
  21. use Symfony\Component\OptionsResolver\OptionsResolver;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Component\Validator\Constraints\IsTrue;
  24. use Symfony\Component\Validator\Constraints\Regex;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. class RegistrationFormType extends AbstractType
  27. {
  28.     public function __construct(
  29.         private TranslatorInterface $translator,
  30.         private Security $security,
  31.         private ManagerRegistry $registry,
  32.         private RoleService $roleService,
  33.         private ParameterBagInterface $parameterBag
  34.     ) {}
  35.     public function buildForm(FormBuilderInterface $builder, array $options): void
  36.     {
  37.         $selectedRole $this->getSelectedRole($options['roleId']);
  38.         /** @var User $user */
  39.         $user $this->security->getUser();
  40.         $builder
  41.             ->add('firstName'TextType::class, [
  42.                 'required' => false,
  43.                 'label' => 'register.firstName'
  44.             ])
  45.             ->add('lastName'TextType::class, [
  46.                 'required' => false,
  47.                 'label' => 'register.lastName'
  48.             ])
  49.             ->add('email'EmailType::class, [
  50.                 'label' => 'login.email'
  51.             ])
  52.             ->add('phoneCountryCode'HiddenType::class, [
  53.                 'required' => false,
  54.                 'attr' => [
  55.                     'class' => 'codeInput'
  56.                 ]
  57.             ])
  58.             ->add('phoneNo'TelType::class, [
  59.                 'required' => false,
  60.                 'label' => 'register.phoneNo',
  61.                 'attr' => [
  62.                     'class' => 'phoneInput'
  63.                 ]
  64.             ])
  65.             ->add('jobPosition'TextType::class, [
  66.                 'required' => false,
  67.                 'label' => 'register.position'
  68.             ])
  69.             ->add('plainPassword'RepeatedType::class, [
  70.                 'type' => PasswordType::class,
  71.                 'invalid_message' => $this->translator->trans('register.repeatPasswordMessage', [], 'security'),
  72.                 'required' => true,
  73.                 'mapped' => false,
  74.                 'first_options'  => [
  75.                     'label' => 'login.password',
  76.                     'constraints' => [
  77.                         new Regex([
  78.                             'message' => $this->translator->trans('register.passwordRegex', [], 'security'),
  79.                             'htmlPattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/',
  80.                             'pattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/'
  81.                         ])
  82.                     ],
  83.                 ],
  84.                 'second_options' => [
  85.                     'label' => 'register.repeatPasswordLabel'
  86.                 ],
  87.             ])
  88.             ->add('privacyPolicy'CheckboxType::class, [
  89.                 'required' => false,
  90.                 'constraints' => [
  91.                     new IsTrue([
  92.                         'message' => $this->translator->trans('register.required', [], 'security'),
  93.                     ])
  94.                 ]
  95.             ])
  96.             ->add('termsConditions'CheckboxType::class, [
  97.                 'required' => false,
  98.                 'constraints' => [
  99.                     new IsTrue([
  100.                         'message' => $this->translator->trans('register.required', [], 'security'),
  101.                     ])
  102.                 ]
  103.             ])
  104.             ->add('newsletterSubscription'CheckboxType::class, [
  105.                 'label' => 'register.newsletterLabel',
  106.                 'required' => false,
  107.             ])
  108.         ;
  109.         if ($options['edit'] === true) {
  110.             if ($this->canEditImage($options['userId'])) {
  111.                 $builder
  112.                     ->add('profileImage'ImageFieldType::class, [
  113.                         'required' => false,
  114.                         'path' => $this->parameterBag->get('users_directory')
  115.                     ]);
  116.             }
  117.             if ($this->roleService->isSuperAdmin() || $this->roleService->isRegularAdmin() && $user->getId() !== $options['userId']) {
  118.                 $builder
  119.                     ->add('isActive'CheckboxType::class, [
  120.                         'required' => false
  121.                     ])
  122.                     ->add('isVerified'CheckboxType::class, [
  123.                         'required' => false
  124.                     ])
  125.                 ;
  126.             }
  127.             if ($this->roleService->isSuperAdmin()) {
  128.                 $builder
  129.                     ->add('userRole'EntityType::class, [
  130.                         'class' => RoleManagement::class,
  131.                         'choice_label' => 'roleName',
  132.                         'label' => 'register.userRole',
  133.                         'attr' => ['class' => 'select2'],
  134.                         'mapped' => false,
  135.                         'data' => $selectedRole,
  136.                         'placeholder' => $this->translator->trans('admin.select', [], 'admin')
  137.                     ]);
  138.             }
  139.             if ($this->roleService->isRegularAdmin() && $user->getId() !== $options['userId']) {
  140.                 $builder
  141.                     ->add('userRole'EntityType::class, [
  142.                         'class' => RoleManagement::class,
  143.                         'choice_label' => 'roleName',
  144.                         'label' => 'register.userRole',
  145.                         'attr' => ['class' => 'select2'],
  146.                         'mapped' => false,
  147.                         'data' => $selectedRole,
  148.                         'query_builder' => function (EntityRepository $er) {
  149.                             return $er->createQueryBuilder('u')
  150.                                 ->andWhere('u.roleName != :superAdmin')
  151.                                 ->setParameter('superAdmin'RoleEnum::SUPER_ADMIN->value)
  152.                             ;
  153.                         },
  154.                         'placeholder' => $this->translator->trans('admin.select', [], 'admin')
  155.                     ]);
  156.             }
  157.             if ($user->getId() === $options['userId']) {
  158.                 $builder
  159.                     ->add('oldPassword'PasswordType::class, [
  160.                         'required' => false,
  161.                         'mapped' => false,
  162.                         'label' => 'admin.oldPassword',
  163.                         'attr' => [
  164.                             'data-message' => $this->translator->trans('register.passwordRegex', [], 'security'),
  165.                             'data-repeat' => $this->translator->trans('register.repeatPasswordMessage', [], 'security'),
  166.                         ],
  167.                         'constraints' => [
  168.                             new Regex([
  169.                                 'message' => $this->translator->trans('register.passwordRegex', [], 'security'),
  170.                                 'htmlPattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/',
  171.                                 'pattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/'
  172.                             ])
  173.                         ],
  174.                     ])
  175.                     ->add('plainPassword'RepeatedType::class, [
  176.                         'type' => PasswordType::class,
  177.                         'invalid_message' => $this->translator->trans('register.repeatPasswordMessage', [], 'security'),
  178.                         'required' => false,
  179.                         'mapped' => false,
  180.                         'first_options'  => [
  181.                             'label' => 'admin.newPassword',
  182.                             'constraints' => [
  183.                                 new Regex([
  184.                                     'message' => $this->translator->trans('register.passwordRegex', [], 'security'),
  185.                                     'htmlPattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/',
  186.                                     'pattern' => '/^(?=.*?[0-9])(?=.*[A-Z]).{6,}$/'
  187.                                 ])
  188.                             ],
  189.                         ],
  190.                         'second_options' => [
  191.                             'label' => 'admin.repeatNewPassword'
  192.                         ],
  193.                     ]);
  194.             }
  195.         } else {
  196.             if ($user) {
  197.                 if ($this->roleService->isSuperAdmin()) {
  198.                     $builder
  199.                         ->add('userRole'EntityType::class, [
  200.                             'class' => RoleManagement::class,
  201.                             'choice_label' => 'roleName',
  202.                             'label' => 'register.userRole',
  203.                             'attr' => ['class' => 'select2'],
  204.                             'mapped' => false,
  205.                             'placeholder' => $this->translator->trans('admin.select', [], 'admin')
  206.                         ]);
  207.                 }
  208.                 if ($this->roleService->isRegularAdmin()) {
  209.                     $builder
  210.                         ->add('userRole'EntityType::class, [
  211.                             'class' => RoleManagement::class,
  212.                             'choice_label' => 'roleName',
  213.                             'label' => 'register.userRole',
  214.                             'attr' => ['class' => 'select2'],
  215.                             'mapped' => false,
  216.                             'query_builder' => function (EntityRepository $er) {
  217.                                 return $er->createQueryBuilder('u')
  218.                                     ->andWhere('u.roleName != :superAdmin')
  219.                                     ->setParameter('superAdmin'RoleEnum::SUPER_ADMIN->value)
  220.                                     ;
  221.                             },
  222.                             'placeholder' => $this->translator->trans('admin.select', [], 'admin')
  223.                         ]);
  224.                 }
  225.             }
  226.         }
  227.     }
  228.     public function configureOptions(OptionsResolver $resolver): void
  229.     {
  230.         $resolver->setDefaults([
  231.             'data_class' => User::class,
  232.             'translation_domain' => 'security',
  233.             'create' => false,
  234.             'edit' => false,
  235.             'roleId' => null,
  236.             'userId' => null,
  237.         ]);
  238.     }
  239.     private function getSelectedRole(?int $roleId): null|RoleManagement
  240.     {
  241.         if (!$roleId) return null;
  242.         return $this->registry->getRepository(RoleManagement::class)->find($roleId);
  243.     }
  244.     private function canEditImage(int $userId): bool
  245.     {
  246.         /** @var User $user */
  247.         $user $this->security->getUser();
  248.         if ($this->roleService->isSuperAdmin()) return true;
  249.         return $userId === $user->getId();
  250.     }
  251. }