Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing:
==> embed.descrizioneEmbedAudio [in template "1315478#1315513#1674222" at line 409, column 290]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #if (embed.AudioFields.titoloEmbedAud... [in template "1315478#1315513#1674222" at line 409, column 137]
----
1<#include "_TEMPLATE_CONTEXT_/1315478/1331017/23609/1656602">
2
3<#assign
4 articleId = .vars['reserved-article-id'].data
5 territorioCategories = getContentVocabularyCategories(articleId, "TERRITORIO", groupId)
6 sliderCategories = []
7 slides = 0
8 hasSlides = false
9 hasGallery = false
10 hasDownloads = false
11 lat = 0
12 lng = 0
13
14 groupedCategories = getNavCircCategories(articleId, groupId)
15/>
16
17<#-- MASONRY -->
18<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.js"></script>
19
20<#list territorioCategories as tCat>
21 <#if tCat.parentCategoryId != 0>
22 <#assign sliderCategories += [tCat.name]>
23 </#if>
24</#list>
25
26<#if tourismItem.geoRef.getData()?has_content>
27 <#assign
28 geoObj = createObject(tourismItem.geoRef.getData())
29 lat = geoObj.getDouble("latitude")
30 lng = geoObj.getDouble("longitude")
31 />
32</#if>
33
34<#if tourismItem.coordinateTestuali.getData()?has_content>
35 <#assign
36 lat = tourismItem.coordinateTestuali.getData()?keep_before(",")?number
37 lng = tourismItem.coordinateTestuali.getData()?keep_after(",")?number
38 />
39</#if>
40
41<#if tourismItem.slideHeader?? && tourismItem.slideHeader.getSiblings()?has_content>
42 <#list tourismItem.slideHeader.getSiblings() as slide>
43 <#if slide.getData()?has_content>
44 <#assign
45 hasSlides = true
46 slides = tourismItem.slideHeader.getSiblings()?size
47 />
48 <#break>
49 </#if>
50 </#list>
51</#if>
52
53<#if tourismItem.ImmagineGallery?? && tourismItem.ImmagineGallery.getSiblings()?has_content>
54 <#list tourismItem.ImmagineGallery.getSiblings() as item>
55 <#if item.getData()?has_content>
56 <#assign hasGallery = true>
57 <#break>
58 </#if>
59 </#list>
60</#if>
61
62<#if tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet?? && tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings()?has_content>
63 <#list tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings() as item>
64 <#if item.downloadUrl.getData()?has_content>
65 <#assign hasDownloads = true>
66 <#break>
67 </#if>
68 </#list>
69</#if>
70
71<!-- Modello punto di interesse -->
72
73<div id="${portletNamespace}" v-cloak>
74
75 <#if themeDisplay.getLayout().getAncestors()?has_content>
76 <section id="breadcrumb" class="mt-4">
77 <div class="container-fluid custom-container d-flex align-items-center">
78 <ol class="breadcrumb tw-space-x-2">
79 <li class="breadcrumb-item">
80 <a href="/" class="breadcrumb-link" title="Home">
81 <span class="breadcrumb-text-truncate tw:text-dark tw:uppercase">Home</span>
82 </a>
83 </li>
84
85 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor>
86 <li class="breadcrumb-item">
87 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${escape(ancestor.getHTMLTitle(themeDisplay.getLocale()))}">
88 <span class="breadcrumb-text-truncate tw:text-dark tw:uppercase">${escape(ancestor.getHTMLTitle(themeDisplay.getLocale()))}</span>
89 </a>
90 </li>
91 </#list>
92
93 <li class="breadcrumb-item active">
94 <span class="tw:text-green tw:uppercase" title="${tourismItem.title.getData()?js_string}">
95 ${tourismItem.title.getData()}
96 </span>
97 </li>
98 </ol>
99
100 <div class="d-flex align-items-center ml-auto">
101 <button type="button" @click="isFavorite(item.id) ? removeFavorite(item) : setFavorite(item);" class="btn btn-link tw:no-underline" :title="isFavorite(item.id) ? `${getLabel('rimuovi_preferiti', groupId)}` : `${getLabel('aggiungi_preferiti', groupId)}`">
102 <i :class="(isFavorite(item.id) ? 'fas' : 'fal') + ' fa-heart fa-2x tw:text-green'"></i>
103 </button>
104
105 <div class="btn dropdown tw:px-0">
106 <button type="button" class="btn btn-link dropdown-toggle tw:no-underline tw:text-green" data-toggle="dropdown">
107 <i class="fas fa-share-alt fa-2x"></i>
108 </button>
109 <div class="dropdown-menu dropdown-menu-center">
110 <button type="button" @click="customShare('facebook', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
111 <i class="fab fa-facebook-f fa-lg tw:text-green"></i>
112 <span class="tw:text-dark">
113 Facebook
114 </span>
115 </button>
116
117 <button type="button" @click="customShare('twitter', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
118 <i class="fab fa-twitter fa-lg tw:text-green"></i>
119 <span class="tw:text-dark">
120 Twitter
121 </span>
122 </button>
123
124 <button type="button" @click="customShare('pinterest', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
125 <i class="fab fa-pinterest fa-lg tw:text-green"></i>
126 <span class="tw:text-dark">
127 Pinterest
128 </span>
129 </button>
130
131 <button type="button" @click="customShare('whatsapp', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
132 <i class="fab fa-whatsapp fa-lg tw:text-green"></i>
133 <span class="tw:text-dark">
134 WhatsApp
135 </span>
136 </button>
137
138 <button type="button" @click="customShare('telegram', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
139 <i class="fab fa-telegram fa-lg tw:text-green"></i>
140 <span class="tw:text-dark">
141 Telegram
142 </span>
143 </button>
144
145 <button type="button" @click="customShare('print', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
146 <i class="fas fa-print fa-lg tw:text-green"></i>
147 <span class="tw:text-dark">
148 Print
149 </span>
150 </button>
151
152 <a :href="'mailto:inserisci indirizzo email?subject=' + item.contentJSON.title + '&body=${currentUrl} ' + item.contentJSON.description" class="dropdown-item tw:space-x-2">
153 <i class="fas fa-envelope fa-lg tw:text-green"></i>
154 <span class="tw:text-dark">
155 Email
156 </span>
157 </a>
158
159 <button type="button" @click="customShare('link', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
160 <i class="fas fa-link fa-lg tw:text-green"></i>
161 <span class="tw:text-dark">
162 Link
163 </span>
164 </button>
165 </div>
166 </div>
167 </div>
168 </div>
169 </section>
170 </#if>
171
172 <section id="slideshow" class="container-fluid custom-container">
173 <div class="swiper-container">
174 <div class="swiper-wrapper">
175 <#if hasSlides>
176 <#list tourismItem.slideHeader.getSiblings() as slide>
177 <div class="swiper-slide">
178 <img data-src="${getPrefix(slide.getData(), 1920, 730)}" loading="lazy" class="lazyload tw:object-cover" alt="${slide.getAttribute('alt')}"/>
179 <div class="card-img-overlay tw:bg-dark tw:bg-opacity-40"></div>
180
181 <div class="carousel-caption tw:flex tw:text-left tw:transform lg:tw:top-2/4 lg:tw:-translate-y-2/4">
182 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
183 <#assign locationClass = "tw:my-auto">
184 <#else>
185 <#assign locationClass = "tw:mt-auto tw:mb-20">
186 </#if>
187
188 <div class="tw:flex tw:flex-col ${locationClass}">
189 <div class="hcm-bg-capable tw:text-white tw:font-heading tw:uppercase tw:text-2xl tw:mr-auto tw:p-4 tw:rounded-md lg:tw:text-4xl">
190 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
191 <p>${tourismItem.testoHeader.getData()}</p>
192 <div class="dropdown-divider tw:border-green tw:border-t-3 tw:w-3/5 tw:mt-5 tw:mr-auto lg:tw:w-1/5 lg:tw:mt-10"></div>
193 </#if>
194 </div>
195 <#if sliderCategories?has_content>
196 <div class="tw:flex tw:mt-7">
197 <i class="fas fa-map-marker-alt fa-2x tw:text-white"></i>
198 <p class="tw:text-white tw:uppercase tw:font-heading tw:font-medium tw:my-auto tw:ml-3">
199 ${sliderCategories?join(", ")}
200 </p>
201 </div>
202 </#if>
203 </div>
204 </div>
205 </div>
206 </#list>
207 <#else>
208 <div class="swiper-slide">
209 <img data-src="https://via.placeholder.com/1920x730" loading="lazy" class="lazyload tw:object-cover tw:h-full tw:w-full" alt=""/>
210 <div class="card-img-overlay tw:bg-dark tw:bg-opacity-40"></div>
211
212 <div class="carousel-caption tw:flex tw:text-left tw:transform lg:tw:top-2/4 lg:tw:-translate-y-2/4">
213 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
214 <#assign locationClass = "tw:my-auto">
215 <#else>
216 <#assign locationClass = "tw:mt-auto tw:mb-20">
217 </#if>
218
219 <div class="tw:flex tw:flex-col ${locationClass}">
220 <div class="hcm-bg-capable tw:text-white tw:font-heading tw:uppercase tw:text-2xl tw:mr-auto tw:p-4 tw:rounded-md lg:tw:text-4xl">
221 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
222 <p>${tourismItem.testoHeader.getData()}</p>
223 <div class="dropdown-divider tw:border-green tw:border-t-3 tw:w-3/5 tw:mt-5 tw:mr-auto lg:tw:w-1/5 lg:tw:mt-10"></div>
224 </#if>
225 </div>
226
227 <#if territorioCategories?has_content>
228 <div class="tw:flex tw:mt-7">
229 <i class="fas fa-map-marker-alt fa-2x tw:text-white"></i>
230 <p class="tw:text-white tw:uppercase tw:font-heading tw:font-medium tw:my-auto tw:ml-3">
231 <#list territorioCategories as cat>
232 <#if cat.parentCategoryId != 0>
233 ${cat.name}
234
235 <#if cat?has_next>,</#if>
236 </#if>
237 </#list>
238 </p>
239 </div>
240 </#if>
241 </div>
242 </div>
243 </div>
244 </#if>
245 </div>
246 </div>
247 </section>
248
249 <section id="intro-description-image">
250 <div class="d-flex container-fluid custom-container">
251 <div class="tw:flex tw:mt-9 lg:tw:hidden">
252 <button type="button" @click="isFavorite(item.id) ? removeFavorite(item) : setFavorite(item);" class="btn btn-link tw:no-underline" :title="isFavorite(item.id) ? `${getLabel('rimuovi_preferiti', groupId)}` : `${getLabel('aggiungi_preferiti', groupId)}`">
253 <i :class="(isFavorite(item.id) ? 'fas' : 'fal') + ' fa-heart fa-lg tw:text-green'"></i>
254 </button>
255 <button type="button" @click="share(item.contentJSON.title, item.contentJSON.description)" class="btn btn-link tw:no-underline">
256 <i class="fas fa-share-alt fa-lg tw:text-green"></i>
257 </button>
258 </div>
259 </div>
260
261 <#if tourismItem.icona_pagina?? && tourismItem.icona_pagina.getData()?has_content>
262 <div class="d-none flex-justify-end mt-4">
263 <div class="pr-3 pb-3">
264 <div class="sticker sticker-circle sticker-lg">
265 <i class="${tourismItem.icona_pagina.getData()} fa-lg tw:text-dark"></i>
266 </div>
267 </div>
268 </div>
269 </#if>
270
271 <div class="d-flex container-fluid custom-container">
272 <div class="row mt-4 w-100">
273 <div class="col-12 col-lg-7">
274 <div>
275 <#if tourismItem.title?? && tourismItem.title.getData()?has_content>
276 <h1 class="mb-3">${tourismItem.title.getData()}</h1>
277 </#if>
278
279 <#if tourismItem.subTitle?? && tourismItem.subTitle.getData()?has_content>
280 <h3>${tourismItem.subTitle.getData()}</h3>
281 </#if>
282 </div>
283
284 <#if tourismItem.introDescription?? && tourismItem.introDescription.getData()?has_content>
285 <div class="text-dark mt-4">
286 ${tourismItem.introDescription.getData()}
287 </div>
288 </#if>
289
290 <#if InfoOrariFieldSet.InfoOrari?? && InfoOrariFieldSet.InfoOrari.getData()?has_content>
291 <div class="text-dark mt-4">
292 <span style="text-transform: uppercase;">${getLabel('orari')}</span><br/>
293 ${InfoOrariFieldSet.InfoOrari.getData()}
294 <#if InfoOrariFieldSet.InfoOrari.hideExtraInfo??>
295 <#if InfoOrariFieldSet.InfoOrari.hideExtraInfo.getData() != "true">
296 <i>${getLabel('nota-extra-info-orari')}</i>
297 </#if>
298 <#else>
299 <i>${getLabel('nota-extra-info-orari')}</i>
300 </#if>
301 </div>
302 </#if>
303
304
305
306 <@contatti/>
307
308 </div>
309
310 <div class="col-12 col-lg-5">
311 <div id="suggesto-map" class="map-image map-styled tw:z-10 tw:mt-10" style="height: 350px;"></div>
312 </div>
313 </div>
314 </div>
315 </section>
316
317
318 <#-- MASONRY GALLERY -->
319 <#if hasGallery>
320 <section id="gallery" class="mt-4">
321 <div class="container-fluid custom-container">
322 <div class="gallery-grid grid">
323 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
324 <div class="grid-item">
325 <a href="javascript:void(0);" data-toggle="modal" data-target="#lightbox-modal" data-slider="${pic?index}">
326 <img src="${getKitPrefix(pic.getData(), 'tr:w-900,fo-center')}" alt="${pic.getAttribute('alt')!''}" />
327 </a>
328 </div>
329 </#list>
330 </div>
331 </div>
332
333 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
334 <div class="modal-dialog modal-full-screen tw:inset-0 tw:border-none tw:shadow-none">
335 <div class="modal-content tw:bg-transparent">
336 <div class="modal-body tw:overflow-hidden">
337 <div class="tw:absolute tw:top-0 tw:right-0 tw:z-5">
338 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
339 <i class="fal fa-times fa-lg"></i>
340 </button>
341 </div>
342
343 <#-- lightbox -->
344 <div id="lightbox-swiper" class="swiper-container h-75 my-auto">
345 <div class="swiper-button-prev tw:w-12 tw:h-12">
346 <span class="sticker sticker-circle hcm-bg-capable tw:bg-green tw:w-full tw:h-full">
347 <span class="sticker-overlay">
348 <i class="fas fa-chevron-left fa-2x tw:text-white"></i>
349 </span>
350 </span>
351 </div>
352
353 <div class="swiper-button-next tw:w-12 tw:h-12">
354 <span class="sticker sticker-circle hcm-bg-capable tw:bg-green tw:w-full tw:h-full">
355 <span class="sticker-overlay">
356 <i class="fas fa-chevron-right fa-2x tw:text-white"></i>
357 </span>
358 </span>
359 </div>
360
361 <div class="swiper-wrapper tw:h-full">
362 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
363 <div class="swiper-slide tw:h-full">
364 <img data-src="${getPrefix(pic.getData(), 1920, '')}" loading="lazy" class="lazyload tw:h-full tw:object-contain tw:mx-auto" alt="${pic.getAttribute('alt')!''}">
365 </div>
366 </#list>
367 </div>
368 </div>
369
370 <#-- thumbnails -->
371 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider="">
372 <div class="swiper-wrapper">
373 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
374 <div class="swiper-slide">
375 <img data-src="${getPrefix(pic.getData(), 300, '')}" loading="lazy" class="lazyload tw:object-cover tw:cursor-pointer tw:h-full tw:w-full" alt="${pic.getAttribute('alt')!''}">
376 </div>
377 </#list>
378 </div>
379 </div>
380 </div>
381 </div>
382 </div>
383 </div>
384 </section>
385 </#if>
386
387 <#if tourismItem.descriptionFieldSet.description?? && tourismItem.descriptionFieldSet.description.getData()?has_content>
388 <section id="description" class="mt-5">
389 <div class="container-fluid custom-container">
390 <p class="tw:inline tw:text-dark tw:font-heading tw:font-extrabold tw:text-2xl tw:uppercase lg:tw:text-4xl">${getLabel('scopri-di-piu-parte1')}</p>
391 <p class="tw:inline tw:text-dark tw:font-heading tw:font-light tw:text-2xl tw:uppercase lg:tw:text-4xl">${getLabel('scopri-di-piu-parte2')}</p>
392 <div class="text-dark mt-5">
393 ${tourismItem.descriptionFieldSet.description.getData()}
394 </div>
395 </div>
396 </section>
397 </#if>
398
399 <#if AudioBlock.CodiceEmbedAudioAltro?? && AudioBlock.CodiceEmbedAudioAltro.data?has_content>
400 <section id="embeds" class="mt-20">
401 <div class="d-flex container-fluid custom-container">
402 <div class="row">
403 <#list AudioBlock.getSiblings() as embed>
404 <div class="col-12 col-lg-6 m-auto">
405 <div class="card">
406 <div class="embed-responsive embed-responsive-16by9 tw:rounded-md">
407 ${embed.CodiceEmbedAudioAltro.getData()}
408 </div>
409 <#if (embed.AudioFields.titoloEmbedAudio?? && embed.AudioFields.titoloEmbedAudio.getData()?has_content) || (embed.AudioFields.descrizioneEmbedAudio?? && embed.descrizioneEmbedAudio.getData()?has_content)>
410 <div class="card-body tw:px-0">
411 <#if embed.AudioFields.titoloEmbedAudio?? && embed.AudioFields.titoloEmbedAudio.getData()?has_content >
412 <p class="tw:text-dark tw:uppercase tw:font-heading tw:font-bold tw:text-xl lg:tw:text-2xl mb-4">${embed.AudioFields.titoloEmbedAudio.getData()}</p>
413 </#if>
414 <#if embed.AudioFields.descrizioneEmbedAudio?? && embed.AudioFields.descrizioneEmbedAudio.getData()?has_content>
415 <p class="tw:text-dark tw:font-light">${embed.AudioFields.descrizioneEmbedAudio.getData()}</p>
416 </#if>
417 </div>
418 </#if>
419 </div>
420 </div>
421 </#list>
422 </div>
423 </div>
424 </section>
425 </#if>
426
427 <#if VideoBlock.embed_video?? && VideoBlock.embed_video.data?has_content>
428 <section id="videos" class="mt-5">
429 <div class="d-flex container-fluid custom-container">
430 <div class="row w-100">
431 <#list VideoBlock.getSiblings() as video>
432 <div class="col-12 col-lg-6 offset-lg-2">
433 <div class="card">
434 <div class="embed-responsive embed-responsive-16by9">
435 <iframe class="embed-responsive-item" src="${video.embed_video.getData()}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
436 </div>
437 <#if (video.VideoFields.titoloEmbedVideo?? && video.VideoFields.titoloEmbedVideo.getData()?has_content) || (video.VideoFields.descrizioneEmbedVideo?? && video.VideoFields.descrizioneEmbedVideo.getData()?has_content)>
438 <div class="card-body py-3 px-0">
439 <#if video.VideoFields.titoloEmbedVideo?? && video.VideoFields.titoloEmbedVideo.getData()?has_content >
440 <p class="vid-title">${video.VideoFields.titoloEmbedVideo.getData()}</p>
441 </#if>
442 <#if video.VideoFields.descrizioneEmbedVideo?? && video.VideoFields.descrizioneEmbedVideo.getData()?has_content>
443 <p class="vid-desc">${video.VideoFields.titoloEmbedVideo.getData()}</p>
444 </#if>
445 </div>
446 </#if>
447 </div>
448 </div>
449 </#list>
450 </div>
451 </div>
452 </section>
453 </#if>
454
455 <#if hasDownloads>
456 <section id="downloads">
457 <div class="d-flex container-fluid custom-container mt-20">
458 <div class="sheet tw-bg-light tw:space-y-4 p-3">
459 <#list tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings() as item>
460 <#-- #assign doc = getFileFromUuid(createObject(item.downloadUrl.data).uuid, groupId) -->
461
462 <div class="card tw:bg-transparent tw:border-0 tw:shadow-none">
463 <div class="card-row">
464 <div class="autofit-col">
465 <div class="autofit-section">
466 <i class="fal fa-file-pdf fa-lg tw:text-dark"></i>
467 </div>
468 </div>
469 <div class="autofit-col autofit-col-expand autofit-col-gutters">
470 <div class="autofit-section">
471 <a href="${item.downloadUrl.getData()}" class="tw:text-dark tw:font-bold" download>
472 <#-- ${doc.fileName} -->
473 ${item.downloadText.getData()}
474
475 <span class="tw:font-light muted tw:ml-2">(${getLabel('scarica_qui')})</span>
476 </a>
477 </div>
478 </div>
479 </div>
480 </div>
481 </#list>
482 </div>
483 </div>
484 </section>
485 </#if>
486
487
488 <#macro contatti>
489 <#assign
490 contactNameSz=""
491 street_number1Sz=""
492 localitaSz=""
493 comuneSz=""
494 countrySz=""
495 zipCodeSz=""
496 telSz=""
497 emailSz=""
498 email2Sz=""
499 webSiteSz=""
500 facebookSz=""
501 instagramSz=""
502 thereAreContcats="false"
503 />
504 <#if tourismItem.contactFields.singleContact.contactName?? && tourismItem.contactFields.singleContact.contactName.getData()?has_content>
505 <#assign contactNameSz=tourismItem.contactFields.singleContact.contactName.getData()>
506 <#assign thereAreContcats="true">
507 </#if>
508 <#if tourismItem.contactFields.singleContact.street_number1?? && tourismItem.contactFields.singleContact.street_number1.getData()?has_content>
509 <#assign street_number1Sz=tourismItem.contactFields.singleContact.street_number1.getData()>
510 <#assign thereAreContcats="true">
511 </#if>
512 <#if tourismItem.contactFields.singleContact.localita?? && tourismItem.contactFields.singleContact.localita.getData()?has_content>
513 <#assign localitaSz=tourismItem.contactFields.singleContact.localita.getData()>
514 <#assign thereAreContcats="true">
515 </#if>
516 <#if tourismItem.contactFields.singleContact.comune?? && tourismItem.contactFields.singleContact.comune.getData()?has_content>
517 <#assign comuneSz=tourismItem.contactFields.singleContact.comune.getData()>
518 <#assign thereAreContcats="true">
519 </#if>
520 <#if tourismItem.contactFields.singleContact.country?? && tourismItem.contactFields.singleContact.country.getData()?has_content>
521 <#assign countrySz=tourismItem.contactFields.singleContact.country.getData()>
522 <#assign thereAreContcats="true">
523 </#if>
524 <#if tourismItem.contactFields.singleContact.zipCode?? && tourismItem.contactFields.singleContact.zipCode.getData()?has_content>
525 <#assign zipCodeSz=tourismItem.contactFields.singleContact.zipCode.getData()>
526 <#assign thereAreContcats="true">
527 </#if>
528 <#if tourismItem.contactFields.singleContact.tel?? && tourismItem.contactFields.singleContact.tel.getSiblings()?has_content>
529 <#assign telSz=tourismItem.contactFields.singleContact.tel.getSiblings()>
530 <#assign thereAreContcats="true">
531 </#if>
532 <#if tourismItem.contactFields.singleContact.email?? && tourismItem.contactFields.singleContact.email.getData()?has_content>
533 <#assign emailSz=tourismItem.contactFields.singleContact.email.getData()>
534 <#assign thereAreContcats="true">
535 </#if>
536 <#if tourismItem.contactFields.singleContact.email2?? && tourismItem.contactFields.singleContact.email2.getData()?has_content>
537 <#assign email2Sz=tourismItem.contactFields.singleContact.email2.getData()>
538 <#assign thereAreContcats="true">
539 </#if>
540 <#if tourismItem.contactFields.singleContact.webSite?? && tourismItem.contactFields.singleContact.webSite.getData()?has_content>
541 <#assign webSiteSz=tourismItem.contactFields.singleContact.webSite.getData()>
542 <#assign thereAreContcats="true">
543 </#if>
544 <#if tourismItem.contactFields.singleContact.facebook?? && tourismItem.contactFields.singleContact.facebook.getData()?has_content>
545 <#assign facebookSz=tourismItem.contactFields.singleContact.facebook.getData()>
546 <#assign thereAreContcats="true">
547 </#if>
548 <#if tourismItem.contactFields.singleContact.instagram?? && tourismItem.contactFields.singleContact.instagram.getData()?has_content>
549 <#assign instagramSz=tourismItem.contactFields.singleContact.instagram.getData()>
550 <#assign thereAreContcats="true">
551 </#if>
552
553 <#assign acapo="false">
554 <#if thereAreContcats == "true">
555 <div class="text-dark mt-4">
556 <#if contactNameSz != "">
557 ${contactNameSz}
558 <#assign acapo="true">
559 </#if>
560 <#if street_number1Sz != "">
561 <#if acapo == "true"><br/></#if>
562 ${street_number1Sz}
563 <#assign acapo="true">
564 </#if>
565 <#if localitaSz != "">
566 <#if acapo == "true"><br/></#if>
567 ${localitaSz}
568 <#assign acapo="true">
569 </#if>
570
571 <#if zipCodeSz != "" || comuneSz != "" || countrySz != "">
572 <#if acapo == "true"><br/></#if>
573 ${zipCodeSz} ${comuneSz} ${countrySz}
574 <#assign acapo="true">
575 </#if>
576
577 <#if telSz?has_content>
578 <#assign telExists = false>
579
580 <#list telSz as tel>
581 <#if tel.getData()?has_content>
582 <#assign telExists = true>
583 <#break>
584 </#if>
585 </#list>
586
587 <#if telExists>
588 <#if acapo == "true"><br/></#if>
589
590 <div class="card-row tw:space-x-2">
591 <div class="autofit-col mb-auto">
592 <div class="autofit-section">
593 <p class="tw:text-dark tw:text-base mb-0">${getLabel('tel')}:</p>
594 </div>
595 </div>
596 <div class="autofit-col autofit-col-expand">
597 <div class="autofit-section">
598 <#list telSz as tel>
599 <p class="tw:text-dark tw:text-base mb-0">${tel.getData()}</p>
600 </#list>
601 </div>
602 </div>
603 </div>
604
605 <#assign acapo="true">
606 </#if>
607 </#if>
608 <#if emailSz != "">
609 <#if acapo == "true"><br/></#if>
610 ${getLabel('email')}: <a href="mailto:${emailSz}" >${emailSz}</a>
611 <#if email2Sz != "">
612 <a href="mailto:${email2Sz}" style="margin-left: 20px;">${email2Sz}</a>
613 </#if>
614 <#assign acapo="true">
615 </#if>
616
617
618 <#if webSiteSz != "" || facebookSz != "" || instagramSz != "">
619 <#if acapo == "true"><br/></#if>
620 <#if webSiteSz != "">
621 <a href="${webSiteSz}" title="${webSiteSz}" alt="${webSiteSz}" target="_blank">${getLabel('sito-web')}</a>
622 </#if>
623 <#if facebookSz != "">
624 <a href="${facebookSz}" title="${facebookSz}" alt="${facebookSz}" target="_blank"><i class="fab fa-facebook-f" style="margin-left: 20px;"></i></a>
625 </#if>
626 <#if instagramSz != "">
627 <a href="${instagramSz}" title="${instagramSz}" alt="${instagramSz}" target="_blank"><i class="fab fa-instagram" style="margin-left: 20px;"></i></a>
628 </#if>
629
630 </#if>
631
632 </div>
633 </#if>
634 </#macro>
635</div>
636
637<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/components/securityV2.js"></script>
638
639<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/components/initVueApp.js"></script>
640<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/mixins/js/favorites.js"></script>
641<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/mixins/js/share.js"></script>
642
643<script>
644 var ${portletNamespace}_custom_hook = {
645 data: {
646 title: "${tourismItem.title.getData()?js_string}",
647 item: {
648 id: "${articleId}",
649 contentJSON: {
650 title: "${tourismItem.title.getData()?js_string}",
651 description: "${tourismItem.introDescription.getData()?js_string}",
652 geoRef: '${tourismItem.geoRef.getData()}',
653 previewPicture: "${tourismItem.previewPicture.getData()}",
654 viewUrl: window.location.href
655 }
656 },
657 loading: true,
658 coords: {
659 lat: "${lat}",
660 lng: "${lng}"
661 },
662 regionLat: "44.3921388",
663 regionLng: "7.5211695",
664 slider: null,
665 gallery: null,
666 thumbnails: null,
667 lightbox: null,
668 map: null
669 },
670 mounted(){
671 var that = this;
672
673 if(this.coords.lat != 0 && this.coords.lng != 0){
674 this.createMap();
675 }
676
677 if(${hasSlides?c}){
678 this.initSlider();
679 }
680
681 if(${hasGallery?c}){
682 this.initGallery();
683
684 $("#lightbox-modal").on("shown.bs.modal", function(e){
685 that.lightbox.update();
686 that.thumbnails.update();
687 that.lightbox.slideTo($(e.relatedTarget).data("slider"));
688 that.lightbox.update();
689 });
690
691 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
692 if($(e.target).attr("class").includes("swiper-slide")){
693 $("#lightbox-modal").modal("hide");
694 }
695 });
696 }
697
698 this.loading = false;
699 },
700 methods: {
701 createMap: function(){
702 var map = new SuggestoMap("suggesto-map"),
703 maskImage = "${images_folder}/cuneo-mask-styled.png",
704 maskBounds = [[ 44.86534447171959, 6.845056749880314 ], [ 44.04193085127058, 8.226587511599066 ]],
705 location = [
706 parseFloat(this.coords.lat),
707 parseFloat(this.coords.lng)
708 ],
709 mapData = {
710 tilelayer: "none",
711 tilelayers: [''],
712 mapcenter: [
713 parseFloat(this.regionLat),
714 parseFloat(this.regionLng)
715 ],
716 zoom: 9,
717 zoomControl: false,
718 attributionControl: false,
719 markersFilter: "*",
720 gestureHandling: false,
721 fitBounds: false,
722 markers: [],
723 layers: []
724 };
725
726 map.sm.createMap(mapData);
727 map.sm.disableMapTouch();
728
729 var marker = L.circleMarker(location, {
730 radius: 3,
731 color: "#000",
732 fillOpacity: 1
733 }).addTo(map.sm.lmap);
734
735 var icon = L.divIcon({
736 iconSize: -10,
737 html: this.title.toUpperCase()
738 });
739
740 L.marker(location, {
741 icon: icon
742 }).addTo(map.sm.lmap);
743
744 L.imageOverlay(maskImage, maskBounds).addTo(map.sm.lmap);
745 L.imageOverlay(maskImage, maskBounds).bringToFront();
746
747 this.map = map;
748 },
749 initSlider: function(){
750 this.slider = new Swiper("#slideshow .swiper-container", {
751 loop: ${(slides > 1)?c},
752 effect: "fade",
753 speed: 3000,
754 allowTouchMove: false,
755 autoplay: {
756 delay: 3000,
757 disableOnInteraction: false,
758 },
759 fadeEffect: {
760 crossFade: true,
761 },
762 });
763 },
764 initGallery: function(){
765 this.gallery = new Swiper("#gallery .swiper-container", {
766 slidesPerView: 1,
767 spaceBetween: 25,
768 centerSlides: true,
769 centerInsufficientSlides: true,
770 navigation: {
771 prevEl: ".btn-prev",
772 nextEl: ".btn-next",
773 },
774 breakpoints: {
775 768: {
776 slidesPerView: 2,
777 spaceBetween: 25,
778 },
779 992: {
780 slidesPerView: 3,
781 spaceBetween: 25,
782 },
783 },
784 });
785
786 this.thumbnails = new Swiper("#thumbnail-swiper", {
787 spaceBetween: 10,
788 slidesPerView: 2,
789 centerInsufficientSlides: true,
790 freeMode: true,
791 watchSlidesVisibility: true,
792 watchSlidesProgress: true,
793 breakpoints: {
794 768: {
795 slidesPerView: 3
796 },
797 992: {
798 slidesPerView: 4
799 },
800 1200: {
801 slidesPerView: 5
802 }
803 },
804 });
805
806 this.lightbox = new Swiper("#lightbox-swiper", {
807 spaceBetween: 10,
808 autoHeight: true,
809 observer: true,
810 observeSlideChildren: true,
811 keyboard: {
812 enabled: true
813 },
814 navigation: {
815 nextEl: ".swiper-button-next",
816 prevEl: ".swiper-button-prev"
817 },
818 thumbs: {
819 swiper: this.thumbnails
820 }
821 });
822 },
823 customShare: function(type, title, description, image = ""){
824 if(type == "facebook"){
825 var winHeight = 450,
826 winWidth = 600,
827 winTop = window.screen.height / 2 - winHeight / 2,
828 winLeft = window.screen.width / 2 - winWidth / 2,
829 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop,
830 link = "http://www.facebook.com/sharer.php?s=100&p[title]=" + encodeURIComponent(title) + "&p[summary]=" + encodeURIComponent(description) + "&p[url]=" + window.location.href + "&p[images][0]=" + image;
831
832 window.open(link, "Facebook", params);
833 }
834
835 if(type == "twitter"){
836 var link = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(title) + "&url=" + encodeURIComponent(window.location.href);
837
838 window.open(link, "_blank").focus();
839 }
840
841 if(type == "pinterest"){
842 var link = "https://pinterest.com/pin/create/button/?url=" + encodeURIComponent(window.location.href) + "&description=" + encodeURIComponent(title);
843
844 window.open(link, "_blank").focus();
845 }
846
847 if(type == "whatsapp"){
848 var link = "https://wa.me?text=" + encodeURIComponent(title + ": " + window.location.href);
849
850 window.open(link, "_blank").focus();
851 }
852
853 if(type == "telegram"){
854 var link = "https://t.me/share/url?url=" + window.location.href + "&text=" + encodeURIComponent(title);
855
856 window.open(link, "_blank").focus();
857 }
858
859 if(type == "print"){
860 window.print();
861 }
862
863 if(type == "link"){
864 this.legacyShare();
865 }
866 }
867 }
868 };
869
870 document.addEventListener("DOMContentLoaded", function(){
871 var app = initVueApp(
872 "#${portletNamespace}",
873 "${portletNamespace}",
874 [d40_favorites, d40_share, ${portletNamespace}_custom_hook]
875 );
876 });
877
878 var groupedCategories = '${groupedCategories?js_string}';
879 var contentCoords = [${lat}, ${lng}];
880 console.log("espongo " + groupedCategories);
881</script>
fr_FR
À faire
fr_FR
Expériences
fr_FR
Où
dormir
fr_FR
Offres
fr_FR
Informations