src/Controller/QuestionnaireController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Answer;
  4. use App\Entity\Question;
  5. use App\Entity\Rank;
  6. use App\Entity\Respondent;
  7. use App\Entity\User;
  8. use App\Form\AnswerType;
  9. use App\Form\RespondentType;
  10. use App\Form\UserType;
  11. use App\Service\EmailService;
  12. use App\Service\ResultsService;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\RequestStack;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. class QuestionnaireController extends AbstractController
  22. {
  23.     private $doctrine;
  24.     private $requestStack;
  25.     private $passwordHasher;
  26.     private $resultsService;
  27.     private $emailService;
  28.     public function __construct(
  29.         ManagerRegistry $doctrine,
  30.         RequestStack $requestStack,
  31.         UserPasswordHasherInterface $passwordHasher,
  32.         ResultsService $resultsService,
  33.         EmailService $emailService
  34.     )
  35.     {
  36.         $this->doctrine $doctrine;
  37.         $this->requestStack $requestStack;
  38.         $this->passwordHasher $passwordHasher;
  39.         $this->resultsService $resultsService;
  40.         $this->emailService $emailService;
  41.     }
  42.     /**
  43.      * Affiche la page d'intro du questionnaire : formulaire profil du répondent en session
  44.      * @Route("/questionnaire/intro", name="questionnaire_start")
  45.      */
  46.     public function start(Request $request): Response
  47.     {
  48.         $session $this->requestStack->getSession();
  49.         $respondentSlug $session->get('respondentSlug');
  50.         // Initialisation du Respondent (si l'id n'est pas trouvé, on crée un nouveau)
  51.         $respondent null;
  52.         $user null;
  53.         if($respondentSlug){
  54.             $respondent $this->doctrine->getRepository(Respondent::class)->findOneBySlug($respondentSlug);
  55.         }
  56.         // Si aucun Respondent n'est trouvé, créer un nouveau Respondent
  57.         if (null === $respondent) {
  58.             $respondent = new Respondent();
  59.             $user = new User();
  60.         } else {
  61.             // Si un Respondent est trouvé, récupérer l'utilisateur lié
  62.             $user $respondent->getUser();
  63.         }
  64.         $form $this->createForm(UserType::class, $user, [
  65.             'respondent' => $respondent
  66.         ]);
  67.         $postedData $request->request->all();
  68.         $form->handleRequest($request);
  69.         if ($form->isSubmitted() && $form->isValid()) {
  70.             $entityManager $this->doctrine->getManager();
  71.             $existingUser $this->doctrine->getRepository(User::class)->findOneBy(['email' => $user->getEmail()]);
  72.             if(null !== $existingUser){
  73.                 $user $existingUser;
  74.             } else {
  75.                 $user->setPassword($this->passwordHasher->hashPassword($user'password'));
  76.             }
  77.             // Si le Respondent est nouveau, on peut l'initialiser ici
  78.             if(null === $respondent->getStartTime()){
  79.                 $respondent->setStartTime(new \DateTimeImmutable());
  80.             }
  81. //            affecter le rank au respondent
  82.             $rank $form->get('rank')->getData();
  83.             $respondent->setRank($rank);
  84. //            si le respondent n'est pas dans la liste de user on l'ajoute
  85.             if (!$user->getRespondents()->contains($respondent)) {
  86.                 $user->addRespondent($respondent);
  87.                 $respondent->setUser($user);
  88.             }
  89.             $entityManager->persist($respondent);
  90.             $entityManager->persist($user);
  91.             $entityManager->flush();
  92.             // Sauvegarder dans la session l'id du Respondent
  93.             $session->set('respondentSlug'$respondent->getSlug());
  94.             // Redirection vers le questionnaire du rank
  95.             return $this->redirectToRoute('questionnaire_answer', [
  96.                 'slug' => $respondent->getSlug(),
  97.                 'position' => 1,
  98.                 'questionnaire' => $respondent->getRank()->getId()]);
  99.         }
  100.         return $this->render('questionnaire/start.html.twig', [
  101.             'form' => $form->createView()
  102.         ]);
  103.     }
  104.     /**
  105.      * Affiche la question en position $position pour le répondant en session
  106.      * @Route("/questionnaire/repondre/{slug}/{position}/{questionnaire}", name="questionnaire_answer")
  107.      * @ParamConverter("respondent", class="App\Entity\Respondent", options={"mapping": {"slug": "slug"}})
  108.      */
  109.     public function answer(Request $requestRespondent $respondent$position null$questionnaire 1): Response
  110.     {
  111.         $question $this->doctrine->getRepository(Question::class)->findOneBy([
  112.             'position' => $position,
  113.             'questionnaire' => $questionnaire
  114.         ]);
  115.         $nbTotalQuestions $this->doctrine->getRepository(Question::class)->count([]);
  116.         $answer $this->doctrine->getRepository(Answer::class)->findOneByQuestionAndRespondant($question$respondent);
  117.         if(null === $answer){
  118.             $answer = new Answer();
  119.             $answer->setRespondent($respondent);
  120.         }
  121.         $form $this->createForm(AnswerType::class, $answer, ['question' => $question]);
  122.         $form->handleRequest($request);
  123.         if ($form->isSubmitted() && $form->isValid()) {
  124.             $entityManager $this->doctrine->getManager();
  125.             $entityManager->persist($answer);
  126.             $entityManager->flush();
  127.             if($position == $nbTotalQuestions){
  128.                 $respondent->setEndTime(new \DateTimeImmutable());
  129.                 $entityManager->persist($respondent);
  130.                 $entityManager->flush();
  131.                 // on save là et pas dans le results pr save une seule fois
  132.                 $resultsTraining $this->resultsService->calculateResultsTraining($respondent);
  133.                 $trainings $this->resultsService->getTrainings($respondent$resultsTraining);
  134.                 $this->resultsService->saveRespondentTrainings($respondent$trainings);
  135.                 // puis on lui envoi le resultat
  136.                 $this->emailService->sendResultatsEmail($respondent);
  137.                 return $this->redirectToRoute('results', [
  138.                     'slug' => $respondent->getSlug()
  139.                 ]);
  140.             }
  141.             return $this->redirectToRoute('questionnaire_answer', [
  142.                 'slug' => $respondent->getSlug(),
  143.                 'position' => $position+1,
  144.                 'questionnaire' => $respondent->getRank()->getId()
  145.             ]);
  146.         }
  147.         return $this->render('questionnaire/question.html.twig', [
  148.             'question' => $question,
  149.             'position' => $position,
  150.             'nbTotalQuestions' => $nbTotalQuestions,
  151.             'form' => $form->createView(),
  152.             'respondent' => $respondent
  153.         ]);
  154.     }
  155. }