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

Open in your IDE?
  1. {# templates/circuit/golden-western.html.twig #}
  2. {% extends 'base.html.twig' %}
  3. {% block title %}O'Circuit - {{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. {# Si tu veux header overlay blanc sur photo hero : #}
  17. {% block header_classes %}header-overlay{% endblock %}
  18. {% block navbar_theme %}navbar-dark{% endblock %}
  19. {% block body %}
  20. {# =====================================================
  21.    1) HERO — Titre, sous-titre, prix/CTA, bloc inclus
  22. ===================================================== #}
  23. <section class="hero hero--offer-details is-animated position-relative text-white">
  24.   <div class="hero__media ratio ratio-21x9">
  25.     <img src="{{ asset('img/offer/' ~ offer.file ~ '/' ~ offer.slug ~ '/' ~ offer.img) }}"
  26.          alt="{{ offer.title }}"
  27.          class="hero__img object-fit-cover w-100 h-100">
  28.   </div>
  29.   <div class="hero__overlay hero__overlay--left">
  30.     <div class="container">
  31.       <div class="hero__card" style="max-width: 760px;">
  32.         <h1 class="hero__title display-5 fw-bold txt-ot-yellow mb-1">{{ offer.title }}</h1>
  33.         <p class="hero__subtitle mb-3">{{ offer.subtitle }}</p>
  34.         <div class="d-flex flex-wrap align-items-center gap-2 mb-3">
  35.           <span class="badge bg-ot-green">{{ offer.durationText }}</span>
  36.           <span class="badge text-bg-light">{{ offer.dateText }}</span>
  37.           <span class="badge text-bg-light">À partir de {{ offer.priceFrom }}€</span>
  38.         </div>
  39.         <div class="mb-3">
  40.           <h6 class="fw-bold txt-ot-yellow mb-2">Inclus :</h6>
  41.           <ul class="list-unstyled mb-0">
  42.             {% for line in offer.includedText|split("\n") %}
  43.               <li class="mb-1">✔️ {{ line }}</li>
  44.             {% endfor %}
  45.           </ul>
  46.         </div>
  47.         <div class="hero__actions" style="justify-content:flex-start;">
  48.           <a href="{{ path('o.devis') }}" class="btn btn-primary rounded-pill">Demander un devis</a>
  49.           {% if offer.brochure %}
  50.             <a href="{{ asset(offer.brochure) }}" target="_blank" class="btn btn-outline-ot-green rounded-pill">
  51.               Télécharger la brochure
  52.             </a>
  53.           {% endif %}
  54.         </div>
  55.       </div>
  56.     </div>
  57.   </div>
  58. </section>
  59. {# =====================================================
  60.    3) INFOS CLÉS — Durée/Dates · Vols · Rythme · Prix
  61. ===================================================== #}
  62. <section class="py-5 bg-body-tertiary">
  63.   <div class="container">
  64.     <div class="row g-3 g-md-4 row-cols-1 row-cols-md-2 row-cols-lg-4">
  65.       <div class="col">
  66.         <div class="card h-100 border-0 shadow-sm rounded-4"><div class="card-body">
  67.           <h3 class="h6 txt-ot-yellow fw-bold mb-1">Durée & dates</h3>
  68.           <p class="mb-0 text-muted">{{ offer.summaryDuration }}</p>
  69.         <p class="mb-0 text-muted">{{ offer.dateText }}</p>
  70.         </div></div>
  71.       </div>
  72.       <div class="col">
  73.         <div class="card h-100 border-0 shadow-sm rounded-4"><div class="card-body">
  74.           <h3 class="h6 txt-ot-yellow fw-bold mb-1">Vols</h3>
  75.            <ul class="list-unstyled mb-0">
  76.         {% for line in offer.summaryFlights|split("\n") %}
  77.                 {% if line|trim != '' %}
  78.                  <li class="mb-1">{{ line }}</li> 
  79.                 {% endif %}
  80.         {% endfor %}
  81.       </ul>
  82.         </div></div>
  83.       </div>
  84.       <div class="col">
  85.         <div class="card h-100 border-0 shadow-sm rounded-4"><div class="card-body">
  86.           <h3 class="h6 txt-ot-yellow fw-bold mb-1">Rythme & repas</h3>
  87.             <ul class="list-unstyled mb-0">
  88.           {% for line in offer.summaryPaceMeals|split("\n") %}
  89.                 {% if line|trim != '' %}
  90.                  <li>{{ line }}</li> 
  91.                 {% endif %}
  92.         {% endfor %}
  93.       </ul>
  94.         </div></div>
  95.       </div>
  96.       <div class="col">
  97.         <div class="card h-100 border-0 shadow-sm rounded-4"><div class="card-body">
  98.           <h3 class="h6 txt-ot-yellow fw-bold mb-1">Tarif dès</h3>
  99.           <p class="small text-muted mb-0">{{ offer.priceFrom }}€</p>
  100.         </div></div>
  101.       </div>
  102.     </div>
  103.   </div>
  104. </section>
  105. {# =====================================================
  106.    2) POINTS FORTS — 3 à 6 cartes icônes
  107. ===================================================== #}
  108. <section class="py-5 bg-white">
  109.   <div class="container">
  110.     <div class="row">
  111.     <div class="col-md-6 p-5">
  112.     {% if offer.highlightTitle %}
  113.     <h2 class="h3 txt-ot-yellow fw-bold mb-3">
  114.     {{offer.highlightTitle }}
  115.     {% else %}
  116.     Les incontournables de votre voyage
  117.     {% endif %}
  118.     </h2>
  119.            <p class="text-muted">
  120.            {% if offer.highlightText %}
  121.            {{offer.highlightText }}
  122.            {% else %}
  123.           Chaque étape de ce circuit a été pensée pour vous offrir une immersion
  124.           authentique et des souvenirs inoubliables. Entre paysages iconiques,
  125.           découvertes culturelles et activités exclusives, voici ce qui rend ce voyage unique.
  126.           {% endif %}
  127.         </p>
  128.     </div>
  129.     <div class="col-md-6">
  130.     <div class="row g-3">
  131.   <div class="d-flex flex-column gap-3">
  132.   {% for h in highlight %}
  133.     <div class="card border-0 shadow-sm rounded-4">
  134.       <div class="card-body">
  135.         <h3 class="h6 fw-semibold mb-1">{{ h.title }}</h3>
  136.         {% if h.details %}
  137.           <p class="small text-muted mb-0">{{ h.details}}</p>
  138.         {% endif %}
  139.       </div>
  140.     </div>
  141.   {% endfor %}
  142. </div>
  143.     </div>
  144. </div>
  145.   </div>
  146. </section>
  147. {# =====================================================
  148.    4) ITINÉRAIRE — Timeline jour par jour (collapses)
  149. ===================================================== #}
  150. <section class="py-5 bg-white" id="itineraire">
  151.   <div class="container">
  152.     <div class="row align-items-center g-4"> {# align-items-center = centrage vertical #}
  153.       {# COLONNE GAUCHE — CAROUSEL #}
  154.       <div class="col-12 col-lg-6 d-flex">
  155.         <div class="w-100 d-flex align-items-center">
  156.           <div id="circuitCarousel"
  157.                class="carousel slide rounded-4 overflow-hidden shadow-sm w-100"
  158.                data-bs-ride="carousel"
  159.                data-bs-interval="5000"
  160.                data-bs-pause="hover"
  161.                data-bs-touch="true"
  162.                aria-label="Galerie circuit">
  163.             <div class="carousel-inner">
  164.               {% for p in photoItinerary %}
  165.                 <div class="carousel-item {% if loop.first %}active{% endif %}">
  166.                   <div class="ratio ratio-4x3">
  167.                     <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 }}">
  168.                   </div>
  169.                 </div>
  170.               {% endfor %}
  171.             </div>
  172.             <button class="carousel-control-prev" type="button" data-bs-target="#circuitCarousel" data-bs-slide="prev">
  173.               <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  174.               <span class="visually-hidden">Précédent</span>
  175.             </button>
  176.             <button class="carousel-control-next" type="button" data-bs-target="#circuitCarousel" data-bs-slide="next">
  177.               <span class="carousel-control-next-icon" aria-hidden="true"></span>
  178.               <span class="visually-hidden">Suivant</span>
  179.             </button>
  180.             <div class="carousel-indicators">
  181.               {% for p in photoItinerary %}
  182.                 <button type="button"
  183.                         data-bs-target="#circuitCarousel"
  184.                         data-bs-slide-to="{{ loop.index0 }}"
  185.                         class="{% if loop.first %}active{% endif %}"
  186.                         aria-current="{{ loop.first ? 'true' : 'false' }}"
  187.                         aria-label="Slide {{ loop.index }}"></button>
  188.               {% endfor %}
  189.             </div>
  190.           </div>
  191.         </div>
  192.       </div>
  193.       {# COLONNE DROITE — ITINÉRAIRE #}
  194.       <div class="col-12 col-lg-6">
  195.         <h2 class="h3 txt-ot-yellow fw-bold mb-3">Itinéraire jour par jour</h2>
  196.         <div class="list-group list-group-flush">
  197.           {% for it in itinerary %}
  198.             <div class="list-group-item px-0">
  199.               <button class="btn w-100 d-flex justify-content-between align-items-center text-start"
  200.                       data-bs-toggle="collapse" data-bs-target="#day{{ loop.index }}" aria-expanded="false">
  201.                 <span class="fw-bold">Jour {{loop.index}} - {{it.title }}{% if it.kmLabel %} <span class="text-muted fw-normal"> ({{ it.kmLabel }}) km</span>{% endif %}</span>
  202.                 <i class="bi bi-chevron-down"></i>
  203.               </button>
  204.               <div id="day{{ loop.index }}" class="collapse mt-2">
  205.                 <p class="small text-muted mb-0">{{ it.details }}</p>
  206.               </div>
  207.             </div>
  208.           {% endfor %}
  209.         </div>
  210.       </div>
  211.     </div>
  212.   </div>
  213. </section>
  214. {% if hebergementOffer %}
  215. {# =====================================================
  216.    5) HÔTELS — liste ou tableau simple
  217. ===================================================== #}
  218. <section class="py-5 bg-body-tertiary" id="hotels">
  219.   <div class="container">
  220.     <h2 class="h3 txt-ot-yellow fw-bold mb-3">Hébergements prévus (ou similaires)</h2>
  221.     <ul class="list-group">
  222.       {% for h in hebergementOffer %}<li class="list-group-item">{{ h.name }}</li>{% endfor %}
  223.     </ul>
  224.   </div>
  225. </section>
  226. {% endif %}
  227. {% if offer.widget %}
  228. <div class="container">
  229.   <h2 class="h3 txt-ot-yellow fw-bold mb-3">Activités</h2>
  230. <div class="widget">
  231.   {{offer.widget|raw}}
  232. </div>
  233. </div>
  234. {% endif %}
  235. {% if included %}
  236. {# =====================================================
  237.    6) INCLUS / NON INCLUS — deux colonnes
  238. ===================================================== #}
  239. <section class="py-5 bg-white" id="inclus">
  240.   <div class="container">
  241.     <div class="row g-4">
  242.       <div class="col-12 col-lg-6">
  243.         <div class="card border-0 shadow-sm rounded-4 h-100">
  244.           <div class="card-body">
  245.             <h2 class="h5 fw-bold txt-ot-yellow">Inclus</h2>
  246.             <ul class="small mb-0 list-unstyled">
  247.              {% for line in offer.included|split("\n") %}
  248.               <li class="mb-1">✔️ {{ line }}</li>
  249.             {% endfor %}
  250.             </ul>
  251.           </div>
  252.         </div>
  253.       </div>
  254.       <div class="col-12 col-lg-6">
  255.         <div class="card border-0 shadow-sm rounded-4 h-100">
  256.           <div class="card-body">
  257.             <h2 class="h5 fw-bold txt-ot-yellow">Non inclus</h2>
  258.             <ul class="small mb-0 list-unstyled">
  259.             {% for line in offer.notIncluded|split("\n") %}
  260.               <li class="mb-1">- {{ line }}</li>
  261.             {% endfor %}
  262.             </ul>
  263.           </div>
  264.         </div>
  265.       </div>
  266.     </div>
  267.   </div>
  268. </section>
  269. {% endif %}
  270. {% if flight %}
  271. {# =====================================================
  272.    7) VOLS & HORAIRES — bloc détaillé
  273. ===================================================== #}
  274. <section class="py-5 bg-body-tertiary" id="vols">
  275.   <div class="container">
  276.     <h2 class="h3 txt-ot-yellow fw-bold mb-3">Vols & horaires (indicatifs)</h2>
  277.     <div class="row g-4">
  278.       <div class="col-12 col-lg-6">
  279.         <div class="card border-0 shadow-sm rounded-4 h-100">
  280.           <div class="card-body">
  281.             <h3 class="h6 fw-bold mb-2">Aller</h3>
  282.             <ul class="small mb-0">
  283.               {% for f in flight %}
  284.               {% if f.type == '1' %}
  285.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  286.             {% endif %}
  287.               {% endfor %}
  288.             </ul>
  289.           </div>
  290.         </div>
  291.       </div>
  292.       <div class="col-12 col-lg-6">
  293.         <div class="card border-0 shadow-sm rounded-4 h-100">
  294.           <div class="card-body">
  295.             <h3 class="h6 fw-bold mb-2">Retour</h3>
  296.             <ul class="small mb-0">
  297.               {% for f in flight %}                
  298.                  {% if f.type == '2' %}
  299.                 <li>{{ f.departureCity }} → {{ f.departureCity }}  {{f.departureTime}} / {{f.arrivalTime}} </li>
  300.             {% endif %}
  301.               {% endfor %}
  302.             </ul>
  303.           </div>
  304.         </div>
  305.       </div>
  306.     </div>
  307.     <p class="small text-muted mt-3 mb-0">Horaires et compagnies susceptibles d’évolution. À confirmer à l’émission des billets.</p>
  308.   </div>
  309. </section>
  310.   {% endif %}
  311. {# =====================================================
  312.    8) TARIFS — tableau + bases pax
  313. ===================================================== #}
  314. {#<section class="py-5 bg-white" id="tarifs">
  315.   <div class="container">
  316.     <h2 class="h3 txt-ot-yellow fw-bold mb-3">Tarifs</h2>
  317.     <div class="table-responsive">
  318.       <table class="table align-middle">
  319.         <thead><tr><th>Occupation</th><th>Tarif</th><th>Base</th></tr></thead>
  320.         <tbody>
  321.           {% set prices = circuit.prices|default([
  322.             {label:'Double', price:'3390€', base:'31 pax'},
  323.             {label:'Triple', price:'3860€', base:'31 pax'},
  324.             {label:'Quad', price:'3840€', base:'31 pax'},
  325.             {label:'Single', price:'3890€', base:'31 pax'}
  326.           ]) %}
  327.           {% for p in prices %}
  328.           <tr><td>{{ p.label }}</td><td>{{ p.price }}</td><td>{{ p.base }}</td></tr>
  329.           {% endfor %}
  330.         </tbody>
  331.       </table>
  332.     </div>
  333.     <p class="small text-muted mb-0">Base modifiable : ex. <strong>+245€</strong>/pers si 29–20 pax. Sous réserve de disponibilité & modifications.</p>
  334.   </div>
  335. </section> #}
  336. {% if infos %}
  337. {# =====================================================
  338.    9) FACILITÉS DE PAIEMENT — encart
  339. ===================================================== #}
  340. <section class="py-5 bg-body-tertiary" id="paiement">
  341.   <div class="container">
  342.   <div class="row g-4">
  343.     <div class="col-12 col-lg-6">
  344.     <div class="card border-0 shadow-sm rounded-4">
  345.       <div class="card-body">
  346.         <h2 class="h5 fw-bold txt-ot-yellow">Facilités de paiement</h2>
  347.         <ul class="small mb-0">
  348.             {% for line in offer.paymentMethod|split("\n") %}
  349.               <li class="mb-1">✔️ {{ line }}</li>
  350.             {% endfor %}
  351.         </ul>
  352.       </div>
  353.     </div>
  354.     </div>
  355.       <div class="col-12 col-lg-6">
  356.     <div class="card border-0 shadow-sm rounded-4">
  357.       <div class="card-body">
  358.         <h2 class="h5 fw-bold txt-ot-yellow">Formalités</h2>
  359.         <ul class="small mb-0">
  360.             {% for line in offer.formalities|split("\n") %}
  361.               <li class="mb-1">✔️ {{ line }}</li>
  362.             {% endfor %}
  363.         </ul>
  364.       </div>
  365.     </div>
  366.      </div> 
  367. </div>
  368.   </div>
  369. </section>
  370. {% endif %}
  371. {# =====================================================
  372.    11) CTA FINAL — devis & contact
  373. ===================================================== #}
  374. <section class="py-5 bg-ot-green text-white text-center">
  375.   <div class="container">
  376.     <h2 class="h4 fw-bold mb-2">Envie de rejoindre le {{offer.title}} ?</h2>
  377.     <p class="mb-4">Parlez à un conseiller Otropik : on s’occupe de tout.</p>
  378.     <div class="d-flex gap-2 justify-content-center flex-wrap">
  379.       <a href="{{ path('o.devis') }}" class="btn btn-light rounded-pill">Demander un devis</a>
  380.       <a href="tel:0590505134" class="btn btn-outline-light rounded-pill">Appeler</a>
  381.     </div>
  382.   </div>
  383. </section>
  384. {% endblock %}