<?php
namespace App\Form;
use App\Entity\Localidad;
use App\Entity\SexoUsuario;
use App\Entity\Usuario;
use DateTime;
use Doctrine\ORM\EntityRepository;
use Karser\Recaptcha3Bundle\Form\Recaptcha3Type;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\LessThanOrEqual;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
class FrontRegistroType extends AbstractType
{
public function __construct(private readonly RouterInterface $router)
{
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$urlPoliticaPrivacidad = $this->router->generate('front_politica_privacidad');
$builder
// ->add('usuario', TextType::class, [
// 'label' => 'Nombre de usuario',
// 'attr' => [
// 'class' => 'manual-placeholder'
// ]
// ])
->add('email', EmailType::class, [
'label' => 'Email',
'attr' => [
'class' => 'manual-placeholder'
]
])
->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => [
'label' => 'Contraseña',
'attr'=> [
'class'=> 'manual-placeholder',
'autocomplete' => false,
'readonly' => 'readonly',
'onfocus' => 'this.removeAttribute(\'readonly\');'
]
],
'second_options' => [
'label' => 'Confirmar contraseña',
'attr'=> [
'class' => 'manual-placeholder',
'autocomplete' => false,
'readonly' => 'readonly',
'onfocus' => 'this.removeAttribute(\'readonly\');'
]
],
'mapped' => false,
'invalid_message' => 'Las contraseñas no coinciden.',
'constraints' => [
new NotBlank(),
// new Regex([
// 'pattern' => '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/',
// 'message' => 'clave-no-segura'
// ]),
new Length([
'max' => 50
])
]
])
->add('nombre', null, [
'required' => true,
'label' => 'Nombre',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank()
]
])
->add('apellidos', null, [
'required' => true,
'label' => 'Apellidos',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank()
]
])
->add('dniNie', null, [
'required' => true,
'label' => 'DNI o NIE',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank()
]
])
->add('sexo', null, [
'required' => true,
'placeholder' => 'placeholders.seleccionar.elemento',
'label' => 'Sexo',
'choice_label' => 'nombre',
'class' => SexoUsuario::class,
'query_builder' => fn(EntityRepository $er) => $er->createQueryBuilder('e')
->andWhere('e.visible = true AND e.borrado = false'),
'constraints' => [
new NotBlank()
]
])
->add('fechaNacimiento', DateType::class, [
'required' => true,
'label' => 'Fecha de nacimiento',
'widget' => 'single_text',
'attr' => [
'class' => 'dateInput manual-placeholder',
'autocomplete' => 'off'
],
'format' => 'dd/MM/yyyy',
'html5' => false,
'constraints' => [
new NotBlank(),
new LessThanOrEqual([
'value' => (new DateTime())->modify('-16 years'),
'message' => 'Debes tener al menos 16 años.',
]),
]
])
->add('direccion', null, [
'required' => true,
'label' => 'Dirección',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank()
]
])
->add('codigoPostal', null, [
'required' => true,
'label' => 'Código postal',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank(),
new Regex(['pattern' => '/^\d{5}$/'])
]
])
->add('telefono1', null, [
'required' => true,
'label' => 'Teléfono 1',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new NotBlank(),
new Regex(['pattern' => '/^\d{9}$/'])
]
])
->add('telefono2', null, [
'required' => false,
'label' => 'Teléfono 2',
'attr' => [
'class' => 'manual-placeholder'
],
'constraints' => [
new Regex(['pattern' => '/^\d{9}$/'])
]
])
->add('aceptaCondicionesPrivacidad', null, [
'required' => true,
'label_html' => true,
'label' => "
Consiento que la Diputación Provincial de Jaén utilice mis datos para la tramitación de mi registro.
<a href='$urlPoliticaPrivacidad' target='_blank'>Sin la aceptación de este consentimiento no podrá procederse al registro en la plataforma Proempleo</b></a>.
",
'constraints' => [
new NotBlank(['message' => 'Debe aceptar la política de privacidad.']),
]
])
->add('captcha', Recaptcha3Type::class, [
'constraints' => [
new Recaptcha3()
],
'locale' => 'es'
])
->add('localidad', EntityType::class, [
'placeholder' => 'placeholders.seleccionar.elemento',
'label' => 'Localidad',
'attr' => [
'class' => 'manual-placeholder bsselectpicker'
],
'choice_label' => 'nombre',
'class' => Localidad::class,
'query_builder' => fn(EntityRepository $repository) => $repository
->createQueryBuilder('l')
->andWhere('l.visible = true AND l.borrado = false')
->orderBy('l.nombre', 'ASC'),
'constraints' => [
new NotBlank()
],
])
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Usuario::class,
'translation_domain' => 'app'
]);
}
}