templates/pages/_includes/details/_gallery-viewer.html.twig line 1

Open in your IDE?
  1. {% set stopoverMedias = stopoversMedias|default(stopoverMedias|default([])) %}
  2. {% set shipMediasPool = shipMedias|default([]) %}
  3. {% set allMediasPool = [] %}
  4. {% if allMedias is defined and allMedias is iterable %}
  5. {% if allMedias.ship is defined or allMedias.stopovers is defined or allMedias.cabinTypes is defined %}
  6. {% set allMediasPool = allMediasPool
  7. |merge(allMedias.ship|default([]))
  8. |merge(allMedias.stopovers|default([]))
  9. |merge(allMedias.cabinTypes|default([]))
  10. %}
  11. {% else %}
  12. {% set allMediasPool = allMedias %}
  13. {% endif %}
  14. {% endif %}
  15. {# Pools simplifiés : on exclut uniquement les médias de type lien #}
  16. {% set stopoverPool = [] %}
  17. {% for media in stopoverMedias %}
  18. {% if media.extension|default('')|lower != 'link' and (media.cdnUrl is not empty or media.url is not empty) %}
  19. {% set stopoverPool = stopoverPool|merge([media]) %}
  20. {% endif %}
  21. {% endfor %}
  22. {% set shipPool = [] %}
  23. {% for media in shipMediasPool %}
  24. {% if media.extension|default('')|lower != 'link' and (media.cdnUrl is not empty or media.url is not empty) %}
  25. {% set shipPool = shipPool|merge([media]) %}
  26. {% endif %}
  27. {% endfor %}
  28. {% set allPool = [] %}
  29. {% for media in allMediasPool %}
  30. {% if media.extension|default('')|lower != 'link' and (media.cdnUrl is not empty or media.url is not empty) %}
  31. {% set allPool = allPool|merge([media]) %}
  32. {% endif %}
  33. {% endfor %}
  34. {% set usedMediaKeys = [] %}
  35. {% set selectedImages = [] %}
  36. {# 1) Stopover aléatoire #}
  37. {% if stopoverPool is not empty %}
  38. {% set firstImage = (stopoverPool|shuffle)|first %}
  39. {% set firstImageKey = firstImage.id|default(firstImage.cdnUrl|default(firstImage.url|default(''))) %}
  40. {% set selectedImages = selectedImages|merge([{ media: firstImage, category: 'stopovers' }]) %}
  41. {% set usedMediaKeys = usedMediaKeys|merge([firstImageKey]) %}
  42. {% endif %}
  43. {# 2) Ship tag main -> ship aléatoire -> allMedias aléatoire (non utilisée) #}
  44. {% set shipMainCandidates = [] %}
  45. {% for media in shipPool %}
  46. {% set hasMainTag = false %}
  47. {% for mediaTag in media.tags|default([]) %}
  48. {% set tagName = mediaTag.name|default(mediaTag.slug|default(mediaTag|default('')))|lower %}
  49. {% if tagName == 'main' %}
  50. {% set hasMainTag = true %}
  51. {% endif %}
  52. {% endfor %}
  53. {% if hasMainTag %}
  54. {% set shipMainCandidates = shipMainCandidates|merge([media]) %}
  55. {% endif %}
  56. {% endfor %}
  57. {% set shipFallbackCandidates = [] %}
  58. {% for media in shipPool %}
  59. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  60. {% if mediaKey not in usedMediaKeys %}
  61. {% set shipFallbackCandidates = shipFallbackCandidates|merge([media]) %}
  62. {% endif %}
  63. {% endfor %}
  64. {% set allFallbackCandidates = [] %}
  65. {% for media in allPool %}
  66. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  67. {% if mediaKey not in usedMediaKeys %}
  68. {% set allFallbackCandidates = allFallbackCandidates|merge([media]) %}
  69. {% endif %}
  70. {% endfor %}
  71. {% set secondImage = null %}
  72. {% set secondImageCategory = 'ship' %}
  73. {% if shipMainCandidates is not empty %}
  74. {% set secondImage = (shipMainCandidates|shuffle)|first %}
  75. {% elseif shipFallbackCandidates is not empty %}
  76. {% set secondImage = (shipFallbackCandidates|shuffle)|first %}
  77. {% elseif allFallbackCandidates is not empty %}
  78. {% set secondImage = (allFallbackCandidates|shuffle)|first %}
  79. {% endif %}
  80. {% if secondImage %}
  81. {% set secondImageKey = secondImage.id|default(secondImage.cdnUrl|default(secondImage.url|default(''))) %}
  82. {% if secondImageKey not in usedMediaKeys %}
  83. {% set selectedImages = selectedImages|merge([{ media: secondImage, category: secondImageCategory }]) %}
  84. {% set usedMediaKeys = usedMediaKeys|merge([secondImageKey]) %}
  85. {% endif %}
  86. {% endif %}
  87. {# 3) Stopover aléatoire, préférence non utilisée #}
  88. {% set stopoverAvailable = [] %}
  89. {% for media in stopoverPool %}
  90. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  91. {% if mediaKey not in usedMediaKeys %}
  92. {% set stopoverAvailable = stopoverAvailable|merge([media]) %}
  93. {% endif %}
  94. {% endfor %}
  95. {% set thirdImage = null %}
  96. {% if stopoverAvailable is not empty %}
  97. {% set thirdImage = (stopoverAvailable|shuffle)|first %}
  98. {% elseif stopoverPool is not empty %}
  99. {% set thirdImage = (stopoverPool|shuffle)|first %}
  100. {% endif %}
  101. {% if thirdImage %}
  102. {% set thirdImageKey = thirdImage.id|default(thirdImage.cdnUrl|default(thirdImage.url|default(''))) %}
  103. {% set selectedImages = selectedImages|merge([{ media: thirdImage, category: 'stopovers' }]) %}
  104. {% if thirdImageKey not in usedMediaKeys %}
  105. {% set usedMediaKeys = usedMediaKeys|merge([thirdImageKey]) %}
  106. {% endif %}
  107. {% endif %}
  108. {# 4) + 5) Ship tag boarding_life -> ship aléatoire non utilisée -> allMedias aléatoire non utilisée #}
  109. {% for i in 1..2 %}
  110. {% set shipBoardingCandidates = [] %}
  111. {% for media in shipPool %}
  112. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  113. {% if mediaKey not in usedMediaKeys %}
  114. {% set hasBoardingLifeTag = false %}
  115. {% for mediaTag in media.tags|default([]) %}
  116. {% set tagName = mediaTag.name|default(mediaTag.slug|default(mediaTag|default('')))|lower %}
  117. {% if tagName == 'boarding_life' %}
  118. {% set hasBoardingLifeTag = true %}
  119. {% endif %}
  120. {% endfor %}
  121. {% if hasBoardingLifeTag %}
  122. {% set shipBoardingCandidates = shipBoardingCandidates|merge([media]) %}
  123. {% endif %}
  124. {% endif %}
  125. {% endfor %}
  126. {% set shipAnyCandidates = [] %}
  127. {% for media in shipPool %}
  128. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  129. {% if mediaKey not in usedMediaKeys %}
  130. {% set shipAnyCandidates = shipAnyCandidates|merge([media]) %}
  131. {% endif %}
  132. {% endfor %}
  133. {% set allAnyCandidates = [] %}
  134. {% for media in allPool %}
  135. {% set mediaKey = media.id|default(media.cdnUrl|default(media.url|default(''))) %}
  136. {% if mediaKey not in usedMediaKeys %}
  137. {% set allAnyCandidates = allAnyCandidates|merge([media]) %}
  138. {% endif %}
  139. {% endfor %}
  140. {% set nextImage = null %}
  141. {% set nextImageCategory = 'ship' %}
  142. {% if shipBoardingCandidates is not empty %}
  143. {% set nextImage = (shipBoardingCandidates|shuffle)|first %}
  144. {% set nextImageCategory = 'cabin' %}
  145. {% elseif shipAnyCandidates is not empty %}
  146. {% set nextImage = (shipAnyCandidates|shuffle)|first %}
  147. {% elseif allAnyCandidates is not empty %}
  148. {% set nextImage = (allAnyCandidates|shuffle)|first %}
  149. {% endif %}
  150. {% if nextImage %}
  151. {% set nextImageKey = nextImage.id|default(nextImage.cdnUrl|default(nextImage.url|default(''))) %}
  152. {% if nextImageKey not in usedMediaKeys %}
  153. {% set selectedImages = selectedImages|merge([{ media: nextImage, category: nextImageCategory }]) %}
  154. {% set usedMediaKeys = usedMediaKeys|merge([nextImageKey]) %}
  155. {% endif %}
  156. {% endif %}
  157. {% endfor %}
  158. {% if selectedImages is not empty %}
  159. <div class="viewer" id="cruise-viewer" data-total-images="{{ selectedImages|length }}">
  160. <div class="viewer-desktop">
  161. <div class="viewer-main-image">
  162. <img
  163. src="{{ selectedImages[0].media.cdnUrl|default(selectedImages[0].media.url|default('')) }}"
  164. alt="{{ selectedImages[0].media.title|default(cruise.name|default('Image croisière')) }}"
  165. class="main-image"
  166. data-gallery-category="{{ selectedImages[0].category }}"
  167. data-gallery-src="{{ selectedImages[0].media.cdnUrl|default(selectedImages[0].media.url|default('')) }}"
  168. data-gallery-media-id="{{ selectedImages[0].media.id|default('') }}"
  169. >
  170. </div>
  171. <div class="viewer-thumbnails">
  172. {% if selectedImages|length > 1 %}
  173. <div class="thumbnail-item" data-index="1">
  174. <img
  175. src="{{ selectedImages[1].media.cdnUrl|default(selectedImages[1].media.url|default('')) }}"
  176. alt="{{ selectedImages[1].media.title|default(cruise.name|default('Image croisière')) }}"
  177. data-gallery-category="{{ selectedImages[1].category }}"
  178. data-gallery-src="{{ selectedImages[1].media.cdnUrl|default(selectedImages[1].media.url|default('')) }}"
  179. data-gallery-media-id="{{ selectedImages[1].media.id|default('') }}"
  180. >
  181. </div>
  182. {% endif %}
  183. {% if selectedImages|length > 2 %}
  184. <div class="thumbnail-item" data-index="2">
  185. <img
  186. src="{{ selectedImages[2].media.cdnUrl|default(selectedImages[2].media.url|default('')) }}"
  187. alt="{{ selectedImages[2].media.title|default(cruise.name|default('Image croisière')) }}"
  188. data-gallery-category="{{ selectedImages[2].category }}"
  189. data-gallery-src="{{ selectedImages[2].media.cdnUrl|default(selectedImages[2].media.url|default('')) }}"
  190. data-gallery-media-id="{{ selectedImages[2].media.id|default('') }}"
  191. >
  192. </div>
  193. {% endif %}
  194. {% if selectedImages|length > 3 %}
  195. <div class="thumbnail-item thumbnail-item-third" data-index="3">
  196. <img
  197. src="{{ selectedImages[3].media.cdnUrl|default(selectedImages[3].media.url|default('')) }}"
  198. alt="{{ selectedImages[3].media.title|default(cruise.name|default('Image croisière')) }}"
  199. data-gallery-category="{{ selectedImages[3].category }}"
  200. data-gallery-src="{{ selectedImages[3].media.cdnUrl|default(selectedImages[3].media.url|default('')) }}"
  201. data-gallery-media-id="{{ selectedImages[3].media.id|default('') }}"
  202. >
  203. {% if selectedImages|length >= 5 %}
  204. <div class="button-div button-desktop">
  205. <button type="button" id="view-all-photos-btn">
  206. <div class="icon-image" data-svg-static>{{ getLucidIcon('grip-vertical') }}</div>
  207. <div>Voir toutes les photos ({{ totalGalleryImages|default(selectedImages|length) }})</div>
  208. </button>
  209. </div>
  210. {% endif %}
  211. </div>
  212. {% endif %}
  213. {% if selectedImages|length > 4 %}
  214. <div class="thumbnail-item" data-index="4">
  215. <img
  216. src="{{ selectedImages[4].media.cdnUrl|default(selectedImages[4].media.url|default('')) }}"
  217. alt="{{ selectedImages[4].media.title|default(cruise.name|default('Image croisière')) }}"
  218. data-gallery-category="{{ selectedImages[4].category }}"
  219. data-gallery-src="{{ selectedImages[4].media.cdnUrl|default(selectedImages[4].media.url|default('')) }}"
  220. data-gallery-media-id="{{ selectedImages[4].media.id|default('') }}"
  221. >
  222. </div>
  223. {% endif %}
  224. </div>
  225. </div>
  226. <div class="carousel viewer-carousel">
  227. <div class="elements">
  228. {% for image in selectedImages %}
  229. <div class="carousel-image{% if loop.index0 == 0 %} active{% endif %}">
  230. <img
  231. src="{{ image.media.cdnUrl|default(image.media.url|default('')) }}"
  232. alt="{{ image.media.title|default(getCruiseName(cruise)|default('Image croisière')) }}"
  233. data-gallery-category="{{ image.category }}"
  234. data-gallery-src="{{ image.media.cdnUrl|default(image.media.url|default('')) }}"
  235. data-gallery-media-id="{{ image.media.id|default('') }}"
  236. >
  237. </div>
  238. {% endfor %}
  239. </div>
  240. <div class="carousel-navigation">
  241. <div class="controls">
  242. <div class="dots-container"></div>
  243. <button class="left-arrow" aria-label="Image précédente">‹</button>
  244. <button class="right-arrow" aria-label="Image suivante">›</button>
  245. </div>
  246. </div>
  247. </div>
  248. {% if selectedImages|length >= 5 %}
  249. <div class="button-div button-mobile">
  250. <button type="button" id="view-all-photos-btn-mobile">
  251. <div class="icon-image" data-svg-static>{{ getLucidIcon('grip-vertical') }}</div>
  252. <div>Voir toutes les photos ({{ totalGalleryImages|default(selectedImages|length) }})</div>
  253. </button>
  254. </div>
  255. {% endif %}
  256. </div>
  257. {% endif %}