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