templates/pages/_detail.html.twig line 1

Open in your IDE?
  1. {#
  2. Page détail d'une croisière.
  3. Variables attendues (fournies par App\Controller\Website\DetailController) :
  4. - cruise : entité Cruise (peut être null si ?croisiere=ID est absent ou invalide)
  5. - content : données CMS du template (isFloa, isDevelopmentMode, partnerReduction, …)
  6. Les sous-templates s'appuient TOUS sur `cruise` ; si null, on affiche un fallback minimal.
  7. #}
  8. {% block stylesheets %}
  9. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""/>
  10. {% endblock %}
  11. {% block content %}
  12. {% set offers = getCruiseSpecialOffers(cruise) %}
  13. {% if cruise is null %}
  14. {# Pas de croisière en contexte : éviter le crash des includes et afficher un message simple. #}
  15. <div class="container-fluid mb-5">
  16. <div class="row">
  17. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  18. <div class="col-lg-10 col-md-10 col-sm-12">
  19. <div class="alert alert-warning br3 p-4">
  20. Croisière introuvable. Vérifiez le lien (paramètre <code>croisiere</code> manquant ou invalide).
  21. </div>
  22. </div>
  23. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  24. </div>
  25. </div>
  26. {% else %}
  27. {# ─── Fil d'Ariane ─── #}
  28. <div class="container-fluid">
  29. <div class="row">
  30. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  31. <div class="col-lg-10 col-md-10 col-sm-12">
  32. {% set destinationName = cruise.itinerary.secondaryDestinations is iterable
  33. ? cruise.itinerary.secondaryDestinations.first.secondaryDestination.name|default('')
  34. : cruise.itinerary.destination|default('') %}
  35. {% set destinationId = cruise.itinerary.secondaryDestinations is iterable
  36. ? cruise.itinerary.secondaryDestinations.first.secondaryDestination.id|default(null)
  37. : null %}
  38. {% set companyId = cruise.ship.company.id|default(null) %}
  39. {% include 'pages/_includes/_breadcrumb.html.twig' with {
  40. destination: destinationName ? { name: destinationName, url: destinationId ? '/croisieres?destination=' ~ destinationId : null } : null,
  41. company: cruise.ship.company.name is defined ? { name: cruise.ship.company.name, url: companyId ? '/croisieres?company=' ~ companyId : null } : null,
  42. productTitle: getCruiseName(cruise)|default(''),
  43. } only %}
  44. </div>
  45. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  46. </div>
  47. </div>
  48. {# ─── Galerie en haut de page (désactivée tant qu'une vraie source d'images n'est pas branchée) ─── #}
  49. <div class="container-fluid mb-5">
  50. <div class="row">
  51. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  52. <div class="col-lg-10 col-md-10 col-sm-12">
  53. {% set cruiseRelatedMedias = getCruiseRelatedMedias(cruise) %}
  54. {% set cruiseShipMedias = crea_media_get_medias([], cruise.ship) %}
  55. {% set cruiseStopoversMedias = getCruiseStopoversMediaFiles(cruise) %}
  56. {% set cruiseCabinTypesMedias = getCruiseCabinTypesMediaFiles(cruise) %}
  57. {% include 'pages/_includes/details/_gallery-viewer.html.twig' with {
  58. cruise: cruise,
  59. allMedias: cruiseRelatedMedias,
  60. shipMedias: cruiseShipMedias,
  61. stopoversMedias: cruiseStopoversMedias,
  62. cabinTypesMedias: cruiseCabinTypesMedias,
  63. } only %}
  64. </div>
  65. <div class="col-lg-1 col-md-1 col-sm-12"></div>
  66. </div>
  67. </div>
  68. {% include 'pages/_includes/details/_gallery-modal.html.twig' with {
  69. cruise: cruise,
  70. shipMedias: cruiseShipMedias,
  71. stopoversMedias: cruiseStopoversMedias,
  72. cabinTypesMedias: cruiseCabinTypesMedias,
  73. } only %}
  74. {# ─── Données cabines pour le JS de _cabin-choice ─── #}
  75. <script type="application/json" data-cabins>
  76. {{ cruise.dates|default([])|json_encode(constant('JSON_UNESCAPED_UNICODE') b-or constant('JSON_UNESCAPED_SLASHES'))|raw }}
  77. </script>
  78. {# ID croisière pour le cookie « visité récemment » (visitedCruises, écrit dans _details.js) #}
  79. <span hidden data-visited-cruise-id="{{ cruise.id }}"></span>
  80. {# ─── Modale cabines (alimentée par cabin_datas_tree quand disponible) ─── #}
  81. {% include 'pages/_includes/details/_cabin-modal.html.twig' %}
  82. {% include 'pages/_includes/details/_type-of-quote-modal.html.twig' %}
  83. {# ─── Blocs principaux ─── #}
  84. {% include 'pages/_includes/details/_main-informations.html.twig' with {
  85. 'offers': offers
  86. } %}
  87. {% include 'pages/_includes/details/_other-departures.html.twig' %}
  88. {% include 'pages/_includes/details/_itinerary.html.twig' %}
  89. {% include 'pages/_includes/details/_useful-informations.html.twig' %}
  90. {% if offers is not empty %}
  91. {% include 'pages/_includes/details/_promotions.html.twig' with {
  92. 'offers': offers
  93. } %}
  94. {% endif %}
  95. {% endif %}
  96. {% endblock %}