Une erreur s'est produite lors du traitement du gabarit.
Failed to "?eval" string with this error: ---begin-message--- Syntax error in ?eval-ed string in line 1, column 453: Encountered "}", but was expecting one of: <STRING_LITERAL> <RAW_STRING> "false" "true" <INTEGER> <DECIMAL> "." "+" "-" "!" "[" "(" "{" <ID> ---end-message--- The failing expression: ==> Texte1szp.getData()?eval [in template "20097#20123#37023070" at line 159, column 14] ---- FTL stack trace ("~" means nesting-related): - Failed at: #list Texte1szp.getData()?eval.faq as... [in template "20097#20123#37023070" at line 159, column 7] ----
1<div id="first">
2 <div class="container custom-container">
3 <div class="row section">
4 <div class="col-md-8 p-3">
5 <div class="text-white">
6 <h1>${Titre.getData()}</h1>
7 <p class="title-desc">${ZoneDeSaisie1x48.getData()}</p>
8 </div>
9 </div>
10 <div id="background-image"></div>
11 <div class="diagonal-divider"></div>
12 </div>
13 </div>
14</div>
15<div class="container">
16 <#attempt>
17 <#assign offerLocalService = serviceLocator.findService("com.totemia.commerce.type.offer.service.OfferLocalService")>
18 <#assign produits = offerLocalService.searchProducts(Texteq55r.getData(), themeDisplay) >
19 <div class="row justify-content-center align-items-center mt-4 mb-2">
20 <#if produits?size == 0>
21 <div class="col">
22 <div class="d-flex text-center"> <i class="fa fa-exclamation-triangle" style="margin-top: 3px;
23 margin-right: 10px;color: orange;"></i><h4>Catalogue en cours d'intégration pour cette catégorie</h4></div>
24
25 <p class="text-center">N'hésitez pas à nous contacter par téléphone au
26 <a href="tel:+33176381092">01 76 38 10 92</a>, par email à
27 <a href="mailto:contact@totemia.com">contact@totemia.com</a>
28 ou à demander un rappel via le formulaire ci-dessous pour bénéficier de nos conseils et vous inscrire sur liste d'attente.
29 </p>
30
31 <div id="recalled-form"></div>
32
33
34 </div>
35 <img
36 src="https://totemia.com/documents/37901/0/sad_cat.gif/ce486981-2149-275f-3b95-74f21a62e914?t=1710349975702"
37 alt="Sad gif" class="gif-responsive">
38 <style>
39 .gif-responsive {
40 max-width: 100%; /* La largeur maximale de l'image sera de 100% de la largeur de son conteneur parent */
41 height: auto; /* La hauteur sera ajustée automatiquement pour conserver les proportions de l'image */
42 display: block; /* Assurez-vous que l'image est un élément de bloc pour respecter les marges et les paddings */
43 margin: auto; /* Centrez l'image horizontalement dans son conteneur parent */
44 }
45 </style>
46 <#else>
47 <span class="h3 text-center">Nos séjours coups de cœur </span>
48 <i class="fa fa-heart text-secondary ml-2 mb-2"></i>
49 </#if>
50 </div>
51 <div class="row justify-content-center">
52 <#list produits as produit>
53 <#assign productName = produit.getProductName()>
54 <#assign url = "${produit.getUrl()}" >
55 <#assign img = "${produit.getImg()}" >
56 <#assign id = "${produit.getCPDefinitionId()}" >
57 <#assign shortDesc = "${produit.getShortDesc()}" >
58 <#assign min = produit.getAgeMin() >
59 <#assign max = produit.getAgeMax() >
60 <#assign address = produit.getAddress() >
61 <#assign cat = produit.getCatName() >
62 <#assign price = produit.getMinPrice()>
63 <#assign promo = produit.getMinPromoPrice()>
64 <#assign isPromo = produit.getMinPrice() != produit.getMinPromoPrice()
65 && produit.getMinPromoPrice() != "0">
66
67 <div class="col-sm-6 col-xl-4 mb-3 hover-animate p-0 p-md-2">
68 <a href="${url}" class="text-decoration-none">
69 <div class="card h-100 shadow">
70 <img loading="lazy" class="card-img-top overflow-hidden gradient-overlay" src="${img}"
71 alt="${productName}">
72 <#if isPromo >
73 <div class="card-img-overlay-top text-left">
74 <span style="margin-right:2px;" class="badge summercamp">Promotion</span>
75 </div>
76 </#if>
77 <div class="d-flex text-right font-weight-bold position-relative">
78 <div class="card-img-overlay-bottom z-index-20">
79 <div class="text-white text-sm">
80 <div class="media-body">
81 <#if isPromo >
82 <span class="card-text text-muted position-relative mb-0">À partir de
83 <span style="text-decoration: line-through;"
84 class="text-dark text-sm">${price}€
85 </span>
86 <span class="h4 promo-price">
87 ${promo}€
88 </span>
89 </span>
90 <#else>
91 <span class="card-text text-muted position-relative mb-0"> À partir de <span
92 class="h4">${price}€</span></span>
93 </#if>
94 </div>
95 </div>
96 </div>
97 </div>
98 <div class="d-flex px-3 pt-2 justify-content-start overflow-hidden">
99 <span title="14-17 ans" class="badge badge-secondary-light">${min}-${max} ans</span>
100 <span title="${cat}" class="badge badge-secondary-light">${cat}</span>
101 </div>
102 <div class="px-3 py-1">
103 <span
104 class="text-decoration-none text-dark font-weight-bold text-xs"> REF. ${id} </span><br>
105 <span class="card-title mb-0 h5">
106 <span class="text-decoration-none text-uppercase text-dark"
107 style="letter-spacing: 0;">${address}</span>
108 </span><br>
109 <span class="card-title mb-1">
110 <span class="text-decoration-none text-dark"> ${productName} </span>
111 </span>
112 <div class="trustpilot-widget mb-1 trustbox-catalog" data-locale="fr-FR"
113 data-template-id="577258fb31f02306e4e3aaf9"
114 data-businessunit-id="619ccea0823eff5b62bdd9f3" data-style-height="24px"
115 data-style-width="100%" data-theme="light" data-sku="${id}"
116 data-no-reviews="hide" data-scroll-to-list="true"
117 data-style-alignment="left"></div>
118 </div>
119 <div class="card-body px-3 py-0">
120 <div class="d-flex card-subtitle mb-3">
121 <span style="max-height: 75px;overflow: hidden;"
122 class="flex-grow-1 mb-0 text-muted text-xs font-weight-normal">${shortDesc} </span>
123 </div>
124 </div>
125 <span class="p-2 bg-primary text-center text-white btn-see-offer"> Voir l'offre <i
126 class="fa fa-arrow-right ml-2"></i></span>
127 </div>
128 </a>
129 </div>
130
131 </#list>
132 </div>
133 <#recover>
134 </#attempt>
135 <style>
136 .card-img-overlay-bottom {
137 position: absolute;
138 right: 0;
139 bottom: 10px;
140 background: white;
141 padding: 5px 15px;
142 border-radius: 10px 0px 0px 10px;
143 }
144 </style>
145 <#if produits?size != 0>
146 <div class="text-right d-flex align-items-center justify-content-end mb-4">
147 <a class="h3 text-secondary pr-3 mb-0" href="${Texteq55r.getData()}">Découvrir tous les
148 séjours ${Titre.getData()}</a>
149 <i class="fa text-secondary fa-arrow-right"></i>
150 </div>
151 </#if>
152 <div class="article mt-5 p-1 p-md-3">
153 ${HTML1yo0.getData()}
154 </div>
155 <#if Texte1szp?? && Texte1szp.getData()?has_content>
156 <div class="row justify-content-center">
157 <h2 class="">FAQ ${Titre.getData()}</h2>
158 <div class="accordion">
159 <#list Texte1szp.getData()?eval.faq as item>
160 <div class="accordion-item" itemscope itemprop="mainEntity"
161 itemtype="https://schema.org/Question">
162 <button aria-expanded="false">
163 <h3 itemprop="name" class="accordion-title h4 p-1">${item.question}</h3>
164 <span class="icon" aria-hidden="true"></span>
165 </button>
166 <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"
167 class="accordion-content">
168 <p itemprop="text" class="h5 p-4 font-weight-normal m-0">${item.answer}</p>
169 </div>
170 </div>
171 </#list>
172 </div>
173 <style>
174 .accordion .accordion-item {
175 border-bottom: 1px solid #212529;
176 }
177
178 .accordion .accordion-item button[aria-expanded=true] {
179 border-bottom: 1px solid #212529;
180 }
181
182 .accordion button {
183 position: relative;
184 display: block;
185 text-align: left;
186 width: 100%;
187 padding: 1em 0;
188 font-size: 1.15rem;
189 font-weight: 400;
190 border: none;
191 background: none;
192 outline: none;
193 }
194
195 .accordion button:hover, .accordion button:focus {
196 cursor: pointer;
197 color: #e83e8c;
198 }
199
200 .accordion button:hover::after, .accordion button:focus::after {
201 cursor: pointer;
202 color: #e83e8c;
203 border: 1px solid #e83e8c;
204 }
205
206 .accordion button .accordion-title {
207 padding: 1em 1.5em 1em 0;
208 }
209
210 .accordion button .icon {
211 display: inline-block;
212 position: absolute;
213 top: 18px;
214 right: 0;
215 width: 22px;
216 height: 22px;
217 border: 1px solid;
218 border-radius: 22px;
219 }
220
221 .accordion button .icon::before {
222 display: block;
223 position: absolute;
224 content: "";
225 top: 9px;
226 left: 5px;
227 width: 10px;
228 height: 2px;
229 background: currentColor;
230 }
231
232 .accordion button .icon::after {
233 display: block;
234 position: absolute;
235 content: "";
236 top: 5px;
237 left: 9px;
238 width: 2px;
239 height: 10px;
240 background: currentColor;
241 }
242
243 .accordion button[aria-expanded=true] {
244 color: #212529;
245 }
246
247 .accordion button[aria-expanded=true] .icon::after {
248 width: 0;
249 }
250
251 .accordion button[aria-expanded=true] + .accordion-content {
252 opacity: 1;
253 max-height: 200em;
254 transition: all 200ms linear;
255 will-change: opacity, max-height;
256 }
257
258 .accordion .accordion-content {
259 opacity: 0;
260 max-height: 0;
261 overflow: hidden;
262 transition: opacity 200ms linear, max-height 200ms linear;
263 will-change: opacity, max-height;
264 }
265
266 .accordion .accordion-content p {
267 font-size: 1rem;
268 margin: 2em 0;
269 }
270 </style>
271 <script>
272 let items = document.querySelectorAll(".accordion button");
273
274 function toggleAccordion() {
275 const itemToggle = this.getAttribute("aria-expanded");
276
277 for (i = 0; i < items.length; i++) {
278 items[i].setAttribute("aria-expanded", "false");
279 }
280
281 if (itemToggle == "false") {
282 this.setAttribute("aria-expanded", "true");
283 }
284 }
285
286 items.forEach((item) => item.addEventListener("click", toggleAccordion));
287
288 var element = document.getElementsByClassName("trustpilot-widget");
289 for(var i=0; i<element.length; i++) {
290 window.Trustpilot.loadFromElement(element[i]);
291 }
292 </script>
293 </#if>
294
295 </div>
296 <style>
297 .article img {
298 max-width: -webkit-fill-available;
299 object-fit: cover;
300 }
301
302 #first {
303 background: #1e2c63; /* Couleur de fond */
304 position: relative;
305 overflow: hidden;
306 position: relative;
307 }
308
309 <#if (Image29wz.getData())?? && Image29wz.getData() != "">
310 <#assign backgroundImage = '${Image29wz.getData()}'>
311 <#assign extraStyle = '-4%'>
312 <#else>
313 <#assign backgroundImage = 'https://totemia.com/documents/37901/0/homepage_page_cat.jpg/0fb81309-6f8e-91af-aafe-4c6e44de0ec2?t=1707217228005'>
314 <#assign extraStyle = '0%'>
315 </#if>
316 #background-image {
317 background: url('${backgroundImage}');
318 background-size: cover; /* Redimensionnement de l'image */
319 background-position: right; /* Position de l'image à droite */
320 position: absolute;
321 top: 0;
322 right: ${extraStyle}; /* Commence à droite et en dehors du conteneur */
323 height: 100%; /* Hauteur de l'image égale à celle du conteneur */
324 width: 30%; /* Largeur de l'image égale à celle du conteneur */
325 }
326
327 .section {
328 color: white; /* Couleur du texte */
329 }
330
331 .diagonal-divider::before {
332 content: '';
333 position: absolute;
334 top: 0;
335 right: 25%;
336 width: 10%;
337 height: 100%;
338 background-color: #1e2c63; /* Couleur de fond */
339 transform: skew(-15deg); /* Inclinaison diagonale */
340 z-index: 1; /* Place le pseudo-élément au-dessus du contenu */
341 }
342
343 .section-content {
344 position: relative; /* Position relative pour le z-index */
345 z-index: 2; /* Place le contenu au-dessus de la démarcation */
346 }
347
348 .title-desc {
349 margin-bottom: 0 !important;
350 }
351
352 @media (max-width: 767.98px) {
353 .diagonal-divider {
354 display: none; /* Masquer l'image sur les écrans de petite taille (mobile) */
355 }
356
357 #background-image {
358 position: relative;
359 width: 100%;
360 }
361
362 .title-desc {
363 font-size: 0.7rem;
364 }
365
366 .section div {
367 text-align: center !important;
368 }
369 }
370
371 .breadcrumb {
372 margin: 0;
373 padding-bottom: 0;
374 }
375 </style>
376
377 <script>
378
379 function onVariableExist(varName, callback) {
380 // Création d'un intervalle pour vérifier l'existence de la variable
381 const checkExist = setInterval(() => {
382 if (typeof window[varName] !== 'undefined') { // Vérifie si la variable existe dans l'objet global `window`
383 clearInterval(checkExist); // Arrête l'intervalle
384 callback(window[varName]); // Exécute la fonction callback en passant la variable en argument
385 }
386 }, 100); // Vérification toutes les 100ms
387 }
388
389 // Utilisation de la fonction pour détecter la variable "myVariable"
390 onVariableExist('hbspt', function(value) {
391 console.log("La variable 'myVariable' existe maintenant avec la valeur :", value);
392 // Ajoutez ici le code que vous souhaitez exécuter lorsque la variable existe
393 hbspt.forms.create({
394 region: "na1",
395 portalId: "8587022",
396 formId: "dedc835c-9a30-443a-9029-77321fc48d33",
397 target: '#recalled-form',
398 });
399 });
400 </script>