src/Controller/AuteurController.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Auteur;
  4. use App\Entity\LienAuteurLivre;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. class AuteurController extends AbstractController
  10. {
  11. /**
  12. * @Route("/auteurs", name="liste_auteurs")
  13. */
  14. public function listeAuteurs(Request $request): Response
  15. {
  16. $em = $this->getDoctrine()->getManager();
  17. $lettre = $request->query->get('lettre');
  18. $search = $request->query->get('search');
  19. // Récupérer toutes les initiales disponibles
  20. $initiales = $em->getRepository(Auteur::class)->findAllInitiales();
  21. // Si recherche
  22. if ($search) {
  23. $auteurs = $em->getRepository(Auteur::class)->searchAuteurs($search);
  24. $auteursGroupes = [];
  25. foreach ($auteurs as $auteur) {
  26. $initiale = $auteur->getInitiale();
  27. if (!isset($auteursGroupes[$initiale])) {
  28. $auteursGroupes[$initiale] = [];
  29. }
  30. $auteursGroupes[$initiale][] = $auteur;
  31. }
  32. ksort($auteursGroupes);
  33. } elseif ($lettre) {
  34. // Filtrer par lettre
  35. $tousAuteurs = $em->getRepository(Auteur::class)->findAllGroupedByInitiale();
  36. $auteursGroupes = isset($tousAuteurs[$lettre]) ? [$lettre => $tousAuteurs[$lettre]] : [];
  37. } else {
  38. // Tous les auteurs groupés
  39. $auteursGroupes = $em->getRepository(Auteur::class)->findAllGroupedByInitiale();
  40. }
  41. // Compter les livres par auteur
  42. $livresParAuteur = [];
  43. foreach ($auteursGroupes as $initiale => $auteurs) {
  44. foreach ($auteurs as $auteur) {
  45. $count = $em->getRepository(LienAuteurLivre::class)->createQueryBuilder('l')
  46. ->select('COUNT(l.id)')
  47. ->where('l.auteur = :auteur')
  48. ->setParameter('auteur', $auteur)
  49. ->getQuery()
  50. ->getSingleScalarResult();
  51. $livresParAuteur[$auteur->getId()] = $count;
  52. }
  53. }
  54. return $this->render('auteurs/liste.html.twig', [
  55. 'auteursGroupes' => $auteursGroupes,
  56. 'initiales' => $initiales,
  57. 'lettreActive' => $lettre,
  58. 'searchTerm' => $search,
  59. 'livresParAuteur' => $livresParAuteur,
  60. ]);
  61. }
  62. /**
  63. * @Route("/auteur/{id}", name="auteur_detail", requirements={"id"="\d+"})
  64. */
  65. public function detailAuteur(int $id): Response
  66. {
  67. $em = $this->getDoctrine()->getManager();
  68. $auteur = $em->getRepository(Auteur::class)->find($id);
  69. if (!$auteur) {
  70. throw $this->createNotFoundException('Auteur non trouvé');
  71. }
  72. // Récupérer les livres de cet auteur
  73. $liens = $em->getRepository(LienAuteurLivre::class)->findBy(['auteur' => $auteur]);
  74. $livres = [];
  75. $images = [];
  76. foreach ($liens as $lien) {
  77. $livre = $lien->getLivre();
  78. $livres[] = $livre;
  79. if ($livre->getImage()) {
  80. $images[$livre->getId()] = base64_encode(stream_get_contents($livre->getImage()));
  81. }
  82. }
  83. return $this->render('auteurs/detail.html.twig', [
  84. 'auteur' => $auteur,
  85. 'livres' => $livres,
  86. 'images' => $images,
  87. ]);
  88. }
  89. }