<?php
/*
* Ce fichier est la propriété de l'association (c) Projets Métiers
*
* (c) crée par Jean-Marc CATALA <jeanmmarccatala@gmail.com>
*
*/
namespace App\Form;
use App\Entity\Institution;
use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityRepository;
use phpDocumentor\Reflection\Types\Null_;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
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\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use function date_date_set;
use function dd;
use function in_array;
class RegistrationFormType extends AbstractType
{
/**
* @var UserRepository
*/
private $userRepository;
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$allowedFields = [];
$role = $options['which_role'];
if ($role === User::ROLE_COLLEGE) {
$allowedFields = ['cp', 'institution', 'classe', 'expert', 'emailParent', 'profPrincipal'];
}
if ($role === User::ROLE_LYCEE) {
$allowedFields = ['cp', 'institution', 'classe', 'expert', 'emailParent', 'profPrincipal'];
}
if ($role === User::ROLE_ADULTE) {
$allowedFields = ['cp', 'institution', 'expert', 'conseille'];
}
if ($role === User::ROLE_PROF) {
$allowedFields = ['cp', 'institution', 'expert'];
}
if ($role === User::ROLE_PARENT) {
$allowedFields = ['emailEnfant'];
}
if ($role === User::ROLE_CONSEILLER) {
$allowedFields = ['cp', 'institution', 'expert'];
}
if ($role === User::ROLE_MENTOR) {
$allowedFields = ['cp', 'institution', 'expert'];
}
$builder
->add('email')
->add('name', TextType::class, array('label' => 'Prénom'))
->add('firstName', TextType::class, array('label' => 'Nom'))
->add('agreeTerms', CheckboxType::class, [
'mapped' => false,
'label' => "j'accepte les condition générales d'utilisation",
'label_attr' => ["class" => 'checkbox-custom'],
'constraints' => [
new IsTrue([
'message' => 'vous devez accepter notre charte.',
]),
],
])
->add('plainPassword', RepeatedType::class, [
// instead of being set onto the object directly,
// this is read and encoded in the controller
'mapped' => false,
'type' => PasswordType::class,
'invalid_message' => 'Les deux mots de passe doivent être identiques.',
'first_options' => ['label' => 'Mot de passe'],
'second_options' => ['label' => 'Répéter le mot de passe'],
'constraints' => [
new NotBlank([
'message' => 'Entrez votre mot de passe',
]),
new Length([
'min' => 3,
'minMessage' => 'Le mot de passe doit dépasser {{ limit }} caractères',
// max length allowed by Symfony for security reasons
'max' => 4096,
]),
],
]);
if (in_array('cp', $allowedFields)) {
$builder->add('cp', TextType::class, [
'label' => 'Code postal de l’établissement',
'mapped' => false,
'required' => false
]);
}
if (in_array('profPrincipal', $allowedFields)) {
$builder
->add('profPrincipal', EntityType::class, [
'class' => User::class,
'label' => 'Professeur référent',
'required' => false,
'query_builder' => function (EntityRepository $er) {
$build = $er->createQueryBuilder('u')
->andWhere('u.roles LIKE :role')
->setParameter('role', "%" . User::ROLE_PROF . "%");
//dd($build);
return $build;
},
'choice_label' => 'fullName',
'placeholder' => 'Choisir',
'choice_attr' => function ($choice, $key, $value) {
/*
$listeProf = $choice->getInstitution()->getId();
$test = ['data-institution-id' => $listeProf ,
'class'=>'d-none'];
//dd($test);
*/
$listeProf = $choice->getInstitution()->getId();
//dd($listeProf);
return ['data-institution-id' => $listeProf,
'class' => 'd-none'];
},
]);
}
if (in_array('conseille', $allowedFields)) {
$builder
->add('conseille', EntityType::class, [
'class' => User::class,
'label' => 'Conseiller',
'required' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->andWhere('u.roles LIKE :role')
->setParameter('role', "%" . User::ROLE_CONSEILLER . "%");
},
'choice_label' => 'fullName',
'placeholder' => 'Choisir',
'choice_attr' => function ($choice, $key, $value) {
//dd($choice, $key, $value);
$listeConseille = $choice->getInstitution()->getId();
//dd($listeConseille);
return ['data-institution-id' => $choice->getInstitution()->getId(),
'class' => 'd-none'];
},
]);
}
if (in_array('institution', $allowedFields)) {
$builder->add('institution', EntityType::class, [
'label' => 'Institution',
'help' => ' ',
'help_html' => true,
'mapped' => false,
'required' => false,
'class' => Institution::class,
'query_builder' => function (EntityRepository $er) use ($role) {
return $er->createQueryBuilder('i')
->andWhere('i.type IN (:type)')
->setParameter('type', Institution::convertTypeStringToConst($role));
},
'choice_label' => 'title',
'choice_attr' => function ($choice, $key, $value) {
return ['data-cp' => $choice->getCp(),
'data-expert' => $choice->getExpert(),
'class' => 'd-none'];
},
'placeholder' => 'Choisir',
'row_attr' => ['class' => 'd-none'],
'attr' => ['max' => 5]
]);
}
if (in_array('expert', $allowedFields)) {
$builder->add('expert', TextType::class, [
'label' => 'Votre code référent (expert métiers, référent PEP, référent FCPE…)',
'mapped' => false,
'required' => false,
'row_attr' => ['class' => 'd-none']
]);
}
if (in_array('classe', $allowedFields)) {
if ($role === User::ROLE_COLLEGE) {
$builder->add('classe', ChoiceType::class, [
'placeholder' => 'Choisir',
"attr" => [
"class" => "registerForm",
],
'choices' => [
'6ème' => '6ème',
'5ème' => '5ème',
'4ème' => '4ème',
'3ème' => '3ème',
],
'choice_attr' => [
'6ème' => ['class' => 'choixMultiple'],
'5ème' => ['class' => 'choixMultiple'],
'4ème' => ['class' => 'choixMultiple'],
'3ème' => ['class' => 'choixMultiple'],
],
]);
}
if ($role === User::ROLE_LYCEE) {
$builder->add('classe', ChoiceType::class, [
'placeholder' => 'Choisir',
"attr" => [
"class" => "registerForm",
],
'choices' => [
'2nde' => '2nde',
'1ère' => '1ère',
'Terminale' => 'Terminale',
],
'choice_attr' => [
'2nde' => ['class' => 'choixMultiple'],
'1ère' => ['class' => 'choixMultiple'],
'Terminale' => ['class' => 'choixMultiple'],
],
]);
}
}
if ($role === User::ROLE_LYCEE) {
$label1 = "Email parent 1 (ce champ n'est pas obligatoire)";
$required = false;
}
if ($role === User::ROLE_COLLEGE) {
$label1 = "Email parent 1";
$required = true;
}
if (in_array('emailParent', $allowedFields)) {
$builder
->add('emailParent1', EmailType::class, [
'label' => $label1,
'required' => $required,
])
->add('emailParent2', EmailType::class, [
'label' => "Email parent 2, (ce champ n'est pas obligatoire)",
'required' => false,
]);
}
if (in_array('emailEnfant', $allowedFields)) {
$builder
->add('emailEnfant', EmailType::class, [
'label' => 'Email étudiant',
'required' => true,
'mapped' => false,
]);
}
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options) {
$form = $event->getForm();
if ($form->has('emailEnfant')) {
$form->get('emailEnfant')->setData($options['emailEnfant']);
}
});
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
$form = $event->getForm();
$user = $event->getData();
/** @var User $user */
if ($form->has('expert')) {
$expert = $form->get('expert')->getData();
$cp = $form->get('cp')->getData();
$institution = $form->get('institution')->getData();
if ($institution->getExpert() !== $expert or $institution->getCp() !== $cp) {
$form->get('cp')->addError(new FormError('Le code postal et le référent ne correspondent pas'));
}
}
if ($user->hasRole(User::ROLE_PARENT)) {
$enfant = $this->userRepository->findChildFromParentEmail($form->get('emailEnfant')->getData(), $user->getEmail());
if ($enfant) {
$user->addEnfant($enfant);
} else {
$form->get('emailEnfant')->addError(new FormError("Nous n'avons pas trouvé d'email correspondant"));
}
}
});
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'which_role' => null,
'emailEnfant' => null
]);
}
}