src/Controller/Front/ExamController.php line 48

  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\Exam;
  4. use App\Repository\CategorieRepository;
  5. use App\Repository\ClasseRepository;
  6. use App\Repository\ExamRepository;
  7. use App\Repository\PersonneRepository;
  8. use App\Repository\SkillLevelRepository;
  9. use App\Repository\UserRepository;
  10. use Knp\Component\Pager\PaginatorInterface;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. class ExamController extends AbstractController
  16. {
  17.     #[Route('/exams'name'app_front_exam_index')]
  18.     public function index(Request $requestCategorieRepository $categorieRepositorySkillLevelRepository $skillLevelRepositoryClasseRepository $classeRepositoryExamRepository $examRepositoryPaginatorInterface $paginatorInterface): Response
  19.     {
  20.         $categoryName $request->query->get('category') === 'all' null $request->query->get('category');
  21.         $classeName $request->query->get('classe') === 'all' null $request->query->get('classe');
  22.         $skillName $request->query->get('skill') === 'all' null $request->query->get('skill');
  23.         $language $request->query->get('language') === 'all' null $request->query->get('language');
  24.         $category $categorieRepository->findOneBy(['slug' => $categoryName]);
  25.         $classe $classeRepository->findOneBy(['slug' => $classeName]);
  26.         $skillLevel $skillLevelRepository->findOneBy(['slug' => $skillName]);
  27.         $exams $examRepository->findByFilter($language$category$classe$skillLevel);
  28.         return $this->render('front/exam/index.html.twig', [
  29.             'isExamPage' => true,
  30.             'exams' => $paginatorInterface->paginate($exams$request->query->getInt('page'1), 10),
  31.             'categories' => $categorieRepository->findAll(),
  32.             'classes' => $classeRepository->findAll(),
  33.             'skillLevels' => $skillLevelRepository->findAll(),
  34.             'sCategory' => $category,
  35.             'sClasse' => $classe,
  36.             'language' => $language,
  37.             'skillLevel' => $skillLevel,
  38.             
  39.         ]);
  40.     }
  41.     #[Route('/exam/{reference}/show'name'app_front_exam_show')]
  42.     public function show(Request $requestExam $examPersonneRepository $personneRepository): Response
  43.     {
  44.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  45.         $personne $personneRepository->findOneBy(['utilisateur' => $this->getUser()]);
  46.         if (!$personne) {
  47.             throw $this->createAccessDeniedException();
  48.         }
  49.         $eleve $personne->getUtilisateur()->getEleve();
  50.         if ($eleve && !$eleve->isIsPremium()) {
  51.             throw $this->createAccessDeniedException("Vous devez être premium!");
  52.         }
  53.         return $this->render('front/exam/show.html.twig', [
  54.             'exam' => $exam,
  55.             'isExamPage' => true,
  56.             'display' => $request->query->get('display''subject'),
  57.             'data' => $request->query->get('display''subject') === 'correction' $exam->getCorrection() : $exam->getSujet(),
  58.             
  59.         ]);
  60.     }
  61.     
  62.     #[Route('/exam/file/{filename}'name'app_exam_file')]
  63. public function servePdfFile(string $filename): Response
  64. {
  65.     $filePath $this->getParameter('kernel.project_dir') . '/uploads/media/exams/files/' $filename;
  66.     if (!file_exists($filePath)) {
  67.         throw $this->createNotFoundException("Fichier introuvable.");
  68.     }
  69.     return new Response(file_get_contents($filePath), 200, [
  70.         'Content-Type' => 'application/pdf',
  71.         'Content-Disposition' => 'inline'// Empêche le téléchargement en forçant l'affichage
  72.         'X-Content-Type-Options' => 'nosniff',
  73.         'Cache-Control' => 'no-store, no-cache, must-revalidate, max-age=0',
  74.         'Pragma' => 'no-cache',
  75.     ]);
  76. }
  77. }