src/Form/FrontRegistroType.php line 118

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Localidad;
  4. use App\Entity\SexoUsuario;
  5. use App\Entity\Usuario;
  6. use DateTime;
  7. use Doctrine\ORM\EntityRepository;
  8. use Karser\Recaptcha3Bundle\Form\Recaptcha3Type;
  9. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use Symfony\Component\Form\AbstractType;
  12. use Symfony\Component\Form\Extension\Core\Type\DateType;
  13. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  14. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  15. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  16. use Symfony\Component\Form\FormBuilderInterface;
  17. use Symfony\Component\OptionsResolver\OptionsResolver;
  18. use Symfony\Component\Routing\RouterInterface;
  19. use Symfony\Component\Validator\Constraints\Length;
  20. use Symfony\Component\Validator\Constraints\LessThanOrEqual;
  21. use Symfony\Component\Validator\Constraints\NotBlank;
  22. use Symfony\Component\Validator\Constraints\Regex;
  23. class FrontRegistroType extends AbstractType
  24. {
  25. public function __construct(private readonly RouterInterface $router)
  26. {
  27. }
  28. public function buildForm(FormBuilderInterface $builder, array $options): void
  29. {
  30. $urlPoliticaPrivacidad = $this->router->generate('front_politica_privacidad');
  31. $builder
  32. // ->add('usuario', TextType::class, [
  33. // 'label' => 'Nombre de usuario',
  34. // 'attr' => [
  35. // 'class' => 'manual-placeholder'
  36. // ]
  37. // ])
  38. ->add('email', EmailType::class, [
  39. 'label' => 'Email',
  40. 'attr' => [
  41. 'class' => 'manual-placeholder'
  42. ]
  43. ])
  44. ->add('plainPassword', RepeatedType::class, [
  45. 'type' => PasswordType::class,
  46. 'first_options' => [
  47. 'label' => 'Contraseña',
  48. 'attr'=> [
  49. 'class'=> 'manual-placeholder',
  50. 'autocomplete' => false,
  51. 'readonly' => 'readonly',
  52. 'onfocus' => 'this.removeAttribute(\'readonly\');'
  53. ]
  54. ],
  55. 'second_options' => [
  56. 'label' => 'Confirmar contraseña',
  57. 'attr'=> [
  58. 'class' => 'manual-placeholder',
  59. 'autocomplete' => false,
  60. 'readonly' => 'readonly',
  61. 'onfocus' => 'this.removeAttribute(\'readonly\');'
  62. ]
  63. ],
  64. 'mapped' => false,
  65. 'invalid_message' => 'Las contraseñas no coinciden.',
  66. 'constraints' => [
  67. new NotBlank(),
  68. // new Regex([
  69. // 'pattern' => '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/',
  70. // 'message' => 'clave-no-segura'
  71. // ]),
  72. new Length([
  73. 'max' => 50
  74. ])
  75. ]
  76. ])
  77. ->add('nombre', null, [
  78. 'required' => true,
  79. 'label' => 'Nombre',
  80. 'attr' => [
  81. 'class' => 'manual-placeholder'
  82. ],
  83. 'constraints' => [
  84. new NotBlank()
  85. ]
  86. ])
  87. ->add('apellidos', null, [
  88. 'required' => true,
  89. 'label' => 'Apellidos',
  90. 'attr' => [
  91. 'class' => 'manual-placeholder'
  92. ],
  93. 'constraints' => [
  94. new NotBlank()
  95. ]
  96. ])
  97. ->add('dniNie', null, [
  98. 'required' => true,
  99. 'label' => 'DNI o NIE',
  100. 'attr' => [
  101. 'class' => 'manual-placeholder'
  102. ],
  103. 'constraints' => [
  104. new NotBlank()
  105. ]
  106. ])
  107. ->add('sexo', null, [
  108. 'required' => true,
  109. 'placeholder' => 'placeholders.seleccionar.elemento',
  110. 'label' => 'Sexo',
  111. 'choice_label' => 'nombre',
  112. 'class' => SexoUsuario::class,
  113. 'query_builder' => fn(EntityRepository $er) => $er->createQueryBuilder('e')
  114. ->andWhere('e.visible = true AND e.borrado = false'),
  115. 'constraints' => [
  116. new NotBlank()
  117. ]
  118. ])
  119. ->add('fechaNacimiento', DateType::class, [
  120. 'required' => true,
  121. 'label' => 'Fecha de nacimiento',
  122. 'widget' => 'single_text',
  123. 'attr' => [
  124. 'class' => 'dateInput manual-placeholder',
  125. 'autocomplete' => 'off'
  126. ],
  127. 'format' => 'dd/MM/yyyy',
  128. 'html5' => false,
  129. 'constraints' => [
  130. new NotBlank(),
  131. new LessThanOrEqual([
  132. 'value' => (new DateTime())->modify('-16 years'),
  133. 'message' => 'Debes tener al menos 16 años.',
  134. ]),
  135. ]
  136. ])
  137. ->add('direccion', null, [
  138. 'required' => true,
  139. 'label' => 'Dirección',
  140. 'attr' => [
  141. 'class' => 'manual-placeholder'
  142. ],
  143. 'constraints' => [
  144. new NotBlank()
  145. ]
  146. ])
  147. ->add('codigoPostal', null, [
  148. 'required' => true,
  149. 'label' => 'Código postal',
  150. 'attr' => [
  151. 'class' => 'manual-placeholder'
  152. ],
  153. 'constraints' => [
  154. new NotBlank(),
  155. new Regex(['pattern' => '/^\d{5}$/'])
  156. ]
  157. ])
  158. ->add('telefono1', null, [
  159. 'required' => true,
  160. 'label' => 'Teléfono 1',
  161. 'attr' => [
  162. 'class' => 'manual-placeholder'
  163. ],
  164. 'constraints' => [
  165. new NotBlank(),
  166. new Regex(['pattern' => '/^\d{9}$/'])
  167. ]
  168. ])
  169. ->add('telefono2', null, [
  170. 'required' => false,
  171. 'label' => 'Teléfono 2',
  172. 'attr' => [
  173. 'class' => 'manual-placeholder'
  174. ],
  175. 'constraints' => [
  176. new Regex(['pattern' => '/^\d{9}$/'])
  177. ]
  178. ])
  179. ->add('aceptaCondicionesPrivacidad', null, [
  180. 'required' => true,
  181. 'label_html' => true,
  182. 'label' => "
  183. Consiento que la Diputación Provincial de Jaén utilice mis datos para la tramitación de mi registro.
  184. <a href='$urlPoliticaPrivacidad' target='_blank'>Sin la aceptación de este consentimiento no podrá procederse al registro en la plataforma Proempleo</b></a>.
  185. ",
  186. 'constraints' => [
  187. new NotBlank(['message' => 'Debe aceptar la política de privacidad.']),
  188. ]
  189. ])
  190. ->add('captcha', Recaptcha3Type::class, [
  191. 'constraints' => [
  192. new Recaptcha3()
  193. ],
  194. 'locale' => 'es'
  195. ])
  196. ->add('localidad', EntityType::class, [
  197. 'placeholder' => 'placeholders.seleccionar.elemento',
  198. 'label' => 'Localidad',
  199. 'attr' => [
  200. 'class' => 'manual-placeholder bsselectpicker'
  201. ],
  202. 'choice_label' => 'nombre',
  203. 'class' => Localidad::class,
  204. 'query_builder' => fn(EntityRepository $repository) => $repository
  205. ->createQueryBuilder('l')
  206. ->andWhere('l.visible = true AND l.borrado = false')
  207. ->orderBy('l.nombre', 'ASC'),
  208. 'constraints' => [
  209. new NotBlank()
  210. ],
  211. ])
  212. ;
  213. }
  214. /**
  215. * {@inheritdoc}
  216. */
  217. public function configureOptions(OptionsResolver $resolver): void
  218. {
  219. $resolver->setDefaults([
  220. 'data_class' => Usuario::class,
  221. 'translation_domain' => 'app'
  222. ]);
  223. }
  224. }