<?php
namespace App\Form;
use App\Entity\User;
use App\Validator\Constraints\IsEmailOrigin;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$valeurSexe = $options['sexeDefaut'];
$value = ($valeurSexe) ? $valeurSexe : 'f';
if($options['email'])
{
$builder
->add('email', EmailType::class, [
'label' => 'Email<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'constraints' => [
new Email([
'message' => 'Veuillez entrer un email valide',
]),
new NotBlank([
'message' => 'Veuillez entrer un email',
]),
new IsEmailOrigin()
],
'attr' => [
'placeholder' => 'Saisir une adresse email',
'autocomplete' => 'email'
]
])
;
}
if($options['password'])
{
$builder
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Les mots de passe doivent être identiques',
'options' => [
'attr' => [
'class' => 'password-field'
]
],
'required' => false,
'first_options' => [
'label' => 'Mot de passe<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'attr' => [
'placeholder' => 'Saisir un mot de passe',
'class' => 'password-field-first'
],
'help' => '(En savoir plus)',
'help_attr' => [
'data-bs-toggle' => 'modal',
'data-bs-target' => '#modalPassword',
'class' => 'd-inline'
],
'label_attr' => [
'class' => 'd-inline mb-2'
]
],
'second_options' => [
'label' => 'Confirmation du mot de passe<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'attr' => [
'placeholder' => 'Confirmer le mot de passe',
'class' => 'password-field-second'
],
'label_attr' => [
'class' => 'mb-2'
]
],
'constraints' => [
new NotBlank([
'message' => 'Veuillez entrer un mot de passe',
]),
new Regex([
'pattern' => '/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[-+!*$@%_?.])([-+!*$@%_?.\w]{8,15})$/',
'match'=> true,
'message'=>'Votre mot de passe doit comporter au moins huit caractères, dont des lettres majuscules et minuscules, un chiffre et un symbole : - + ! * $ @ % _ ? .'
])
],
])
;
}
if($options['nom'])
{
$builder
->add('nom', null, [
'label' => 'Nom<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'constraints' => [
new NotBlank([
'message' => 'Veuillez entrer un nom',
]),
],
'attr' => [
'placeholder' => 'Saisir un nom'
]
])
;
}
if($options['prenom'])
{
$builder
->add('prenom', null, [
'label' => 'Prénom<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'constraints' => [
new NotBlank([
'message' => 'Veuillez entrer un prénom',
]),
],
'attr' => [
'placeholder' => 'Saisir un prénom'
]
])
;
}
if($options['agree'])
{
$builder
->add('agreeTerms', CheckboxType::class, [
'mapped' => false,
'label' => 'J\'accepte les conditions générales d\'utilisation du site<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'constraints' => [
new IsTrue([
'message' => 'Vous devez accepter les conditions générales d\'utilisation du site',
]),
],
'help' => 'Lire les conditions générales d\'utilisation du site',
'help_attr' => [
'data-bs-toggle' => 'modal',
'data-bs-target' => '#modalConditions',
'class' => 'd-inline'
],
'label_attr' => [
'class' => 'd-inline mb-2'
]
])
;
}
if($options['roles'])
{
$builder
// ->add('roles', ChoiceType::class, [
// 'choices' => [
// //'Utilisateur' => 'ROLE_USER',
// 'Administrateur' => 'ROLE_ADMIN'
// ],
// 'label' => 'Rôles',
// 'multiple' => true,
// 'expanded' => true
// ])
->add('role', ChoiceType::class, [
'label' => 'Rôle<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'placeholder' => 'Saisir un rôle',
'choices' => [
'User' => 'ROLE_USER',
'Modérateur' => 'ROLE_MODO',
'Administrateur' => 'ROLE_ADMIN',
],
'required' => false,
'constraints' => [
new NotBlank([
'message' => 'Veuillez saisir un rôle',
]),
],
])
;
}
if($options['update'])
{
$builder
->add('oldPassword', PasswordType::class, [
'required' => false,
'mapped' => false,
'label' => 'Mot de passe actuel<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'attr' => [
'placeholder' => 'Mot de passe actuel',
'class' => 'password-field-alone'
]
])
->add('newPassword', PasswordType::class, [
'required' => false,
'mapped' => false,
'label' => 'Nouveau mot de passe<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'attr' => [
'placeholder' => 'Nouveau mot de passe',
'class' => 'password-field-first'
],
'help' => '(En savoir plus)',
'help_attr' => [
'data-bs-toggle' => 'modal',
'data-bs-target' => '#modalPassword',
'class' => 'd-inline'
],
'label_attr' => [
'class' => 'd-inline'
]
])
->add('confirmPassword', PasswordType::class, [
'required' => false,
'mapped' => false,
'label' => 'Confirmation du nouveau mot de passe<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'attr' => [
'placeholder' => 'Confirmation du nouveau mot de passe',
'class' => 'password-field-second'
]
])
;
}
if($options['emailReset'])
{
$builder
->add('emailReset', EmailType::class, [
'label' => 'Email<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'mapped' => false,
'constraints' => [
new Email([
'message' => 'Veuillez entrer un email valide',
]),
new NotBlank([
'message' => 'Veuillez entrer un email',
]),
],
'attr' => [
'placeholder' => 'Saisir une adresse email'
]
])
;
}
if($options['sexe'])
{
$builder
->add('sexe', ChoiceType::class, [
'label' => 'Sexe<span class=\'text-danger\'>*</span>',
'label_html'=> true,
'required' => false,
'expanded' => true,
'placeholder' => false,
'choices' => [
'Homme' => 'm',
'Femme' => 'f'
],
'data' => $value,
'placeholder' => false,
'constraints' => [
new NotBlank([
'message' => 'Veuillez saisir un sexe'
])
]
])
;
}
if($options['newsletter'])
{
$builder
->add('newsletter', CheckboxType::class, [
'required' => false,
'mapped' => false,
'label' => 'S\'inscrire à la newsletter ?'
])
;
}
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
'email' => false,
'password' => false,
'nom' => false,
'prenom' => false,
'agree' => false,
'roles' => false,
'update' => false,
'emailReset' => false,
'sexe' => false,
'sexeDefaut' => null,
'newsletter' => false
]);
}
}