<?php
namespace App\Form\Frontend;
use App\Entity\Gos\Country;
use App\Entity\Gos\User;
use App\Entity\Gos\UserPosition;
use App\Utils\Geolocation;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegistrationType extends AbstractType
{
protected EntityManagerInterface $em;
protected $geolocation;
protected TranslatorInterface $translator;
protected ?Request $request;
public function __construct(
TranslatorInterface $translator,
EntityManagerInterface $em,
Geolocation $geolocation,
RequestStack $requestStack
)
{
$this->em = $em;
$this->translator = $translator;
$this->geolocation = $geolocation->geolocation();
$this->request = $requestStack->getCurrentRequest();
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$hideExtra = $options['hideExtraFields'];
$phoneRequired = $options['phoneRequired'];
$portalSettingsId = $options['portalSettingsId'];
$isLeading = $options['isLeading'];
$isEnglishLead = $options['isEnglishLead'];
$builder
->remove('username')
->add(
'firstName',
$hideExtra ? HiddenType::class : TextType::class,
[
'label' => $this->translator->trans('form.login.firstName') . ($isLeading ? '*' : ''),
'constraints' => [
new NotBlank()
]
]
)
->add(
'lastName',
$hideExtra ? HiddenType::class : TextType::class,
[
'label' => $this->translator->trans('form.login.lastName') . ($isLeading ? '*' : '')
]
)
->add(
'email',
EmailType::class,
[
'label' => $this->translator->trans('form.login.email') . ($isLeading ? '*' : ''),
'constraints' => [
new NotBlank()
]
]
)
->add(
'phoneNumber',
$hideExtra || $options['phoneHidden'] ? HiddenType::class : TelType::class,
[
'label' =>
$this->translator->trans('form.login.phoneNumber') .
($isLeading
? (!$isEnglishLead
? ($phoneRequired ? '*' : '**')
: ' (optional)')
: ''),
'required' => (bool)$phoneRequired
]
)
->add(
'position',
EntityType::class,
array(
'class' => UserPosition::class,
'label' => $this->translator->trans('form.registration.position') . ($isLeading ? '*' : ''),
'multiple' => false,
'required' => false,
'choice_label' => 'name',
'attr' => ['class' => 'form-control'],
'query_builder' => function (EntityRepository $er) use ($builder, $portalSettingsId) {
return $er->createQueryBuilder('p')
->leftJoin('p.portalSettings', 'portal')
->where('portal.id = :portalId')
->setParameter('portalId', $portalSettingsId);
}
)
)
->add('password',
PasswordType::class,
[
'required' => false
]
);
if ($options['requiredNPWZ'] == true)
{
$builder->add('npwz', TextType::class, [
'mapped' => false,
'required' => true,
'label' => 'NPWZ' . ($isLeading ? '*' : '')
]);
}
if ($options['is_from_application'] == true)
{
$builder->add('plainPassword',
PasswordType::class,
['required' => false]
);
}
if ($options['is_uniqskills_portal'] == 'uniqskills_register' || $options['show_country'])
{
$builder->add('country',
EntityType::class,
[
'class' => Country::class,
'placeholder' => 'uniqskills.form.user.country',
'empty_data' => false,
'choice_label' => 'name',
'label' => 'uniqskills.form.user.country',
'data' => $this->getCountry(),
'required' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.name', 'ASC');
},
]
);
}
}
private function getCountry()
{
$countryName = $this->request->getLocale() === 'en' ? 'United Kingdom' : $this->checkClient('country');
return $this->em->getRepository(Country::class)
->findOneBy(['name' => $countryName]);
}
private function checkClient($type)
{
$data = $this->geolocation;
if (is_array($data) && array_key_exists($type, $data))
return $data[$type];
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
'csrf_protection' => true,
'phoneRequired' => false,
'phoneHidden' => false,
'hideExtraFields' => false,
'is_uniqskills_portal' => false,
'portalSettingsId' => null,
'show_country' => false,
'is_from_application' => false,
'requiredNPWZ' => false,
'isLeading' => false,
'isEnglishLead' => false
]);
}
public function getParent(): string
{
return 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
public function getBlockPrefix(): string
{
return 'app_user_registration';
}
public function getName(): string
{
return $this->getBlockPrefix();
}
}