<?php
namespace App\Form\Website\Type\Newsletter;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
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\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\NotBlank;
class NewsletterType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
// Civilité - Radio buttons
->add('civility', ChoiceType::class, [
'label' => 'Civilité',
'required' => true,
'choices' => [
'M.' => 'M.',
'Mme' => 'Mme',
],
'expanded' => true,
'multiple' => false,
'constraints' => [
new NotBlank([
'message' => 'Veuillez sélectionner une civilité.',
]),
],
])
// Nom
->add('lastName', TextType::class, [
'label' => 'Nom',
'required' => true,
'attr' => [
'placeholder' => 'Nom',
],
'constraints' => [
new NotBlank([
'message' => 'Le nom est obligatoire.',
]),
],
])
// Prénom
->add('firstName', TextType::class, [
'label' => 'Prénom',
'required' => true,
'attr' => [
'placeholder' => 'Prénom',
],
'constraints' => [
new NotBlank([
'message' => 'Le prénom est obligatoire.',
]),
],
])
// Email
->add('email', EmailType::class, [
'label' => 'Email',
'required' => true,
'attr' => [
'placeholder' => 'email@exemple.fr',
],
'constraints' => [
new NotBlank([
'message' => 'L\'adresse email est obligatoire.',
]),
new Email([
'message' => 'Veuillez saisir une adresse email valide.',
]),
],
])
// Confirmation de l'email
->add('emailConfirmation', EmailType::class, [
'label' => 'Confirmation de l\'email',
'required' => true,
'attr' => [
'placeholder' => 'email@exemple.fr',
],
'constraints' => [
new NotBlank([
'message' => 'La confirmation de l\'adresse email est obligatoire.',
]),
new Email([
'message' => 'Veuillez saisir une adresse email valide.',
]),
],
])
// Checkbox de consentement
->add('consent', CheckboxType::class, [
'label' => 'website.forms.newsletter.label.consent',
'required' => true,
'constraints' => [
new IsTrue([
'message' => 'Vous devez accepter l\'exploitation de vos données.',
]),
],
]);
// Validation pour vérifier que les emails correspondent
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$email = $form->get('email')->getData();
$emailConfirmation = $form->get('emailConfirmation')->getData();
if ($email !== $emailConfirmation) {
$form->get('emailConfirmation')->addError(
new \Symfony\Component\Form\FormError('Les adresses email doivent correspondre.')
);
}
});
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'csrf_protection' => true,
]);
}
}