<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
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\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;
class RegistrationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('surname', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationName' ,
'placeholder' => 'Prénom',
'style' => 'text-transform: none'
],
'constraints' => [
new Regex([
'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
'message' => 'Le prénom ne peut contenir que des lettres, espaces et tirets.'
])
]
])
->add('firstname', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationFamilyName',
'placeholder' => 'Nom'
],
'constraints' => [
new Regex([
'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
'message' => 'Le nom ne peut contenir que des lettres, espaces et tirets.'
])
]
])
->add('phone', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationPhone',
'placeholder' => 'Téléphone'
],
'required' => false,
'constraints' => [
new Regex([
'pattern' => '/^\+?[0-9\s.-]{7,15}$/',
'message' => 'Numéro de téléphone invalide.'
])
]
])
->add('adress', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationStreet',
'placeholder' => 'Adresse'
],
'constraints' => [
new Regex([
'pattern' => '/^[0-9A-Za-zÀ-ÿ\s,.-]+$/',
'message' => 'L\'adresse ne peut contenir que des lettres, chiffres, espaces, virgules, points et tirets.'
])
]
])
->add('additionalAdressInformation', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationText',
'placeholder' => 'Information supplémentaires'
],
'required' => false,
'constraints' => [
new Length([
'min' => 1,
'max' => 64,
'minMessage' => 'Les informations supplémentaires doivent contenir au moins {{ limit }} caractère.',
'maxMessage' => 'Les informations supplémentaires ne peuvent pas dépasser {{ limit }} caractères.'
]),
new Regex([
'pattern' => '/^[^<>\\"\'\{\}\[\]\(\)]+$/',
'message' => 'Les informations supplémentaires ne doivent pas contenir de code informatique ou de caractères spéciaux interdits.'
])
]
])
->add('city', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationCity',
'placeholder' => 'Ville'
],
'constraints' => [
new Regex([
'pattern' => '/^[A-Za-zÀ-ÿ\s-]+$/',
'message' => 'Le nom de la ville ne peut contenir que des lettres, espaces et tirets.'
])
]
])
->add('zipcode', TextType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationZipCode',
'placeholder' => 'Code postal'
],
'constraints' => [
new Regex([
'pattern' => '/^\d{5}$/',
'message' => 'Le code postal doit contenir exactement 5 chiffres.'
])
]
])
->add('email', EmailType::class, [
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationMail',
'placeholder' => 'Votre Email'
],
'constraints' => [
new Regex([
'pattern' => '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/',
'message' => 'Adresse email invalide.'
])
]
])
->add('agreeTerms', CheckboxType::class, [
'mapped' => false,
'required' => true,
'constraints' => [
new IsTrue([
'message' => 'You should agree to our terms.',
]),
],
'label' => 'J\'accepte les conditions générales de vente:'
])
->add('plainPassword', PasswordType::class, [
// instead of being set onto the object directly,
// this is read and encoded in the controller
'mapped' => false,
'attr' => ['autocomplete' => 'new-password'],
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Please enter a password',
]),
new Length([
'min' => 8,
'minMessage' => 'Votre mot de passe dois faire au moins {{ limit }} caractères',
'max' => 64,
'maxMessage' => 'Le mot de passe ne peut pas dépasser {{ limit }} caractères'
]),
// Validation de caractères interdits dans le mot de passe
new Regex([
'pattern' => '/[^!@#]+/', // Les caractères interdits (ex: !, @, #)
'match' => true, // Cette expression signifie que tout caractère doit être différent de ceux indiqués dans le pattern
'message' => 'Le mot de passe ne peut pas contenir les caractères !, @, #.',
]),
// Validation contre les caractères dangereux
new Regex([
'pattern' => '/^[^\x22\x27\x28\x29\x3C\x3E\x60]+$/', // Interdit les guillemets, parenthèses et autres caractères dangereux
'message' => 'Le mot de passe contient des caractères interdits.',
]),
// Validation contre les mots de passe vides
new NotBlank([
'message' => 'Le mot de passe ne peut pas être vide.',
]),
],
'attr' => [
'class' => 'form-control mb-3 p-4 formValidationCode',
'placeholder' => 'Votre mot de passe'
]
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
'attr' => ['id' => 'registration_form',
'class' => 'form-group flex-wrap'
]
]);
}
}