templates/includes/tableauLivres.html.twig line 1

Open in your IDE?
  1. <div id="tableBook">
  2. {% set queryParams = app.request.query.all %}
  3. {% set order = app.request.query.get('order') | default('') %}
  4. {% if order != '' and order == 'asc' %}
  5. {% set order = 'desc' %}
  6. {% else %}
  7. {% set order = 'asc' %}
  8. {% endif %}
  9. <!-- Options de tri -->
  10. <div class="d-flex justify-content-between align-items-center mb-3 flex-wrap">
  11. <div class="text-muted small">
  12. <i class="fas fa-book"></i> {{ Listelivres|length }} livre(s) affiché(s)
  13. </div>
  14. <div class="btn-group btn-group-sm">
  15. <a href="{{ path('listesLivres', queryParams|merge({'order': order, 'sort' : 'l.titre'})) }}"
  16. class="btn {% if app.request.query.get('sort') == 'l.titre' %}btn-primary{% else %}btn-outline-primary{% endif %}">
  17. <i class="fas fa-sort-alpha-down"></i> Titre
  18. </a>
  19. </div>
  20. </div>
  21. <!-- Grille de livres -->
  22. <div class="row">
  23. {% for livre in Listelivres %}
  24. <div class="col-6 col-md-4 col-lg-3 col-xl-2 mb-4">
  25. <div class="card h-100 livre-card shadow-sm">
  26. <!-- Image -->
  27. <div class="livre-cover-wrapper text-center p-2" style="background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%);">
  28. {% if livre.id in images|keys %}
  29. <img id='img-{{ livre.id }}'
  30. class="img-cover img-fluid"
  31. alt="{{ livre.titre }}"
  32. src="data:image/png;base64,{{ images[livre.id] }}"
  33. style="max-height: 180px; object-fit: contain; cursor: pointer;" />
  34. {% else %}
  35. <div class="d-flex align-items-center justify-content-center" style="height: 180px;">
  36. <i class="fas fa-book fa-4x text-muted"></i>
  37. </div>
  38. {% endif %}
  39. </div>
  40. <!-- Corps de la card -->
  41. <div class="card-body p-2">
  42. <h6 class="card-title mb-1">
  43. <a href="{{ path('livreDetail', {'id': livre.id}) }}" class="text-dark text-decoration-none livre-titre">
  44. {{ livre.titre|length > 40 ? livre.titre|slice(0, 40) ~ '...' : livre.titre }}
  45. </a>
  46. </h6>
  47. {% if livre.tome and livre.tome > 0 %}
  48. <span class="badge badge-secondary badge-sm mb-1">Tome {{ livre.tome }}</span>
  49. {% endif %}
  50. <!-- Auteurs -->
  51. <p class="card-text small text-muted mb-1">
  52. <i class="fas fa-pen-fancy"></i>
  53. {% set nb = 0 %}
  54. {% for auteur in livre.listeAuteur %}
  55. {% if nb > 0 %}, {% endif %}
  56. {% if nb < 2 %}{{ auteur.auteur.nom }}{% endif %}
  57. {% set nb = nb + 1 %}
  58. {% endfor %}
  59. {% if nb > 2 %}...{% endif %}
  60. </p>
  61. <!-- Éditeur -->
  62. {% if livre.edition %}
  63. <p class="card-text small text-muted mb-1">
  64. <i class="fas fa-building"></i> {{ livre.edition.nom|length > 20 ? livre.edition.nom|slice(0, 20) ~ '...' : livre.edition.nom }}
  65. </p>
  66. {% endif %}
  67. </div>
  68. <!-- Footer -->
  69. <div class="card-footer bg-white border-top-0 p-2 pt-0">
  70. <div class="d-flex justify-content-between align-items-center">
  71. <span class="badge badge-primary">{{ livre.prixBase|number_format(2) }} €</span>
  72. <a href="{{ path('livreDetail', {'id': livre.id}) }}" class="btn btn-sm btn-outline-primary">
  73. <i class="fas fa-eye"></i>
  74. </a>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. {% endfor %}
  80. </div>
  81. <!-- Pagination -->
  82. <div class="d-flex justify-content-center mt-4">
  83. {{ knp_pagination_render(pagination) }}
  84. </div>
  85. </div>
  86. <!-- The Image Modal -->
  87. <div id="myModal" class="image-modal">
  88. <span class="image-modal-close">&times;</span>
  89. <img class="image-modal-content" id="img01">
  90. <div id="caption"></div>
  91. </div>
  92. <style>
  93. .livre-card {
  94. transition: transform 0.2s, box-shadow 0.2s;
  95. border: 1px solid #e9ecef;
  96. }
  97. .livre-card:hover {
  98. transform: translateY(-5px);
  99. box-shadow: 0 8px 25px rgba(0,0,0,0.15) !important;
  100. }
  101. .livre-titre:hover {
  102. color: #667eea !important;
  103. }
  104. .livre-cover-wrapper {
  105. border-radius: 0.25rem 0.25rem 0 0;
  106. min-height: 180px;
  107. }
  108. </style>