{#
Page détail d'une croisière.
Variables attendues (fournies par App\Controller\Website\DetailController) :
- cruise : entité Cruise (peut être null si ?croisiere=ID est absent ou invalide)
- content : données CMS du template (isFloa, isDevelopmentMode, partnerReduction, …)
Les sous-templates s'appuient TOUS sur `cruise` ; si null, on affiche un fallback minimal.
#}
{% block stylesheets %}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""/>
{% endblock %}
{% block content %}
{% set offers = getCruiseSpecialOffers(cruise) %}
{% if cruise is null %}
{# Pas de croisière en contexte : éviter le crash des includes et afficher un message simple. #}
<div class="container-fluid mb-5">
<div class="row">
<div class="col-lg-1 col-md-1 col-sm-12"></div>
<div class="col-lg-10 col-md-10 col-sm-12">
<div class="alert alert-warning br3 p-4">
Croisière introuvable. Vérifiez le lien (paramètre <code>croisiere</code> manquant ou invalide).
</div>
</div>
<div class="col-lg-1 col-md-1 col-sm-12"></div>
</div>
</div>
{% else %}
{# ─── Fil d'Ariane ─── #}
<div class="container-fluid">
<div class="row">
<div class="col-lg-1 col-md-1 col-sm-12"></div>
<div class="col-lg-10 col-md-10 col-sm-12">
{% set destinationName = cruise.itinerary.secondaryDestinations is iterable
? cruise.itinerary.secondaryDestinations.first.secondaryDestination.name|default('')
: cruise.itinerary.destination|default('') %}
{% set destinationId = cruise.itinerary.secondaryDestinations is iterable
? cruise.itinerary.secondaryDestinations.first.secondaryDestination.id|default(null)
: null %}
{% set companyId = cruise.ship.company.id|default(null) %}
{% include 'pages/_includes/_breadcrumb.html.twig' with {
destination: destinationName ? { name: destinationName, url: destinationId ? '/croisieres?destination=' ~ destinationId : null } : null,
company: cruise.ship.company.name is defined ? { name: cruise.ship.company.name, url: companyId ? '/croisieres?company=' ~ companyId : null } : null,
productTitle: getCruiseName(cruise)|default(''),
} only %}
</div>
<div class="col-lg-1 col-md-1 col-sm-12"></div>
</div>
</div>
{# ─── Galerie en haut de page (désactivée tant qu'une vraie source d'images n'est pas branchée) ─── #}
<div class="container-fluid mb-5">
<div class="row">
<div class="col-lg-1 col-md-1 col-sm-12"></div>
<div class="col-lg-10 col-md-10 col-sm-12">
{% set cruiseRelatedMedias = getCruiseRelatedMedias(cruise) %}
{% set cruiseShipMedias = crea_media_get_medias([], cruise.ship) %}
{% set cruiseStopoversMedias = getCruiseStopoversMediaFiles(cruise) %}
{% set cruiseCabinTypesMedias = getCruiseCabinTypesMediaFiles(cruise) %}
{% include 'pages/_includes/details/_gallery-viewer.html.twig' with {
cruise: cruise,
allMedias: cruiseRelatedMedias,
shipMedias: cruiseShipMedias,
stopoversMedias: cruiseStopoversMedias,
cabinTypesMedias: cruiseCabinTypesMedias,
} only %}
</div>
<div class="col-lg-1 col-md-1 col-sm-12"></div>
</div>
</div>
{% include 'pages/_includes/details/_gallery-modal.html.twig' with {
cruise: cruise,
shipMedias: cruiseShipMedias,
stopoversMedias: cruiseStopoversMedias,
cabinTypesMedias: cruiseCabinTypesMedias,
} only %}
{# ─── Données cabines pour le JS de _cabin-choice ─── #}
<script type="application/json" data-cabins>
{{ cruise.dates|default([])|json_encode(constant('JSON_UNESCAPED_UNICODE') b-or constant('JSON_UNESCAPED_SLASHES'))|raw }}
</script>
{# ID croisière pour le cookie « visité récemment » (visitedCruises, écrit dans _details.js) #}
<span hidden data-visited-cruise-id="{{ cruise.id }}"></span>
{# ─── Modale cabines (alimentée par cabin_datas_tree quand disponible) ─── #}
{% include 'pages/_includes/details/_cabin-modal.html.twig' %}
{% include 'pages/_includes/details/_type-of-quote-modal.html.twig' %}
{# ─── Blocs principaux ─── #}
{% include 'pages/_includes/details/_main-informations.html.twig' with {
'offers': offers
} %}
{% include 'pages/_includes/details/_other-departures.html.twig' %}
{% include 'pages/_includes/details/_itinerary.html.twig' %}
{% include 'pages/_includes/details/_useful-informations.html.twig' %}
{% if offers is not empty %}
{% include 'pages/_includes/details/_promotions.html.twig' with {
'offers': offers
} %}
{% endif %}
{% endif %}
{% endblock %}