<?php
namespace App\Form;
use App\Entity\User;
use FOS\UserBundle\Form\Type\RegistrationFormType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegistrationType extends AbstractType
{
protected RequestStack $requestStack;
public function __construct(
RequestStack $requestStack,
private readonly RouterInterface $router,
private readonly TranslatorInterface $translator
) {
$this->requestStack = $requestStack;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
// These allow registration using only email.
// We set the username=email, and generate a password for the user
$builder->remove('username');
$builder->remove('plainPassword');
// Make place for our email field with repeat
$builder->remove('email');
$request = $this->requestStack->getCurrentRequest();
$createWithRole = $request->query->get('createWithRole', User::ROLE_NAME_JOBSEEKER);
if ($createWithRole !== User::ROLE_NAME_JOBSEEKER && $createWithRole !== User::ROLE_NAME_JOBOFFERER) {
$createWithRole = User::ROLE_NAME_JOBSEEKER;
}
$translationKey = 'jobseeker';
if ($createWithRole === User::ROLE_NAME_JOBOFFERER) {
$translationKey = 'jobofferer';
}
$builder->add('email', RepeatedType::class, [
'type' => EmailType::class,
'options' => ['translation_domain' => 'FOSUserBundle'],
'first_options' => [
'label' => "form.email.$translationKey",
'attr' => ['placeholder' => 'z.B. vorname.nachname@gmail.com']
],
'second_options' => ['label' => "form.email_confirmation.$translationKey"],
'invalid_message' => 'fos_user.email.mismatch',
]);
$agbText = $createWithRole === User::ROLE_NAME_JOBOFFERER ? 'profiles.editor_page.jobofferer.terms_and_privacy_policy_note' : 'profiles.editor_page.jobseeker.terms_and_privacy_policy_note';
$builder
->add(
'acceptedTermsAndConditions',
CheckboxType::class,
[
'label' => $this->translator->trans(
$agbText,
[
'%content.terms.path%' => $this->router->generate(
'content', ['content' => 'agb']
),
'%content.privacy_policy.path%' => $this->router->generate(
'content', ['content' => 'datenschutz']
)
]
),
'label_html' => true,
'constraints' => [
new IsTrue([
'message' => 'Bitte akzeptiere die AGB.'
])
]
]
);
$builder->add(
'createWithRole',
HiddenType::class,
[
'mapped' => false,
'data' => $createWithRole
]
);
$builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']);
}
public function getParent(): string
{
return RegistrationFormType::class;
}
public function getBlockPrefix(): string
{
return 'app_user_registration';
}
public function onPreSubmit(FormEvent $event): void
{
$formData = $event->getData();
$formData['email']['first'] = mb_strtolower($formData['email']['first']);
$formData['email']['second'] = mb_strtolower($formData['email']['second']);
$event->setData($formData);
}
}