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