<?php
namespace App\Form;
use App\Entity\Entity;
use App\Entity\Profile;
use App\Entity\User;
use App\Repository\EntityRepository;
use App\Repository\ProfileRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
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\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Karser\Recaptcha3Bundle\Form\Recaptcha3Type;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
use Symfony\Component\Validator\Constraints\NotBlank;
class UserRegisterType extends AbstractType
{
public function __construct(private readonly RequestStack $request)
{
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$route = $this->request->getCurrentRequest()->attributes->get('_route');
$builder->setAction("#");
$builder->setMethod("post");
$builder->addEventListener(FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($builder) {
$user = $event->getData();
// Create
if (!$user || null === $user->getId()) {
$event->getForm()
->add('lastName', TextType::class, [
'label' => 'Nom',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Nom" est obligatoire.')],
])
->add('name', TextType::class, [
'label' => 'Prénom',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Prénom" est obligatoire.')],
])
->add('email' , EmailType::class, [
'label' => 'Email',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Email" est obligatoire.')],
])
->add('phone', TelType::class, [
'label' => 'Téléphone',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Téléphone" est obligatoire.')],
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Mot de passe non identique',
'options' => [
'attr' => [
'class' => 'form-control'
]
],
'required' => true,
'first_options' => [
'label' => 'Mot de passe'
],
'second_options' => [
'label' => 'Confirmer le mot de passe'
]
,
'constraints' => [new NotBlank(null,'Le champ "Mot de passe" est obligatoire.')],
])
->add('isAccept', CheckboxType::class, [
'required' => true,
'attr' => [
'class' => 'form-check-label'
],
'label_attr' => [
'style' => 'display: none',
]
])
;
// Edit
} else {
$event->getForm()
->add('email' , EmailType::class, [
'label' => 'Email',
'required' => false
])
->add('lastName', TextType::class, [
'label' => 'Nom',
'required' => false
])
->add('name', TextType::class, [
'label' => 'Prénom',
'required' => false
])
->add('phone', TelType::class, [
'label' => 'Téléphone',
'required' => false
])
->add('birthDate', BirthdayType::class, [
'label' => 'Date de naissance *',
'required' => false,
'widget' => 'single_text'
])
->add('address', TextType::class, [
'label' => 'Adresse',
'required' => false
])
->add('city', TextType::class, [
'label' => 'Ville',
'required' => false
])
->add('postalCode', TextType::class, [
'label' => 'Code postal',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Code postal" est obligatoire.')],
])
;
}
}
);
$builder
->add('captcha', Recaptcha3Type::class, [
'constraints' => new Recaptcha3(),
'action_name' => 'homepage',
])
;
if ($route == 'user_register_no_entity') {
$builder
->add('profiles', EntityType::class, [
'class' => Profile::class,
'query_builder' => fn(ProfileRepository $repository) =>
$repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'),
'choice_label' => 'name',
'label' => 'Profils',
'multiple' => true,
'required' => false,
'attr' => [
'data-plugin' => "select2",
'style' => 'width: 100%'
]
])
->add('entities', EntityType::class, [
'class' => Entity::class,
'query_builder' => fn(EntityRepository $repository) =>
$repository->createQueryBuilder('e')->orderBy('e.name', 'ASC'),
'choice_label' => 'name',
'label' => 'Entité',
'multiple' => true,
'attr' => [
'data-plugin' => "select2",
'style' => 'width: 100%'
]
])
->add('birthDate', BirthdayType::class, [
'label' => "Date de naissance *",
'widget' => 'single_text'
])
->add('postalCode', TextType::class, [
'label' => 'Code postal',
'required' => true,
'constraints' => [new NotBlank(null,'Le champ "Code postal" est obligatoire.')],
])
;
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
// enable/disable CSRF protection for this form
//'csrf_protection' => false,
// the name of the hidden HTML field that stores the token
'csrf_field_name' => '_token',
// an arbitrary string used to generate the value of the token
// using a different string for each form improves its security
'csrf_token_id' => 'task_item',
]);
}
}