templates/default/croisiere-destination.html.twig line 1

Open in your IDE?
  1. {# templates/croisiere/show.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}{{offer.title}} — O’Croisière{% endblock %}
  4. {% block body %}
  5. {# HERO #}
  6. <section class="position-relative text-white">
  7.   <div class="ratio ratio-21x9">
  8.     <img src="{{asset('img/croisiere/' ~ offer.slug ~ '/' ~ offer.img )}}"
  9.          class="w-100 h-100 object-fit-cover" alt="{{ offer.title }}">
  10.   </div>
  11.   <div class="position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center text-center bg-opacity-40">
  12.     <div class="px-3">
  13.       <h1 class="display-5 fw-bold mb-2">{{offer.title}}</h1>
  14.        <p class="lead mb-0">{{ offer.subtitle }}</p>
  15.     </div>
  16.   </div>
  17. </section>
  18. <section class="container py-5">
  19.   <div class="row g-4">
  20.     {# NAVIRE + META + BLOCS TEXTE #}
  21.     <div class="col-12 col-lg-5">
  22.       <div class="card border-0 shadow-sm rounded-4">
  23.         <div class="ratio ratio-4x3 rounded-top-4 overflow-hidden">
  24.           <div id="circuitCarousel"
  25.                class="carousel slide rounded-4 overflow-hidden shadow-sm w-100"
  26.                data-bs-ride="carousel"
  27.                data-bs-interval="5000"
  28.                data-bs-pause="hover"
  29.                data-bs-touch="true"
  30.                aria-label="Galerie circuit">
  31.             <div class="carousel-inner">
  32.               {% for p in photoItinerary %}
  33.                 <div class="carousel-item {% if loop.first %}active{% endif %}">
  34.                   <div class="ratio ratio-4x3">
  35.                     <img src="{{asset('img/' ~ p.offer.file  ~ '/' ~ p.offer.slug  ~ '/itinerary/' ~ p.img)}}" class="d-block w-100 h-100 object-fit-cover" alt="Photo circuit {{ loop.index }}">
  36.                   </div>
  37.                 </div>
  38.               {% endfor %}
  39.             </div>
  40.              <button class="carousel-control-prev" type="button" data-bs-target="#circuitCarousel" data-bs-slide="prev">
  41.               <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  42.               <span class="visually-hidden">Précédent</span>
  43.             </button>
  44.             <button class="carousel-control-next" type="button" data-bs-target="#circuitCarousel" data-bs-slide="next">
  45.               <span class="carousel-control-next-icon" aria-hidden="true"></span>
  46.               <span class="visually-hidden">Suivant</span>
  47.             </button>
  48.             <div class="carousel-indicators">
  49.               {% for p in photoItinerary %}
  50.                 <button type="button"
  51.                         data-bs-target="#circuitCarousel"
  52.                         data-bs-slide-to="{{ loop.index0 }}"
  53.                         class="{% if loop.first %}active{% endif %}"
  54.                         aria-current="{{ loop.first ? 'true' : 'false' }}"
  55.                         aria-label="Slide {{ loop.index }}"></button>
  56.               {% endfor %}
  57.             </div>
  58.           </div>
  59.         </div>
  60.         <div class="card-body">
  61.           <h2 class="h4 txt-ot-blue fw-bold mb-1">Les atouts de la croisiere</h2>
  62.           <div class="d-flex flex-wrap gap-2 mb-2">
  63.           {% for h in highlight %}<span class="badge rounded-pill bg-success-subtle text-success-emphasis">{{ h.title }}</span>{% endfor %} 
  64.           </div>
  65.          {# <ul class="small text-muted list-unstyled mb-0">
  66.            <li><strong>Opérateur :</strong> {{ program.operator }} fly</li>
  67.             <li><strong>Embarquement :</strong> {{ program.embark_port }} aéoport</li>
  68.             <li><strong>Débarquement :</strong> {{ program.disembark_port }} wesh</li>
  69.             <li><strong>Départ aéroport :</strong> {{ program.home_airport }} aeoport</li> 
  70.           </ul> #}
  71.         </div>
  72.       </div>
  73.       <div class="card border-0 shadow-sm rounded-4 mt-4">
  74.         <div class="card-body">
  75.           <h3 class="h6 txt-ot-blue fw-bold mb-2">Inclus</h3>
  76.           <ul class="small m-0">
  77.            {% for i in included|filter(i => i.type == 'in') %}
  78.               <li>{{ i.label }}</li>
  79.             {% endfor %}
  80.           </ul>
  81.           <hr>
  82.           <h3 class="h6 txt-ot-blue fw-bold mb-2">Non inclus</h3>
  83.           <ul class="small m-0">
  84.             {% for e in included|filter( e => e.type == 'out') %}
  85.               <li>{{ e.label }}</li>
  86.             {% endfor %}
  87.           </ul>
  88.         </div>
  89.       </div>
  90.       <div class="card border-0 shadow-sm rounded-4 mt-4">
  91.         <div class="card-body small">
  92.          <h3 class="h6 txt-ot-blue fw-bold mb-2">Formalités</h3>
  93.            <ul class="m-0">
  94.           {% for f in infos|filter(f => f.type == 'formalites') %}
  95.             <li class="">{{ f.title }}</li>
  96.           {% endfor %}
  97.           </ul>
  98.           <hr>
  99.            <h3 class="h6 txt-ot-blue fw-bold mb-2">Modalités de paiement</h3>
  100.             <ul class="m-0">
  101.           {% for pay in infos|filter(pay => pay.type == 'paiement') %}
  102.             <li class="mb-0">{{ pay.title }}</li>
  103.           {% endfor %}
  104.           </ul>
  105.         </div>
  106.       </div>
  107.     </div>
  108.     {# ITINÉRAIRE + DATES/PRIX #}
  109.     <div class="col-12 col-lg-7">
  110.   <!-- Ligne 1 : Durée / Vols / Tarif -->
  111.   <div class="row g-3 mb-4">
  112.     <!-- Durée -->
  113.     <div class="col-12 col-md-4">
  114.       <div class="card rounded-4 shadow-sm h-100">
  115.         <div class="card-body">
  116.           <h6 class="fw-bold mb-1">Durée</h6>
  117.           <p class="mb-0 text-muted">{{ offer.summaryDuration }}</p>
  118.         </div>
  119.       </div>
  120.     </div>
  121.     <!-- Vols -->
  122.     <div class="col-12 col-md-4">
  123.       <div class="card rounded-4 shadow-sm h-100">
  124.         <div class="card-body">
  125.           <h6 class="fw-bold mb-1">Vols</h6>
  126.           <ul class="mb-0 ps-3">
  127.             {% for line in offer.summaryFlights|split("\n") %}
  128.               {% if line|trim != '' %}
  129.                 <li>{{ line }}</li>
  130.               {% endif %}
  131.             {% endfor %}
  132.           </ul>
  133.         </div>
  134.       </div>
  135.     </div>
  136.     <!-- Tarif -->
  137.     <div class="col-12 col-md-4">
  138.       <div class="card rounded-4 shadow-sm h-100">
  139.         <div class="card-body">
  140.           <h6 class="fw-bold mb-1">Tarif à partir de</h6>
  141.           <p class="mb-0 text-muted">{{ offer.priceFrom }} €</p>
  142.         </div>
  143.       </div>
  144.     </div>
  145.   </div>
  146.   <!-- Ligne 2 : Rythme -->
  147.   <div class="row g-3 mb-4">
  148.     <div class="col-12">
  149.       <div class="card rounded-4 shadow-sm h-100">
  150.         <div class="card-body">
  151.           <h6 class="fw-bold mb-1">Rythme</h6>
  152.           <ul class="mb-0 ps-3">
  153.             {% for line in offer.summaryPaceMeals|split("\n") %}
  154.               {% if line|trim != '' %}
  155.                 <li>{{ line }}</li>
  156.               {% endif %}
  157.             {% endfor %}
  158.           </ul>
  159.         </div>
  160.       </div>
  161.     </div>
  162. </div>
  163.       <div class="card border-0 shadow-sm rounded-4 mb-4">
  164.         <div class="card-body">
  165.          <h2 class="h5 txt-ot-blue fw-bold mb-3">Itinéraire — jour par jour</h2>
  166.           <div class="list-group list-group-flush">
  167.             {% for it in itinerary %}
  168.               <div class="list-group-item px-0">
  169.                 <button class="btn w-100 d-flex justify-content-between align-items-center text-start" data-bs-toggle="collapse" data-bs-target="#day{{ loop.index }}" aria-expanded="false">
  170.                   <span class="fw-bold">Jour {{loop.index}} - {{it.title }}{% if it.kmLabel %} <span class="text-muted fw-normal"> ({{ it.kmLabel }}) km</span>{% endif %}</span>
  171.                   <i class="bi bi-chevron-down"></i>
  172.                 </button>
  173.                 <div id="day{{ loop.index }}" class="collapse mt-2">
  174.                   <p class="small text-muted mb-0">{{ it.details }}</p>
  175.                 </div>
  176.               </div>
  177.             {% endfor %}
  178.           </div>
  179.          {# {% if program.map_image %}
  180.             <img src="{{ asset(program.map_image) }}" class="img-fluid rounded-3 mt-3" alt="Carte">
  181.           {% endif %} #}
  182.         </div>
  183.       </div>
  184.   {% if hebergementOffer %}
  185. {# =====================================================
  186.    5) HÔTELS — liste ou tableau simple
  187. ===================================================== #}
  188.     <h3 class="h5 txt-ot-blue fw-bold mt-3 mb-3">Hébergements prévus (ou similaires)</h3>
  189.     <ul class="list-group">
  190.       {% for h in hebergementOffer %}<li class="list-group-item">{{ h.name }}</li>{% endfor %}
  191.     </ul>
  192. {% endif %}
  193. {% if flight %}
  194. {# =====================================================
  195.    7) VOLS & HORAIRES — bloc détaillé
  196. ===================================================== #}
  197.     <h3 class="h5 txt-ot-blue fw-bold mt-3 mb-3">Vols & horaires (indicatifs)</h2>
  198.     <div class="row g-4">
  199.       <div class="col-12 col-lg-6">
  200.         <div class="card border-0 shadow-sm rounded-4 h-100">
  201.           <div class="card-body">
  202.             <h3 class="h6 fw-bold mb-2">Aller</h3>
  203.             <ul class="small mb-0">
  204.             {% for f in flight %}
  205.               {% if f.type == '1' %}
  206.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  207.               {% endif %}
  208.             {% endfor %}
  209.             </ul>
  210.           </div>
  211.         </div>
  212.       </div>
  213.       <div class="col-12 col-lg-6">
  214.         <div class="card border-0 shadow-sm rounded-4 h-100">
  215.           <div class="card-body">
  216.             <h3 class="h6 fw-bold mb-2">Retour</h3>
  217.             <ul class="small mb-0">
  218.             {% for f in flight %}
  219.               {% if f.type == '2' %}
  220.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  221.               {% endif %}
  222.             {% endfor %}
  223.             </ul>
  224.           </div>
  225.         </div>
  226.       </div>
  227.     </div>
  228.     <p class="small text-muted mt-3 mb-0">Horaires et compagnies susceptibles d’évolution. À confirmer à l’émission des billets.</p>
  229. {% endif %}
  230.     {#  <div class="card border-0 shadow-sm rounded-4">
  231.         <div class="card-body">
  232.           <h3 class="h5 fw-bold mb-3">Dates </h3>
  233.           <div class="table-responsive">
  234.             <table class="table table-striped table-sm">
  235.               <thead class="table-light">
  236.                 <tr><th>Période</th></tr>
  237.               </thead>
  238.               <tbody>
  239.                 {% for p in program.prices %}
  240.                   <tr>
  241.                     <td>{{ p.period_label }}</td>
  242.                     <td>{{ p.price_inside }}€</td>
  243.                     <td>{{ p.price_oceanview }}€</td>
  244.                     <td>{{ p.price_balcony }}€</td>
  245.                     <td>{{ p.price_3rd4th_adult ?? '—' }}</td>
  246.                     <td>{{ p.price_3rd4th_child ?? '—' }}</td>
  247.                   </tr>
  248.                 {% endfor %}
  249.               </tbody>
  250.             </table>
  251.           </div>
  252.         </div>
  253.       </div>
  254.       <div class="d-flex justify-content-end mt-4">
  255.         <a href="{#{ path('app_demander_devis') }}" class="btn btn-primary rounded-pill px-4">Demander un devis</a>
  256.       </div>#}
  257.     </div>
  258.   </div>
  259. </section>
  260. {% endblock %}