<?php
namespace App\Controller;
use App\Entity\Step;
use App\Entity\User;
use App\Entity\Serie;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class IndexController extends AbstractController
{
#[Route('/', name: 'index')]
public function index()
{
$session = [];
if (isset($_SESSION)) {
$session = $_SESSION;
}
return $this->redirectToRoute('app_login', [
"session" => $session,
]);
}
#[Route('/introduction', name: 'introduction')]
public function updateUserInfos(Request $request, ManagerRegistry $manager): Response
{
// Cette méthode de controller permet de créer plusieurs users en un seul formulaire développé au sein de la méthode
// Pour envoyer les users vers la base de données, nous avons besoin de l'Entity Manager
$entityManager = $manager->getManager();
$userRepository = $entityManager->getRepository(User::class);
$stepRepository = $entityManager->getRepository(Step::class);
$arrayAge = [];
$arrayAgeEn = [];
// Nous checkons la langue dans le cookie, s'il n'existe pas, nous le créons en langue française
if (!isset($_COOKIE['lang'])) {
setcookie("lang",'fra',time()+60*60*24*7, "/");
}
$lang = $_COOKIE['lang'];
// Initialisation des choix des menus déroulants en FR
for ($i=16; $i < 65; $i++) {
$arrayAge["$i ans"] = $i ;
}
$arrayAge["65+ ans"] = 65;
// et en ENG
for ($i=16; $i < 65; $i++) {
$arrayAgeEn["$i years old"] = $i ;
}
$arrayAgeEn["65+ years old"] = 65;
// Version formaulaire en Francçais
if ($lang == "fra") {
// Nous créons notre propre formulaire champ par champ
$usersForm = $this->createFormBuilder()
->add('infos', TextType::class, [
'label' => "Veuillez saisir un texte qui vous permettra d'identifier vos résultats. Merci d'éviter d'inscrire votre nom. (26 caractères maximum)",
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Merci de définir un texte',
]),
new Length([
'max' => 26,
'maxMessage' => 'Merci de ne pas dépasser les 26 caractères'
])
],
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-3'
],
"help" => 'Veuillez ne pas dépasser les 26 caractères',
"help_attr" => [
'class' => 'd-none'
],
])
->add('sexe', ChoiceType::class, [
'label' => 'Je suis :',
'required' => true,
'expanded' => false,
'multiple' => false,
'placeholder' => '---',
"choices" => [
'Une femme' => 'F',
'Un homme' => 'H',
],
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-3'
]
])
->add('age', ChoiceType::class, [
'label' => 'J\'ai :',
'required' => true,
'expanded' => false,
'multiple' => false,
'placeholder' => '---',
"choices" => $arrayAge,
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-2'
]
])
->add('valider', SubmitType::class, [
'label' => 'Valider',
'attr' => [
'class' => 'btn btn-sm btn-success btn-valid-qcm col-6 col-lg-2 mb-3',
'style' => 'margin-top:10px;'
]
])
->getForm();
// Version formulaire en Anglais
} else {
// Nous créons notre propre formulaire champ par champ
$usersForm = $this->createFormBuilder()
->add('infos', TextType::class, [
'label' => "Please enter a text to be displayed on all pages, which will help you identify your entries (max 26 characters)",
'required' => true,
'constraints' => [
new NotBlank([
'message' => 'Please enter a text',
]),
new Length([
'max' => 26,
'maxMessage' => 'Please no more than 26 characters'
])
],
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-3'
],
"help" => 'Please no more than 26 characters',
"help_attr" => [
'class' => 'd-none'
],
])
->add('sexe', ChoiceType::class, [
'label' => 'I am :',
'required' => true,
'expanded' => false,
'multiple' => false,
'placeholder' => '---',
"choices" => [
'A woman' => 'F',
'A man' => 'H',
],
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-3'
]
])
->add('age', ChoiceType::class, [
'label' => 'I am :',
'required' => true,
'expanded' => false,
'multiple' => false,
'placeholder' => '---',
"choices" => $arrayAgeEn,
'attr' => [
'class' => 'col-12 col-lg-6 form-control mb-2'
]
])
->add('valider', SubmitType::class, [
'label' => 'Validate',
'attr' => [
'class' => 'btn btn-sm btn-success btn-valid-qcm col-6 col-lg-2 mb-3',
'style' => 'margin-top:10px;'
]
])
->getForm();
}
// Nous appliquons l'objet Request sur notre formulaire
$usersForm->handleRequest($request);
if ($request->isMethod('post') && $usersForm->isValid()) {
$user = $userRepository->find($this->getUser()->getId());
// On récupère les informations de notre formulaire
// La méthode getData() rend un tableau associatif qui possède les valeurs de chaque champ du formulaire, et donc nos cinq users
$data = $usersForm->getData();
$user->setInfos($data['infos']);
$user->setSexe($data['sexe']);
$user->setAge($data['age']);
$entityManager->persist($user);
//Pour l'instant, nous faisons un flush() pour chaque itération de notre tableau, ce qui permet de mettre notre table à jour pour chaque champ
$entityManager->flush();
return $this->redirectToRoute('user_connect');
}
// Si le formulaire n'est pas validé, nous le présentons à l'utilisateur
return $this->render('questionnaire/introduction.html.twig', [
'formName' => 'Création de users',
'dataForm' => $usersForm->createView(),
"lang" => $lang,
]);
}
#[Route('/question', name: 'user_connect')]
public function userConnect(ManagerRegistry $manager)
{
$this->denyAccessUnlessGranted("IS_AUTHENTICATED_FULLY", null, "Access DENIED");
if (!isset($_SESSION)) {
session_start();
}
return $this->redirectToRoute('questionnaire');
}
}