src/Form/UserType.php line 56
<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use Vich\UploaderBundle\Form\Type\VichFileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\File;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Form\Extension\Core\Type\TelType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class UserFormSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
FormEvents::SUBMIT => 'onSubmit',
];
}
public function onSubmit(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
$user = $form->getData();
$password = $form->get('password')->getData();
$passwordConfirmed = $form->get('password_confirmed')->getData();
if ($password && $password === $passwordConfirmed) {
$user->setPassword($password);
} else {
$form->get('password')->addError(new FormError('Les mots de passe ne correspondent pas'));
}
$event->setData($data);
}
}
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('email', EmailType::class, [
'attr' => [
'placeholder' => "exemple@domaine.com",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Adresse email*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'error_bubbling' => false,
'constraints' => [
new Email(['mode' => 'strict']),
new NotBlank([
'message' => 'L\'adresse email est obligatoire'
]),
]
])
->add('roles', ChoiceType::class, [
"choices" => [
"ADMIN" => "ROLE_ADMIN",
"COMMERCE" => "ROLE_COMMERCE",
"USER" => "ROLE_USER"
],
'multiple' => true,
'expanded' => true,
'attr' => ['hidden' => true],
'data' => ['ROLE_COMMERCE']
])
->add('password', PasswordType::class, [
"attr" => [
"placeholder" => "votre mot de passe",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Mot de passe*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
"mapped" => false,
'constraints' => [
new NotBlank(),
new Regex(
"/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/",
"Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"
),
]
])
->add('password_confirmed', PasswordType::class, [
"attr" => [
"placeholder" => "veuillez confirmer le mot de passe",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Confirmez le mot de passe*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
"mapped" => false,
'constraints' => [
new NotBlank(),
new Regex(
"/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/",
"Le mot de passe doit contenir au minimum 8 caractères, une majuscule, un chiffre et un caractère spécial"
),
]
])
->add('firstName', TextType::class, [
'attr' => [
'placeholder' => "votre prénom",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Prénom*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'constraints' => [
new NotBlank([
'message' => 'Le prénom est obligatoire'
])
]
])
->add('lastName', TextType::class, [
'attr' => [
'placeholder' => "votre nom",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Nom*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'constraints' => [
new NotBlank([
'message' => 'Le nom est obligatoire'
])
]
])
->add('picture', VichFileType::class, [
'attr' => [
'class' => 'hidden'
],
'label' => 'Photo de profil',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'mapped' => false,
'required' => false,
'constraints' => [
new Assert\Image([
'maxSize' => '5M',
'mimeTypes' => [
'image/jpeg',
'image/png',
'image/webp',
],
'mimeTypesMessage' => 'Veuillez uploader une image valide (jpeg, png ou webp)',
])
]
])
->add('phoneNumber', TelType::class, [
'attr' => [
'placeholder' => "06 00 00 00 00",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Numéro de téléphone*',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'constraints' => [
new Assert\Regex([
'pattern' => '/^\+?\d{1,3}[- ]?\d{2,4}[- ]?\d{2,4}[- ]?\d{2,4}$/',
'message' => 'Le numéro de téléphone n\'est pas valide.'
]),
new NotBlank([
'message' => 'Le numéro de téléphone est obligatoire'
]),
]
])
->add('about', TextareaType::class, [
'attr' => [
'placeholder' => "parlez-nous de vous...",
'class' => 'border border-gray-200 dark:border-gray-800 dark:text-gray-300 rounded-lg pl-4 dark:bg-foreground py-[15px] shadow-input hover:border hover:border-blue-200 focus:border-blue-200 focus:outline-none w-full mb-1'
],
'label' => 'Présentation',
'label_attr' => [
'class' => 'text-base text-gray-700 dark:text-gray-200 block mb-3'
],
'required' => false
])
;
// Ajouter l'abonnement à l'événement FormEvents::SUBMIT
$builder->addEventSubscriber(new UserFormSubscriber());
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}