src/App/Form/RegistrationType.php line 20

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\User;
  4. use FOS\UserBundle\Form\Type\RegistrationFormType;
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  7. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  8. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  9. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  10. use Symfony\Component\Form\FormBuilderInterface;
  11. use Symfony\Component\Form\FormEvent;
  12. use Symfony\Component\Form\FormEvents;
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\Routing\RouterInterface;
  15. use Symfony\Component\Validator\Constraints\IsTrue;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. class RegistrationType extends AbstractType
  18. {
  19. protected RequestStack $requestStack;
  20. public function __construct(
  21. RequestStack $requestStack,
  22. private readonly RouterInterface $router,
  23. private readonly TranslatorInterface $translator
  24. ) {
  25. $this->requestStack = $requestStack;
  26. }
  27. public function buildForm(FormBuilderInterface $builder, array $options): void
  28. {
  29. // These allow registration using only email.
  30. // We set the username=email, and generate a password for the user
  31. $builder->remove('username');
  32. $builder->remove('plainPassword');
  33. // Make place for our email field with repeat
  34. $builder->remove('email');
  35. $request = $this->requestStack->getCurrentRequest();
  36. $createWithRole = $request->query->get('createWithRole', User::ROLE_NAME_JOBSEEKER);
  37. if ($createWithRole !== User::ROLE_NAME_JOBSEEKER && $createWithRole !== User::ROLE_NAME_JOBOFFERER) {
  38. $createWithRole = User::ROLE_NAME_JOBSEEKER;
  39. }
  40. $translationKey = 'jobseeker';
  41. if ($createWithRole === User::ROLE_NAME_JOBOFFERER) {
  42. $translationKey = 'jobofferer';
  43. }
  44. $builder->add('email', RepeatedType::class, [
  45. 'type' => EmailType::class,
  46. 'options' => ['translation_domain' => 'FOSUserBundle'],
  47. 'first_options' => [
  48. 'label' => "form.email.$translationKey",
  49. 'attr' => ['placeholder' => 'z.B. vorname.nachname@gmail.com']
  50. ],
  51. 'second_options' => ['label' => "form.email_confirmation.$translationKey"],
  52. 'invalid_message' => 'fos_user.email.mismatch',
  53. ]);
  54. $agbText = $createWithRole === User::ROLE_NAME_JOBOFFERER ? 'profiles.editor_page.jobofferer.terms_and_privacy_policy_note' : 'profiles.editor_page.jobseeker.terms_and_privacy_policy_note';
  55. $builder
  56. ->add(
  57. 'acceptedTermsAndConditions',
  58. CheckboxType::class,
  59. [
  60. 'label' => $this->translator->trans(
  61. $agbText,
  62. [
  63. '%content.terms.path%' => $this->router->generate(
  64. 'content', ['content' => 'agb']
  65. ),
  66. '%content.privacy_policy.path%' => $this->router->generate(
  67. 'content', ['content' => 'datenschutz']
  68. )
  69. ]
  70. ),
  71. 'label_html' => true,
  72. 'constraints' => [
  73. new IsTrue([
  74. 'message' => 'Bitte akzeptiere die AGB.'
  75. ])
  76. ]
  77. ]
  78. );
  79. $builder->add(
  80. 'createWithRole',
  81. HiddenType::class,
  82. [
  83. 'mapped' => false,
  84. 'data' => $createWithRole
  85. ]
  86. );
  87. $builder->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'onPreSubmit']);
  88. }
  89. public function getParent(): string
  90. {
  91. return RegistrationFormType::class;
  92. }
  93. public function getBlockPrefix(): string
  94. {
  95. return 'app_user_registration';
  96. }
  97. public function onPreSubmit(FormEvent $event): void
  98. {
  99. $formData = $event->getData();
  100. $formData['email']['first'] = mb_strtolower($formData['email']['first']);
  101. $formData['email']['second'] = mb_strtolower($formData['email']['second']);
  102. $event->setData($formData);
  103. }
  104. }