templates/theme/default/component-blocks/gallery-block.html.twig line 1

Open in your IDE?
  1. {% set parametre = ParametreSite() %}
  2. {% if bloc.model == "2" %}
  3. <div id="modele-galerie-custom-{{bloc.id}}" class="modele-galerie-custom">
  4. <div class="container-fluid content-wrapper">
  5. {% if bloc.title is defined and bloc.title is not empty or bloc.content is defined and bloc.content is not empty %}
  6. <div class="text-center mb-4">
  7. {% if bloc.title is defined and bloc.title is not empty %}
  8. <h2 data-aos="fade-up" data-aos-easing="linear">{{bloc.title}}</h2>
  9. {% endif %}
  10. {% if bloc.content is defined and bloc.content is not empty %}
  11. <div clas s="content">{{bloc.content|raw}}</div>
  12. {% endif %}
  13. </div>
  14. {% endif %}
  15. <div class="list-galerie owl-carousel">
  16. {% for key,item in bloc.galleries %}
  17. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  18. <div class="item-img">
  19. <a class="fancybox" data-fancybox="isotop_zoom" data-caption="{{parametre.titre|default('')}}" href="{{image_item}}">
  20. <span class="img-item lazyload" data-bgset="{{image_item}}">
  21. <img alt="{{item.titre|default('')}}" title="{{item.titre|default('')}}" src="{{image_item}}" />
  22. <span class="badge">
  23. {% if key % 2 == 0 %}
  24. Avant
  25. {% else %}
  26. Après
  27. {% endif %}
  28. </span>
  29. </span>
  30. </a>
  31. </div>
  32. {% endfor %}
  33. </div>
  34. </div>
  35. </div>
  36. {# Default modele gallerie #}
  37. {# <div class="modele-galerie-5 py-5">
  38. <div class="container-fluid content-wrapper">
  39. <div class="list-galerie">
  40. {% for key,item in bloc.galleries %}
  41. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  42. <div class="item-galerie">
  43. <span class="img-item lazyload" data-bgset="{{image_item}}">
  44. <img alt="{{parametre.titre|default('')}}" title="{{parametre.titre|default('')}}" src="{{image_item}}" />
  45. </span>
  46. <a class="fancybox" data-fancybox="isotop_zoom" data-caption="{{parametre.titre|default('')}}" href="{{image_item}}">
  47. <span class="title-galerie">{{parametre.titre|default('')}}</span>
  48. </a>
  49. </div>
  50. {% endfor %}
  51. </div>
  52. </div>
  53. </div> #}
  54. {% endif %}
  55. {# Default modele owl #}
  56. {% if bloc.model == "1" %}
  57. <div id="modele-galerie-owl-{{bloc.id}}" class="modele-galerie-owl">
  58. <div class="container-fluid content-wrapper">
  59. {% if bloc.title is defined and bloc.title is not empty or bloc.content is defined and bloc.content is not empty %}
  60. <div class="text-center mb-4">
  61. {% if bloc.title is defined and bloc.title is not empty %}
  62. <h2 data-aos="fade-up" data-aos-easing="linear">{{bloc.title}}</h2>
  63. {% endif %}
  64. {% if bloc.content is defined and bloc.content is not empty %}
  65. <div class="content">{{bloc.content|raw}}</div>
  66. {% endif %}
  67. </div>
  68. {% endif %}
  69. <div class="list-galerie owl-carousel">
  70. {% for key,item in bloc.galleries %}
  71. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  72. <div class="item-img">
  73. <a class="fancybox" data-fancybox="isotop_zoom" data-caption="{{parametre.titre|default('')}}" href="{{image_item}}">
  74. <span class="img-item lazyload" data-bgset="{{image_item}}">
  75. <img alt="{{item.titre|default('')}}" title="{{item.titre|default('')}}" src="{{image_item}}" />
  76. </span>
  77. </a>
  78. </div>
  79. {% endfor %}
  80. </div>
  81. </div>
  82. </div>
  83. {% endif %}
  84. {% if bloc.model == "3" %}
  85. <div id="modele-galerie-owl-{{bloc.id}}" class="modele-galerie-owl">
  86. <div class="container-fluid content-wrapper">
  87. {% if bloc.title is defined and bloc.title is not empty or bloc.content is defined and bloc.content is not empty %}
  88. <div class="text-center mb-4">
  89. {% if bloc.title is defined and bloc.title is not empty %}
  90. <h2 data-aos="fade-up" data-aos-easing="linear">{{bloc.title}}</h2>
  91. {% endif %}
  92. {% if bloc.content is defined and bloc.content is not empty %}
  93. <div class="content">{{bloc.content|raw}}</div>
  94. {% endif %}
  95. </div>
  96. {% endif %}
  97. <div class="row list-galerie text-center justify-content-center">
  98. {% for key,item in bloc.galleries %}
  99. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  100. <div class="col-lg-3 col-sm-6">
  101. <a class="fancybox pb-4" data-fancybox="isotop_zoom" data-caption="{{parametre.titre|default('')}}" href="{{image_item}}">
  102. <span class="img-item lazyload" data-bgset="{{image_item}}">
  103. <img alt="{{item.titre|default('')}}" title="{{item.titre|default('')}}" src="{{image_item}}" />
  104. </span>
  105. </a>
  106. </div>
  107. {% endfor %}
  108. </div>
  109. </div>
  110. </div>
  111. {% endif %}
  112. {% if bloc.model == "4" %}
  113. <!-- Premier bloc -->
  114. <section id="modele-galerie-carousel-{{bloc.id}}" class="modele-galerie-carousel" data-block-id="block1">
  115. <div class="container-fluid content-wrapper">
  116. <div class="row align-items-center">
  117. {% if bloc.title is defined and bloc.title is not empty or bloc.content is defined and bloc.content is not empty %}
  118. <div {% if bloc.galleries is empty %} class="col-12" {% else %} class="col-xl-6" {% endif %}>
  119. <div class="bloc-content">
  120. <div class="mb-4">
  121. {% if parametre.actiftitre %}
  122. <div class="site-title">{{ parametre.titre }}</div>
  123. {% endif %}
  124. {% if bloc.title is defined and bloc.title is not empty %}
  125. <h2 data-aos="fade-up" data-aos-easing="linear">{{bloc.title}}</h2>
  126. {% endif %}
  127. {% if bloc.content is defined and bloc.content is not empty %}
  128. <div class="content">{{bloc.content|raw}}</div>
  129. {% endif %}
  130. </div>
  131. </div>
  132. </div>
  133. {% endif %}
  134. <div {% if bloc.title is empty and bloc.content is empty %} class="col-12" {% else %} class="col-xl-6" {% endif %}>
  135. <div class="carousel-container">
  136. <div id="carousel-{{ bloc.id|default('1') }}" class="carousel slide">
  137. <div class="carousel-inner">
  138. {% for key,item in bloc.galleries %}
  139. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  140. <div class="carousel-item {% if key == 0 %}active{% endif %}" data-index="{{ key }}">
  141. <img class="d-block w-100" alt="{{item.titre|default('')}}" src="{{image_item}}" />
  142. </div>
  143. {% endfor %}
  144. </div>
  145. <button class="carousel-control-prev" type="button" data-bs-target="#carousel-{{ bloc.id|default('1') }}" data-bs-slide="prev">
  146. <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  147. <span class="visually-hidden">Précédent</span>
  148. </button>
  149. <button class="carousel-control-next" type="button" data-bs-target="#carousel-{{ bloc.id|default('1') }}" data-bs-slide="next">
  150. <span class="carousel-control-next-icon" aria-hidden="true"></span>
  151. <span class="visually-hidden">Suivant</span>
  152. </button>
  153. </div>
  154. <!-- Nouveau système de vignettes avec mini-carrousel -->
  155. <div class="thumbnail-carousel-container">
  156. <button class="thumbnail-nav prev" data-thumbnail-carousel="carousel-{{ bloc.id|default('1') }}">&#10094;</button>
  157. <div class="thumbnail-track" data-thumbnail-track="carousel-{{ bloc.id|default('1') }}">
  158. {% for key,item in bloc.galleries %}
  159. {% set image_item = asset_image('/images'~ item.path,'medium',['800x/uploads','640x/uploads','480x/uploads']) %}
  160. <img class="thumbnail {% if key == 0 %}active{% endif %}"
  161. data-carousel-id="carousel-{{ bloc.id|default('1') }}"
  162. data-slide-to="{{ key }}"
  163. alt="{{item.titre|default('')}}"
  164. title="{{item.titre|default('')}}"
  165. src="{{image_item}}" />
  166. {% endfor %}
  167. </div>
  168. <button class="thumbnail-nav next" data-thumbnail-carousel="carousel-{{ bloc.id|default('1') }}">&#10095;</button>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. </section>
  175. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
  176. <script>
  177. // Fonction pour initialiser un mini-carrousel de vignettes
  178. function initThumbnailCarousel(carouselId) {
  179. const container = document.querySelector(`[data-thumbnail-carousel="${carouselId}"].prev`)?.closest('.thumbnail-carousel-container');
  180. if (!container) return null;
  181. const track = container.querySelector('.thumbnail-track');
  182. const prevBtn = container.querySelector('.thumbnail-nav.prev');
  183. const nextBtn = container.querySelector('.thumbnail-nav.next');
  184. const thumbnails = track.querySelectorAll('.thumbnail');
  185. if (thumbnails.length === 0) return null;
  186. let currentPosition = 0;
  187. const thumbnailsPerView = 4; // Nombre de vignettes visibles
  188. const containerWidth = container.offsetWidth;
  189. const thumbnailWidth = containerWidth / thumbnailsPerView;
  190. const maxPosition = Math.max(0, (thumbnails.length - thumbnailsPerView) * thumbnailWidth);
  191. // Fonction pour centrer la vignette active
  192. const centerActiveThumbnail = function(activeIndex) {
  193. const thumbPosition = activeIndex * thumbnailWidth;
  194. // Si la vignette n'est pas visible, on centre
  195. if (thumbPosition < currentPosition || thumbPosition > currentPosition + containerWidth - thumbnailWidth) {
  196. currentPosition = Math.max(0, thumbPosition - (containerWidth / 2) + (thumbnailWidth / 2));
  197. currentPosition = Math.min(maxPosition, currentPosition);
  198. moveTrack();
  199. }
  200. };
  201. // Mettre à jour l'état des boutons de navigation
  202. function updateNavButtons() {
  203. if (prevBtn) prevBtn.disabled = currentPosition === 0;
  204. if (nextBtn) nextBtn.disabled = currentPosition >= maxPosition;
  205. }
  206. // Déplacer le track
  207. function moveTrack() {
  208. track.style.transform = `translateX(-${currentPosition}px)`;
  209. updateNavButtons();
  210. }
  211. // Événements pour les boutons de navigation
  212. if (prevBtn) {
  213. prevBtn.addEventListener('click', () => {
  214. currentPosition = Math.max(0, currentPosition - thumbnailWidth);
  215. moveTrack();
  216. });
  217. }
  218. if (nextBtn) {
  219. nextBtn.addEventListener('click', () => {
  220. currentPosition = Math.min(maxPosition, currentPosition + thumbnailWidth);
  221. moveTrack();
  222. });
  223. }
  224. // Initialiser l'état des boutons
  225. updateNavButtons();
  226. // Centrer la première vignette active
  227. const activeThumb = track.querySelector('.thumbnail.active');
  228. if (activeThumb) {
  229. const activeIndex = [...thumbnails].indexOf(activeThumb);
  230. centerActiveThumbnail(activeIndex);
  231. }
  232. // Retourner la fonction pour qu'elle puisse être utilisée ailleurs
  233. return centerActiveThumbnail;
  234. }
  235. // Gestionnaire pour tous les carrousels de la page
  236. document.addEventListener('DOMContentLoaded', function() {
  237. // Vérifier si Bootstrap est disponible
  238. if (typeof bootstrap === 'undefined') {
  239. console.error('Bootstrap non chargé. Vérifiez que le script Bootstrap est inclus avant ce script.');
  240. return;
  241. }
  242. // Initialiser tous les carrousels
  243. const carousels = document.querySelectorAll('.carousel');
  244. carousels.forEach(carousel => {
  245. const carouselId = carousel.id;
  246. const thumbnails = document.querySelectorAll(`[data-carousel-id="${carouselId}"]`);
  247. // Initialiser le mini-carrousel de vignettes et récupérer la fonction de centrage
  248. const centerActiveThumbnail = initThumbnailCarousel(carouselId);
  249. // Événement lorsque le carrousel change de slide
  250. carousel.addEventListener('slid.bs.carousel', function() {
  251. const activeIndex = [...carousel.querySelectorAll('.carousel-item')].findIndex(item => item.classList.contains('active'));
  252. // Mettre à jour les vignettes correspondantes
  253. thumbnails.forEach((thumb, index) => {
  254. if (index === activeIndex) {
  255. thumb.classList.add('active');
  256. } else {
  257. thumb.classList.remove('active');
  258. }
  259. });
  260. // Centrer la vignette active dans le mini-carrousel
  261. if (centerActiveThumbnail) {
  262. centerActiveThumbnail(activeIndex);
  263. }
  264. });
  265. // Ajout d'un événement de clic sur les vignettes pour navigation
  266. thumbnails.forEach(thumb => {
  267. thumb.addEventListener('click', function() {
  268. const index = parseInt(this.getAttribute('data-slide-to'));
  269. try {
  270. const carouselInstance = bootstrap.Carousel.getOrCreateInstance(carousel);
  271. carouselInstance.to(index);
  272. } catch (error) {
  273. console.error('Erreur lors de la navigation du carrousel:', error);
  274. // Fallback manuel si Bootstrap n'est pas disponible
  275. const items = carousel.querySelectorAll('.carousel-item');
  276. items.forEach(item => item.classList.remove('active'));
  277. if (items[index]) {
  278. items[index].classList.add('active');
  279. }
  280. }
  281. });
  282. });
  283. });
  284. });
  285. </script>
  286. </script>
  287. {% endif %}