src/UserBundle/Form/RegistrationType.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\UserBundle\Form;
  3. use App\UserBundle\Entity\User;
  4. use ReCaptcha\ReCaptcha;
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  7. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  8. use Symfony\Component\Form\Extension\Core\Type\TelType;
  9. use Symfony\Component\Form\Extension\Core\Type\TextType;
  10. use Symfony\Component\Form\FormBuilderInterface;
  11. use Symfony\Component\Form\FormError;
  12. use Symfony\Component\Form\FormEvent;
  13. use Symfony\Component\Form\FormEvents;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  17. use Symfony\Component\OptionsResolver\OptionsResolver;
  18. use Symfony\Component\Validator\Constraints\Length;
  19. use Symfony\Component\Validator\Constraints\NotBlank;
  20. class RegistrationType extends AbstractType
  21. {
  22. private ?Request $request;
  23. public function __construct(RequestStack $requestStack, ReCaptcha $reCaptcha, FlashBagInterface $flashBag)
  24. {
  25. $this->request = $requestStack->getCurrentRequest();
  26. $this->reCaptcha = $reCaptcha;
  27. $this->flashBag = $requestStack->getSession()->getFlashBag();
  28. }
  29. public function buildForm(FormBuilderInterface $builder, array $options): void
  30. {
  31. $authLogin = false;
  32. $defaultName = null;
  33. $defaultEmail = null;
  34. if ($this->request instanceof Request and $this->request->getSession()->has("AOuthData")) {
  35. $authLogin = true;
  36. $AOuthData = $this->request->getSession()->get("AOuthData");
  37. $defaultName = $AOuthData['name'];
  38. $defaultEmail = $AOuthData['email'];
  39. }
  40. $builder
  41. ->add('fullName', TextType::class, [
  42. "data" => $defaultName,
  43. "label" => "name_txt",
  44. "attr" => [
  45. "class" => "input",
  46. "data-stack-input-input" => "true",
  47. "autocomplete" => "name",
  48. "data-validate-input" => "name",
  49. "data-form-validate-input-rules" => "required",
  50. "placeholder" => "name_txt",
  51. ]
  52. ])
  53. ->add('email', EmailType::class, [
  54. "data" => $defaultEmail,
  55. "label" => "email_txt",
  56. 'attr' => [
  57. 'placeholder' => 'email_txt',
  58. "data-stack-input-input" => "true",
  59. 'class' => 'input',
  60. 'autocomplete' => 'email',
  61. 'data-validate-input' => 'email',
  62. 'data-form-validate-input-rules' => 'required|email',
  63. ],
  64. ])
  65. /*->add('gender', ChoiceType::class, [
  66. 'choices' => [
  67. 'Male' => User::GENDER_MALE,
  68. 'Female' => User::GENDER_FEMALE,
  69. ],
  70. ])*/
  71. ->add('phone', TelType::class, [
  72. "label" => "phone_txt",
  73. 'attr' => [
  74. 'placeholder' => 'phone_txt',
  75. "data-stack-input-input" => "true",
  76. 'class' => 'input',
  77. 'autocomplete' => 'tel',
  78. 'data-validate-input' => 'phone',
  79. 'data-form-validate-input-rules' => 'required|phone',
  80. ],
  81. ]);
  82. if (!$authLogin) {
  83. $builder->add('plainPassword', PasswordType::class, [
  84. 'required' => true,
  85. "label" => "password_txt",
  86. 'attr' => [
  87. "placeholder" => "password_txt",
  88. 'autocomplete' => 'new-password',
  89. "class" => "input",
  90. "data-stack-input-input" => "true",
  91. "data-validate-input" => "password",
  92. "data-form-validate-input-rules" => "required",
  93. "data-ui-form-password" => "sign-password",
  94. ],
  95. "label_attr" => [
  96. "class" => "label",
  97. "data-stack-input-label" => "true"
  98. ],
  99. 'constraints' => [
  100. new NotBlank([
  101. 'message' => 'Please enter a password',
  102. ]),
  103. new Length([
  104. 'min' => 6,
  105. 'minMessage' => 'Your password should be at least {{ limit }} characters',
  106. // max length allowed by Symfony for security reasons
  107. 'max' => 4096,
  108. ]),
  109. ],
  110. ]);
  111. }
  112. $builder->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit']);
  113. }
  114. public function onPostSubmit(FormEvent $event): void
  115. {
  116. $request = Request::createFromGlobals();
  117. $result = $this->reCaptcha
  118. ->setExpectedHostname($request->getHost())
  119. ->verify($request->request->get('g-recaptcha-response'), $request->getClientIp());
  120. if (!$result->isSuccess()) {
  121. $this->flashBag->add("error", 'The captcha is invalid. Please try again.');
  122. $event->getForm()->get('email')->addError(new FormError('The captcha is invalid. Please try again.'));
  123. }
  124. }
  125. public function configureOptions(OptionsResolver $resolver): void
  126. {
  127. $resolver->setDefaults([
  128. 'data_class' => User::class,
  129. 'validation_groups' => ["Default"],
  130. ]);
  131. }
  132. }