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

Open in your IDE?
  1. {# templates/offer/roadtrip_show.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}{{ offer.title }} — O’Roadtrip{% endblock %}
  4. {% block body %}
  5. {# HERO #}
  6. <section class="position-relative text-white">
  7.   <div class="ratio ratio-21x9">
  8.     <img src="{{ asset('img/offer/road/' ~ offer.slug  ~ '/' ~ offer.img ?? 'img/offres/namibie/hero.jpg') }}" class="w-100 h-100 object-fit-cover" alt="{{ offer.title }}">
  9.   </div> 
  10.   <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">
  11.     <div class="px-3">
  12.       <h1 class="display-5 fw-bold mb-2">{{ offer.title }}</h1>
  13.       {% if offer.subtitle %}<p class="lead mb-0">{{ offer.subtitle }}</p>{% endif %}
  14.       {% if offer.brochure %}
  15.   <a href="{{ asset(offer.brochure) }}" target="_blank" class="btn btn-outline-primary">
  16.     📄 Télécharger la brochure
  17.   </a>
  18. {% endif %}
  19.     </div>
  20.   </div>
  21. </section>
  22. <section class="container py-5">
  23.   <div class="row g-3 g-lg-4 mb-4">
  24.     <div class="col-12 col-md-6 col-lg-3">
  25.       <div class="card rounded-4 shadow-sm h-100"><div class="card-body">
  26.         <h6 class="fw-bold txt-ot-brown mb-1">Durée & dates</h6>
  27.         <p class="mb-0 text-muted">{{ offer.summaryDuration }}</p>
  28.         <p class="mb-0 text-muted">{{ offer.dateText }}</p>
  29.       </div></div>
  30.     </div>
  31.     <div class="col-12 col-md-6 col-lg-3">
  32.       <div class="card rounded-4 shadow-sm h-100"><div class="card-body">
  33.         <h6 class="fw-bold txt-ot-brown mb-1">Vols</h6>
  34.         <ul class="list-unstyled mb-0">
  35.         {% for line in offer.summaryFlights|split("\n") %}
  36.                 {% if line|trim != '' %}
  37.                  <li class="mb-1">{{ line }}</li> 
  38.                 {% endif %}
  39.         {% endfor %}
  40.       </ul>
  41.       </div></div>
  42.     </div>
  43.     <div class="col-12 col-md-6 col-lg-3">
  44.       <div class="card rounded-4 shadow-sm h-100"><div class="card-body">
  45.         <h6 class="fw-bold txt-ot-brown mb-1">Rythme & repas</h6>
  46.         <ul class="list-unstyled mb-0">
  47.           {% for line in offer.summaryPaceMeals|split("\n") %}
  48.                 {% if line|trim != '' %}
  49.                  <li>{{ line }}</li> 
  50.                 {% endif %}
  51.         {% endfor %}
  52.       </ul>
  53.       </div></div>
  54.     </div>
  55.     <div class="col-12 col-md-6 col-lg-3">
  56.       <div class="card rounded-4 shadow-sm h-100"><div class="card-body">
  57.         <h6 class="fw-bold txt-ot-brown mb-1">Tarif dès</h6>
  58.          <p class="small text-muted mb-0">{{ offer.priceFrom }}€</p>
  59.       </div></div>
  60.     </div>
  61.   </div>
  62.   {# ————— Points forts ————— #}
  63.     {% if highlight %}
  64.   <div class="row mb-4">
  65.     <div class="col-12 col-lg-6">
  66.       <p class="text-uppercase small fw-bold text-ot-brown mb-2">Nos coups de cœur</p>
  67.       <h2 class="h4 fw-bold mb-3 txt-ot-brown">Les incontournables de votre roadtrip</h2>
  68.       <p class="text-muted">Déserts, dunes, faune sauvage et sites rupestres : une immersion totale dans les grands espaces namibiens. </p>
  69.     </div>
  70.     <div class="col-12 col-lg-6">
  71.       <div class="d-flex flex-column gap-3">
  72.         {% for h in highlight %}
  73.           <div class="card border-0 shadow-sm rounded-4 w-100">
  74.             <div class="card-body d-flex align-items-start gap-2">
  75.               <i class="bi bi-check-circle-fill text-ot-green mt-1"></i>
  76.               <h3 class="h6 fw-semibold mb-0">{{ h.title }}</h3>
  77.             </div>
  78.           </div>
  79.         {% endfor %}
  80.       </div>
  81.     </div>
  82.   </div>
  83.   {% endif %}
  84.   {# ————— Itinéraire jour par jour ————— #}
  85.   <div class="row g-4">
  86.     <div class="col-12 col-lg-6">
  87.       <div class="card border-0 shadow-sm rounded-4 h-100">
  88.         <div class="card-body">
  89.           <h2 class="h5 txt-ot-brown fw-bold mb-3">Itinéraire — jour par jour</h2>
  90.           <div class="list-group list-group-flush">
  91.             {% for it in itinerary %}
  92.               <div class="list-group-item px-0">
  93.                 <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">
  94.                   <span class="fw-bold ">Jour {{loop.index}} - {{it.title }}{% if it.kmLabel %} <span class="text-muted fw-normal"> ({{ it.kmLabel }}) km</span>{% endif %}</span>
  95.                   <i class="bi bi-chevron-down"></i>
  96.                 </button>
  97.                 <div id="day{{ loop.index }}" class="collapse mt-2">
  98.                   <p class="small text-muted mb-0">{{ it.details }}</p>
  99.                 </div>
  100.               </div>
  101.             {% endfor %}
  102.           </div>
  103.           <p class="small text-muted mt-3 mb-0">Données synthétisées de la brochure.</p>
  104.         </div>
  105.       </div>
  106.     </div>
  107.       {#  — CAROUSEL #}
  108.       <div class="col-12 col-lg-6 d-flex">
  109.         <div class="w-100 d-flex align-items-center">
  110.           <div id="circuitCarousel"
  111.                class="carousel slide rounded-4 overflow-hidden shadow-sm w-100"
  112.                data-bs-ride="carousel"
  113.                data-bs-interval="5000"
  114.                data-bs-pause="hover"
  115.                data-bs-touch="true"
  116.                aria-label="Galerie circuit">
  117.             <div class="carousel-inner">
  118.               {% for p in photoItinerary %}
  119.                 <div class="carousel-item {% if loop.first %}active{% endif %}">
  120.                   <div class="ratio ratio-4x3">
  121.                     <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 }}">
  122.                   </div>
  123.                 </div>
  124.               {% endfor %}
  125.             </div>
  126.             <button class="carousel-control-prev" type="button" data-bs-target="#circuitCarousel" data-bs-slide="prev">
  127.               <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  128.               <span class="visually-hidden">Précédent</span>
  129.             </button>
  130.             <button class="carousel-control-next" type="button" data-bs-target="#circuitCarousel" data-bs-slide="next">
  131.               <span class="carousel-control-next-icon" aria-hidden="true"></span>
  132.               <span class="visually-hidden">Suivant</span>
  133.             </button>
  134.             <div class="carousel-indicators">
  135.               {% for p in photoItinerary %}
  136.                 <button type="button"
  137.                         data-bs-target="#circuitCarousel"
  138.                         data-bs-slide-to="{{ loop.index0 }}"
  139.                         class="{% if loop.first %}active{% endif %}"
  140.                         aria-current="{{ loop.first ? 'true' : 'false' }}"
  141.                         aria-label="Slide {{ loop.index }}"></button>
  142.               {% endfor %}
  143.             </div>
  144.           </div>
  145.         </div>
  146.       </div>
  147.   </div>
  148. </section>
  149. {% if hebergementOffer %}
  150. {# =====================================================
  151.    5) HÔTELS — liste ou tableau simple
  152. ===================================================== #}
  153. <section class="py-5 bg-body-tertiary" id="hotels">
  154.   <div class="container">
  155.     <h2 class="h3 txt-ot-brown fw-bold mb-3">Hébergements prévus (ou similaires)</h2>
  156.     <ul class="list-group">
  157.       {% for h in hebergementOffer %}<li class="list-group-item">{{ h.name }}</li>{% endfor %}
  158.     </ul>
  159.   </div>
  160. </section>
  161. {% endif %}
  162. {% if offer.widget %}
  163. <div class="container">
  164.   <h2 class="h3 txt-ot-brown fw-bold mb-3">Activités</h2>
  165. <div class="widget">
  166.   {{offer.widget|raw}}
  167. </div>
  168. </div>
  169. {% endif %}
  170. {% if included %}
  171. {# =====================================================
  172.    6) INCLUS / NON INCLUS — deux colonnes
  173. ===================================================== #}
  174. <section class="py-5 bg-white" id="inclus">
  175.   <div class="container">
  176.     <div class="row g-4">
  177.       <div class="col-12 col-lg-6">
  178.         <div class="card border-0 shadow-sm rounded-4 h-100">
  179.           <div class="card-body">
  180.             <h2 class="h5 fw-bold txt-ot-brown">Inclus</h2>
  181.             <ul class="small mb-0 list-unstyled">
  182.            
  183.             {% for i in included|filter(i => i.type == 'in') %}
  184.             <li>✔️ {{ i.label }}</li>
  185.              {% endfor %}
  186.             </ul>
  187.           </div>
  188.         </div>
  189.       </div>
  190.       <div class="col-12 col-lg-6">
  191.         <div class="card border-0 shadow-sm rounded-4 h-100">
  192.           <div class="card-body">
  193.             <h2 class="h5 fw-bold txt-ot-brown">Non inclus</h2>
  194.             <ul class="small mb-0 list-unstyled">
  195.               {% for e in included|filter(e => e.type == 'out') %}
  196.                  <li>— {{ e.label }}</li>
  197.              {% endfor %}
  198.             </ul>
  199.           </div>
  200.         </div>
  201.       </div>
  202.     </div>
  203.   </div>
  204. </section>
  205. {% endif %}
  206. {#
  207.       <div class="card border-0 shadow-sm rounded-4">
  208.         <div class="card-body">
  209.           <h3 class="h6 fw-bold mb-2">Tarifs</h3>
  210.           {% set roomPrices = offer.roomPrices|default([
  211.             {label:'Double', price:4730},
  212.             {label:'Triple', price:4410},
  213.             {label:'Quadruple', price:4140},
  214.             {label:'Single', price:null}
  215.           ]) %}
  216.           <div class="row row-cols-2 g-2">
  217.             {% for r in roomPrices %}
  218.               <div class="col">
  219.                 <div class="border rounded-3 p-2 small h-100 d-flex justify-content-between">
  220.                   <span class="text-muted">{{ r.label }}</span>
  221.                   <strong>{% if r.price %}{{ r.price }}€{% else %}—{% endif %}</strong>
  222.                 </div>
  223.               </div>
  224.             {% endfor %}
  225.           </div>
  226.           <p class="small text-muted mb-0 mt-2">Tarifs/personne, sous réserve de dispo & modifs. :contentReference[oaicite:3]{index=3}</p>
  227.         </div>
  228.       </div> #}
  229. {% if flight %}
  230. {# =====================================================
  231.    7) VOLS & HORAIRES — bloc détaillé
  232. ===================================================== #}
  233. <section class="py-5 bg-body-tertiary" id="vols">
  234.   <div class="container">
  235.     <h2 class="h3 txt-ot-brown fw-bold mb-3">Vols & horaires (indicatifs)</h2>
  236.     <div class="row g-4">
  237.       <div class="col-12 col-lg-6">
  238.         <div class="card border-0 shadow-sm rounded-4 h-100">
  239.           <div class="card-body">
  240.             <h3 class="h6 fw-bold mb-2">Aller</h3>
  241.             <ul class="small mb-0">
  242.             {% for f in flight %}
  243.               {% if f.type == '1' %}
  244.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  245.               {% endif %}
  246.             {% endfor %}
  247.             </ul>
  248.           </div>
  249.         </div>
  250.       </div>
  251.       <div class="col-12 col-lg-6">
  252.         <div class="card border-0 shadow-sm rounded-4 h-100">
  253.           <div class="card-body">
  254.             <h3 class="h6 fw-bold mb-2">Retour</h3>
  255.             <ul class="small mb-0">
  256.             {% for f in flight %}
  257.               {% if f.type == '2' %}
  258.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  259.               {% endif %}
  260.             {% endfor %}
  261.             </ul>
  262.           </div>
  263.         </div>
  264.       </div>
  265.     </div>
  266.     <p class="small text-muted mt-3 mb-0">Horaires et compagnies susceptibles d’évolution. À confirmer à l’émission des billets.</p>
  267.   </div>
  268. </section>
  269. {% endif %}
  270. {% if infos %}
  271. {# =====================================================
  272.    9) FACILITÉS DE PAIEMENT — encart
  273. ===================================================== #}
  274. <section class="py-5 bg-body-tertiary" id="paiement">
  275.   <div class="container">
  276.   <div class="row g-4">
  277.     <div class="col-12 col-lg-6">
  278.     <div class="card border-0 shadow-sm rounded-4">
  279.       <div class="card-body">
  280.         <h2 class="h5 fw-bold txt-ot-brown">Facilités de paiement</h2>
  281.         <ul class="small mb-0">
  282.           {% for line in offer.paymentMethod|split("\n") %}
  283.               <li class="mb-1">✔️ {{ line }}</li>
  284.             {% endfor %}
  285.         </ul>
  286.       </div>
  287.     </div>
  288.     </div>
  289.       <div class="col-12 col-lg-6">
  290.     <div class="card border-0 shadow-sm rounded-4">
  291.       <div class="card-body">
  292.         <h2 class="h5 fw-bold txt-ot-brown">Formalités</h2>
  293.         <ul class="small mb-0">
  294.               {% for line in offer.formalities|split("\n") %}
  295.               <li class="mb-1">✔️ {{ line }}</li>
  296.             {% endfor %}
  297.         </ul>
  298.       </div>
  299.     </div>
  300.      </div> 
  301. </div>
  302.   </div>
  303. </section>
  304. {% endif %}
  305. {# =====================================================
  306.    11) CTA FINAL — devis & contact
  307. ===================================================== #}
  308. <section class="py-5 bg-ot-green text-white text-center">
  309.   <div class="container">
  310.     <h2 class="h4 fw-bold mb-2">Envie de rejoindre le {{offer.title}} ?</h2>
  311.     <p class="mb-4">Parlez à un conseiller Otropik : on s’occupe de tout.</p>
  312.     <div class="d-flex gap-2 justify-content-center flex-wrap">
  313.       <a href="{{ path('o.devis') }}" class="btn btn-light rounded-pill">Demander un devis</a>
  314.       <a href="tel:0590505134" class="btn btn-outline-light rounded-pill">Appeler</a>
  315.     </div>
  316.   </div>
  317. </section>
  318. {% endblock %}