src/Form/Frontend/RegistrationType.php line 106

Open in your IDE?
  1. <?php
  2. namespace App\Form\Frontend;
  3. use App\Entity\Gos\Country;
  4. use App\Entity\Gos\User;
  5. use App\Entity\Gos\UserPosition;
  6. use App\Utils\Geolocation;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Doctrine\ORM\EntityRepository;
  9. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  10. use Symfony\Component\Form\AbstractType;
  11. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  12. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  13. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  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\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. use Symfony\Component\OptionsResolver\OptionsResolver;
  20. use Symfony\Component\Validator\Constraints\NotBlank;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. class RegistrationType extends AbstractType
  23. {
  24.     protected EntityManagerInterface $em;
  25.     protected                        $geolocation;
  26.     protected TranslatorInterface    $translator;
  27.     protected ?Request               $request;
  28.     public function __construct(
  29.         TranslatorInterface $translator,
  30.         EntityManagerInterface $em,
  31.         Geolocation $geolocation,
  32.         RequestStack $requestStack
  33.     )
  34.     {
  35.         $this->em           $em;
  36.         $this->translator   $translator;
  37.         $this->geolocation  $geolocation->geolocation();
  38.         $this->request      $requestStack->getCurrentRequest();
  39.     }
  40.     public function buildForm(FormBuilderInterface $builder, array $options): void
  41.     {
  42.         $hideExtra $options['hideExtraFields'];
  43.         $phoneRequired $options['phoneRequired'];
  44.         $portalSettingsId $options['portalSettingsId'];
  45.         $isLeading $options['isLeading'];
  46.         $isEnglishLead $options['isEnglishLead'];
  47.         $builder
  48.             ->remove('username')
  49.             ->add(
  50.                 'firstName',
  51.                 $hideExtra HiddenType::class : TextType::class,
  52.                 [
  53.                     'label'       => $this->translator->trans('form.login.firstName') . ($isLeading '*' ''),
  54.                     'constraints' => [
  55.                         new NotBlank()
  56.                     ]
  57.                 ]
  58.             )
  59.             ->add(
  60.                 'lastName',
  61.                 $hideExtra HiddenType::class : TextType::class,
  62.                 [
  63.                     'label'       => $this->translator->trans('form.login.lastName') . ($isLeading '*' '')
  64.                 ]
  65.             )
  66.             ->add(
  67.                 'email',
  68.                 EmailType::class,
  69.                 [
  70.                     'label'       => $this->translator->trans('form.login.email') . ($isLeading '*' ''),
  71.                     'constraints' => [
  72.                         new NotBlank()
  73.                     ]
  74.                 ]
  75.             )
  76.             ->add(
  77.                 'phoneNumber',
  78.                 $hideExtra || $options['phoneHidden'] ? HiddenType::class : TelType::class,
  79.                 [
  80.                     'label'    =>
  81.                         $this->translator->trans('form.login.phoneNumber') .
  82.                             ($isLeading
  83.                                 ? (!$isEnglishLead
  84.                                     ? ($phoneRequired '*' '**')
  85.                                     : ' (optional)')
  86.                                 : ''),
  87.                     'required' => (bool)$phoneRequired
  88.                 ]
  89.             )
  90.             ->add(
  91.                 'position',
  92.                 EntityType::class,
  93.                 array(
  94.                     'class'         => UserPosition::class,
  95.                     'label'         => $this->translator->trans('form.registration.position') . ($isLeading '*' ''),
  96.                     'multiple'      => false,
  97.                     'required'      => false,
  98.                     'choice_label'  => 'name',
  99.                     'attr'          => ['class' => 'form-control'],
  100.                     'query_builder' => function (EntityRepository $er) use ($builder$portalSettingsId) {
  101.                         return $er->createQueryBuilder('p')
  102.                             ->leftJoin('p.portalSettings''portal')
  103.                             ->where('portal.id = :portalId')
  104.                             ->setParameter('portalId'$portalSettingsId);
  105.                     }
  106.                 )
  107.             )
  108.             ->add('password',
  109.                 PasswordType::class,
  110.                 [
  111.                     'required' => false
  112.                 ]
  113.             );
  114.         if ($options['requiredNPWZ'] == true)
  115.         {
  116.             $builder->add('npwz'TextType::class, [
  117.                 'mapped' => false,
  118.                 'required' => true,
  119.                 'label' => 'NPWZ' . ($isLeading '*' '')
  120.             ]);
  121.         }
  122.         if ($options['is_from_application'] == true)
  123.         {
  124.             $builder->add('plainPassword',
  125.                 PasswordType::class,
  126.                 ['required' => false]
  127.             );
  128.         }
  129.         if ($options['is_uniqskills_portal'] == 'uniqskills_register' || $options['show_country'])
  130.         {
  131.             $builder->add('country',
  132.                 EntityType::class,
  133.                 [
  134.                     'class' => Country::class,
  135.                     'placeholder' => 'uniqskills.form.user.country',
  136.                     'empty_data' => false,
  137.                     'choice_label' => 'name',
  138.                     'label' => 'uniqskills.form.user.country',
  139.                     'data' => $this->getCountry(),
  140.                     'required' => false,
  141.                     'query_builder' => function (EntityRepository $er) {
  142.                         return $er->createQueryBuilder('c')
  143.                             ->orderBy('c.name''ASC');
  144.                     },
  145.                 ]
  146.             );
  147.         }
  148.     }
  149.     private function getCountry()
  150.     {
  151.         $countryName $this->request->getLocale() === 'en' 'United Kingdom' $this->checkClient('country');
  152.         return $this->em->getRepository(Country::class)
  153.             ->findOneBy(['name' => $countryName]);
  154.     }
  155.     private function checkClient($type)
  156.     {
  157.         $data $this->geolocation;
  158.         if (is_array($data) && array_key_exists($type$data))
  159.             return $data[$type];
  160.     }
  161.     public function configureOptions(OptionsResolver $resolver): void
  162.     {
  163.         $resolver->setDefaults([
  164.             'data_class'        => User::class,
  165.             'csrf_protection'   => true,
  166.             'phoneRequired'     => false,
  167.             'phoneHidden'       => false,
  168.             'hideExtraFields'   => false,
  169.             'is_uniqskills_portal' => false,
  170.             'portalSettingsId'     => null,
  171.             'show_country'         => false,
  172.             'is_from_application'  => false,
  173.             'requiredNPWZ'         => false,
  174.             'isLeading'            => false,
  175.             'isEnglishLead'        => false
  176.         ]);
  177.     }
  178.     public function getParent(): string
  179.     {
  180.         return 'FOS\UserBundle\Form\Type\RegistrationFormType';
  181.     }
  182.     public function getBlockPrefix(): string
  183.     {
  184.         return 'app_user_registration';
  185.     }
  186.     public function getName(): string
  187.     {
  188.         return $this->getBlockPrefix();
  189.     }
  190. }