Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> tourismItem [in template "1315478#1315513#1674222" at line 98, column 6]
----
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 tourismItem.geoRef.getData()?has_... [in template "1315478#1315513#1674222" at line 98, column 1]
----
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<#--
18 Mapping Vimeo -> Bunny Stream.
19 Per aggiungere un video: "ID_VIMEO": "LIBRARY_ID/VIDEO_ID"
20-->
21<#assign vimeoBunnyMapping = {
22 "672700517": "785963/dad9de1f-df1d-4a44-82e2-cf99e56a2111",
23 "1188097108": "785963/42e7079a-f289-421e-9d94-4b37af2b3aa7",
24 "672696883": "785963/df1c9789-f991-4fd6-b205-cd4598be3a24",
25 "651979614": "785963/3ce413ed-b9ff-4e95-a621-f1305d193f17",
26 "651980826": "785963/98b69096-3a94-456b-a9db-04110a9c9f2c",
27 "651978716": "785963/cb27804f-a8b9-4e5d-ad7e-c791675052ad",
28 "651978337": "785963/9efbe957-29f3-4f08-92cb-64c17664eb0d",
29 "651980015": "785963/74bb2cf3-3f82-41c3-96f8-79dcf2e94921",
30 "651981172": "785963/6b3e755b-76d5-442d-99ae-2245fc9e9f19",
31 "651983042": "785963/276001b6-5db0-4dcd-bfa8-77f779622702",
32 "651979166": "785963/8432cc7f-75f2-4f82-81db-147ae2bcae8f",
33 "651980464": "785963/4ea10853-388b-45ac-80d2-b3f90c41729e",
34 "651981586": "785963/c8f02b62-ad38-4dac-8e51-bdb13b0ba3d5",
35 "686771435": "785963/beb1b8e9-37c0-47e4-b654-64aa345f2e80",
36 "672695968": "785963/c7140c71-0647-4f02-a9c2-82f9261f2a74",
37 "672696408": "785963/a4cbae59-6956-482a-9a72-398e14423620",
38 "672697802": "785963/4aa8e0ab-df12-490f-9407-140155c1c858",
39 "672698233": "785963/efc37b03-ccf9-4dc2-b207-ba32fd74ad6e",
40 "672697289": "785963/0caf3e22-7ced-4309-af3c-cfd2b7eed9ac",
41 "1188108772": "785963/af6e63df-70fa-4df0-9047-79ab447b069d",
42 "1189807283": "785963/4e46a605-8efa-48d9-94aa-b9d2d492e7f8",
43 "1188113469": "785963/f4db880d-8e64-4704-bfca-5ad7db64aaa5",
44 "868210912": "785963/d673eee7-cf52-4ef6-8501-da6b9d17ba94",
45 "651982035": "785963/dc05a3ad-7461-4052-9e28-71e96ce2d68c",
46 "672698670": "785963/cf6f3d63-5106-4cc7-b095-5f503c297cfd",
47 "672699123": "785963/c469cae3-a0bd-4084-81f8-48cfc1f79803",
48 "687039327": "785963/6ea2cbed-e487-419e-ba71-ce738356d79e",
49 "708630472": "785963/416976a0-f02f-4b66-8661-278baa851a0c",
50 "764059265": "785963/b38a0c29-a2c3-4b0e-a004-35bc7b2d2c76",
51 "777269946": "785963/dad127a3-00c8-43d2-8598-d4b907fdf054"
52} />
53
54<#function getBunnyReferenceFromVimeoId vimeoId>
55 <#return vimeoBunnyMapping[vimeoId]!"" />
56</#function>
57
58<#function getBunnyEmbedUrl rawUrl>
59 <#local url = (rawUrl!"")?trim />
60
61 <#if url?contains("player.vimeo.com/") || url?starts_with("videos/") || url?starts_with("/videos/")>
62 <#local vimeoId = url?replace("^.*/?videos?/", "", "r")?keep_before("?")?keep_before("/") />
63 <#local bunnyReference = getBunnyReferenceFromVimeoId(vimeoId) />
64
65 <#-- Se non esiste ancora un mapping, mantiene il vecchio URL Vimeo. -->
66 <#if bunnyReference?has_content>
67 <#local url = bunnyReference />
68 <#else>
69 <#return url />
70 </#if>
71 </#if>
72
73 <#if url?starts_with("https://player.mediadelivery.net/play/")>
74 <#local url = url?replace("https://player.mediadelivery.net/play/", "https://player.mediadelivery.net/embed/") />
75 <#elseif !url?starts_with("https://player.mediadelivery.net/embed/")>
76 <#local parts = url?split("/") />
77 <#if parts?size == 2 && parts[0]?has_content && parts[1]?has_content>
78 <#local url = "https://player.mediadelivery.net/embed/" + parts[0] + "/" + parts[1] />
79 </#if>
80 </#if>
81
82 <#if url?starts_with("https://player.mediadelivery.net/embed/") && !url?contains("?")>
83 <#local url = url + "?autoplay=false&preload=false" />
84 </#if>
85
86 <#return url />
87</#function>
88
89<#-- MASONRY -->
90<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.js"></script>
91
92<#list territorioCategories as tCat>
93 <#if tCat.parentCategoryId != 0>
94 <#assign sliderCategories += [tCat.name]>
95 </#if>
96</#list>
97
98<#if tourismItem.geoRef.getData()?has_content>
99 <#assign
100 geoObj = createObject(tourismItem.geoRef.getData())
101 lat = geoObj.getDouble("latitude")
102 lng = geoObj.getDouble("longitude")
103 />
104</#if>
105
106<#if tourismItem.coordinateTestuali.getData()?has_content>
107 <#assign
108 lat = tourismItem.coordinateTestuali.getData()?keep_before(",")?number
109 lng = tourismItem.coordinateTestuali.getData()?keep_after(",")?number
110 />
111</#if>
112
113<#if tourismItem.slideHeader?? && tourismItem.slideHeader.getSiblings()?has_content>
114 <#list tourismItem.slideHeader.getSiblings() as slide>
115 <#if slide.getData()?has_content>
116 <#assign
117 hasSlides = true
118 slides = tourismItem.slideHeader.getSiblings()?size
119 />
120 <#break>
121 </#if>
122 </#list>
123</#if>
124
125<#if tourismItem.ImmagineGallery?? && tourismItem.ImmagineGallery.getSiblings()?has_content>
126 <#list tourismItem.ImmagineGallery.getSiblings() as item>
127 <#if item.getData()?has_content>
128 <#assign hasGallery = true>
129 <#break>
130 </#if>
131 </#list>
132</#if>
133
134<#if tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet?? && tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings()?has_content>
135 <#list tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings() as item>
136 <#if item.downloadUrl.getData()?has_content>
137 <#assign hasDownloads = true>
138 <#break>
139 </#if>
140 </#list>
141</#if>
142
143<!-- Modello punto di interesse -->
144
145<div id="${portletNamespace}" v-cloak>
146
147 <#if themeDisplay.getLayout().getAncestors()?has_content>
148 <section id="breadcrumb" class="mt-4">
149 <div class="container-fluid custom-container d-flex align-items-center">
150 <ol class="breadcrumb tw-space-x-2">
151 <li class="breadcrumb-item">
152 <a href="/" class="breadcrumb-link" title="Home">
153 <span class="breadcrumb-text-truncate tw:text-dark tw:uppercase">Home</span>
154 </a>
155 </li>
156
157 <#list themeDisplay.getLayout().getAncestors()?reverse as ancestor>
158 <li class="breadcrumb-item">
159 <a href="${ancestor.getFriendlyURL()}" class="breadcrumb-link" title="${escape(ancestor.getHTMLTitle(themeDisplay.getLocale()))}">
160 <span class="breadcrumb-text-truncate tw:text-dark tw:uppercase">${escape(ancestor.getHTMLTitle(themeDisplay.getLocale()))}</span>
161 </a>
162 </li>
163 </#list>
164
165 <li class="breadcrumb-item active">
166 <span class="tw:text-green tw:uppercase" title="${tourismItem.title.getData()?js_string}">
167 ${tourismItem.title.getData()}
168 </span>
169 </li>
170 </ol>
171
172 <div class="d-flex align-items-center ml-auto">
173 <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)}`">
174 <i :class="(isFavorite(item.id) ? 'fas' : 'fal') + ' fa-heart fa-2x tw:text-green'"></i>
175 </button>
176
177 <div class="btn dropdown tw:px-0">
178 <button type="button" class="btn btn-link dropdown-toggle tw:no-underline tw:text-green" data-toggle="dropdown">
179 <i class="fas fa-share-alt fa-2x"></i>
180 </button>
181 <div class="dropdown-menu dropdown-menu-center">
182 <button type="button" @click="customShare('facebook', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
183 <i class="fab fa-facebook-f fa-lg tw:text-green"></i>
184 <span class="tw:text-dark">
185 Facebook
186 </span>
187 </button>
188
189 <button type="button" @click="customShare('twitter', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
190 <i class="fab fa-twitter fa-lg tw:text-green"></i>
191 <span class="tw:text-dark">
192 Twitter
193 </span>
194 </button>
195
196 <button type="button" @click="customShare('pinterest', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
197 <i class="fab fa-pinterest fa-lg tw:text-green"></i>
198 <span class="tw:text-dark">
199 Pinterest
200 </span>
201 </button>
202
203 <button type="button" @click="customShare('whatsapp', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
204 <i class="fab fa-whatsapp fa-lg tw:text-green"></i>
205 <span class="tw:text-dark">
206 WhatsApp
207 </span>
208 </button>
209
210 <button type="button" @click="customShare('telegram', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
211 <i class="fab fa-telegram fa-lg tw:text-green"></i>
212 <span class="tw:text-dark">
213 Telegram
214 </span>
215 </button>
216
217 <button type="button" @click="customShare('print', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
218 <i class="fas fa-print fa-lg tw:text-green"></i>
219 <span class="tw:text-dark">
220 Print
221 </span>
222 </button>
223
224 <a :href="'mailto:inserisci indirizzo email?subject=' + item.contentJSON.title + '&body=${currentUrl} ' + item.contentJSON.description" class="dropdown-item tw:space-x-2">
225 <i class="fas fa-envelope fa-lg tw:text-green"></i>
226 <span class="tw:text-dark">
227 Email
228 </span>
229 </a>
230
231 <button type="button" @click="customShare('link', item.contentJSON.title, item.contentJSON.description, item.contentJSON.previewPicture)" class="dropdown-item tw:space-x-2">
232 <i class="fas fa-link fa-lg tw:text-green"></i>
233 <span class="tw:text-dark">
234 Link
235 </span>
236 </button>
237 </div>
238 </div>
239 </div>
240 </div>
241 </section>
242 </#if>
243
244 <section id="slideshow" class="container-fluid custom-container">
245 <div class="swiper-container">
246 <div class="swiper-wrapper">
247 <#if hasSlides>
248 <#list tourismItem.slideHeader.getSiblings() as slide>
249 <div class="swiper-slide">
250 <img data-src="${getPrefix(slide.getData(), 1920, 730)}" loading="lazy" class="lazyload tw:object-cover" alt="${slide.getAttribute('alt')}"/>
251 <div class="card-img-overlay tw:bg-dark tw:bg-opacity-40"></div>
252
253 <div class="carousel-caption tw:flex tw:text-left tw:transform lg:tw:top-2/4 lg:tw:-translate-y-2/4">
254 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
255 <#assign locationClass = "tw:my-auto">
256 <#else>
257 <#assign locationClass = "tw:mt-auto tw:mb-20">
258 </#if>
259
260 <div class="tw:flex tw:flex-col ${locationClass}">
261 <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">
262 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
263 <p>${tourismItem.testoHeader.getData()}</p>
264 <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>
265 </#if>
266 </div>
267 <#if sliderCategories?has_content>
268 <div class="tw:flex tw:mt-7">
269 <i class="fas fa-map-marker-alt fa-2x tw:text-white"></i>
270 <p class="tw:text-white tw:uppercase tw:font-heading tw:font-medium tw:my-auto tw:ml-3">
271 ${sliderCategories?join(", ")}
272 </p>
273 </div>
274 </#if>
275 </div>
276 </div>
277 </div>
278 </#list>
279 <#else>
280 <div class="swiper-slide">
281 <img data-src="https://via.placeholder.com/1920x730" loading="lazy" class="lazyload tw:object-cover tw:h-full tw:w-full" alt=""/>
282 <div class="card-img-overlay tw:bg-dark tw:bg-opacity-40"></div>
283
284 <div class="carousel-caption tw:flex tw:text-left tw:transform lg:tw:top-2/4 lg:tw:-translate-y-2/4">
285 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
286 <#assign locationClass = "tw:my-auto">
287 <#else>
288 <#assign locationClass = "tw:mt-auto tw:mb-20">
289 </#if>
290
291 <div class="tw:flex tw:flex-col ${locationClass}">
292 <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">
293 <#if tourismItem.testoHeader?? && tourismItem.testoHeader.getData()?has_content>
294 <p>${tourismItem.testoHeader.getData()}</p>
295 <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>
296 </#if>
297 </div>
298
299 <#if territorioCategories?has_content>
300 <div class="tw:flex tw:mt-7">
301 <i class="fas fa-map-marker-alt fa-2x tw:text-white"></i>
302 <p class="tw:text-white tw:uppercase tw:font-heading tw:font-medium tw:my-auto tw:ml-3">
303 <#list territorioCategories as cat>
304 <#if cat.parentCategoryId != 0>
305 ${cat.name}
306
307 <#if cat?has_next>,</#if>
308 </#if>
309 </#list>
310 </p>
311 </div>
312 </#if>
313 </div>
314 </div>
315 </div>
316 </#if>
317 </div>
318 </div>
319 </section>
320
321 <section id="intro-description-image">
322 <div class="d-flex container-fluid custom-container">
323 <div class="tw:flex tw:mt-9 lg:tw:hidden">
324 <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)}`">
325 <i :class="(isFavorite(item.id) ? 'fas' : 'fal') + ' fa-heart fa-lg tw:text-green'"></i>
326 </button>
327 <button type="button" @click="share(item.contentJSON.title, item.contentJSON.description)" class="btn btn-link tw:no-underline">
328 <i class="fas fa-share-alt fa-lg tw:text-green"></i>
329 </button>
330 </div>
331 </div>
332
333 <#if tourismItem.icona_pagina?? && tourismItem.icona_pagina.getData()?has_content>
334 <div class="d-none flex-justify-end mt-4">
335 <div class="pr-3 pb-3">
336 <div class="sticker sticker-circle sticker-lg">
337 <i class="${tourismItem.icona_pagina.getData()} fa-lg tw:text-dark"></i>
338 </div>
339 </div>
340 </div>
341 </#if>
342
343 <div class="d-flex container-fluid custom-container">
344 <div class="row mt-4 w-100">
345 <div class="col-12 col-lg-7">
346 <div>
347 <#if tourismItem.title?? && tourismItem.title.getData()?has_content>
348 <h1 class="mb-3">${tourismItem.title.getData()}</h1>
349 </#if>
350
351 <#if tourismItem.subTitle?? && tourismItem.subTitle.getData()?has_content>
352 <h3>${tourismItem.subTitle.getData()}</h3>
353 </#if>
354 </div>
355
356 <#if tourismItem.introDescription?? && tourismItem.introDescription.getData()?has_content>
357 <div class="text-dark mt-4">
358 ${tourismItem.introDescription.getData()}
359 </div>
360 </#if>
361
362 <#if InfoOrariFieldSet.InfoOrari?? && InfoOrariFieldSet.InfoOrari.getData()?has_content>
363 <div class="text-dark mt-4">
364 <span style="text-transform: uppercase;">${getLabel('orari')}</span><br/>
365 ${InfoOrariFieldSet.InfoOrari.getData()}
366 <#if InfoOrariFieldSet.InfoOrari.hideExtraInfo??>
367 <#if InfoOrariFieldSet.InfoOrari.hideExtraInfo.getData() != "true">
368 <i>${getLabel('nota-extra-info-orari')}</i>
369 </#if>
370 <#else>
371 <i>${getLabel('nota-extra-info-orari')}</i>
372 </#if>
373 </div>
374 </#if>
375
376
377
378 <@contatti/>
379
380 </div>
381
382 <div class="col-12 col-lg-5">
383 <div id="suggesto-map" class="map-image map-styled tw:z-10 tw:mt-10" style="height: 350px;"></div>
384 </div>
385 </div>
386 </div>
387 </section>
388
389
390 <#-- MASONRY GALLERY -->
391 <#if hasGallery>
392 <section id="gallery" class="mt-4">
393 <div class="container-fluid custom-container">
394 <div class="gallery-grid grid">
395 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
396 <div class="grid-item">
397 <a href="javascript:void(0);" data-toggle="modal" data-target="#lightbox-modal" data-slider="${pic?index}">
398 <img src="${getKitPrefix(pic.getData(), 'tr:w-900,fo-center')}" alt="${pic.getAttribute('alt')!''}" />
399 </a>
400 </div>
401 </#list>
402 </div>
403 </div>
404
405 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
406 <div class="modal-dialog modal-full-screen tw:inset-0 tw:border-none tw:shadow-none">
407 <div class="modal-content tw:bg-transparent">
408 <div class="modal-body tw:overflow-hidden">
409 <div class="tw:absolute tw:top-0 tw:right-0 tw:z-5">
410 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
411 <i class="fal fa-times fa-lg"></i>
412 </button>
413 </div>
414
415 <#-- lightbox -->
416 <div id="lightbox-swiper" class="swiper-container h-75 my-auto">
417 <div class="swiper-button-prev tw:w-12 tw:h-12">
418 <span class="sticker sticker-circle hcm-bg-capable tw:bg-green tw:w-full tw:h-full">
419 <span class="sticker-overlay">
420 <i class="fas fa-chevron-left fa-2x tw:text-white"></i>
421 </span>
422 </span>
423 </div>
424
425 <div class="swiper-button-next tw:w-12 tw:h-12">
426 <span class="sticker sticker-circle hcm-bg-capable tw:bg-green tw:w-full tw:h-full">
427 <span class="sticker-overlay">
428 <i class="fas fa-chevron-right fa-2x tw:text-white"></i>
429 </span>
430 </span>
431 </div>
432
433 <div class="swiper-wrapper tw:h-full">
434 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
435 <div class="swiper-slide tw:h-full">
436 <img data-src="${getPrefix(pic.getData(), 1920, '')}" loading="lazy" class="lazyload tw:h-full tw:object-contain tw:mx-auto" alt="${pic.getAttribute('alt')!''}">
437 </div>
438 </#list>
439 </div>
440 </div>
441
442 <#-- thumbnails -->
443 <div id="thumbnail-swiper" class="swiper-container" thumbsSlider="">
444 <div class="swiper-wrapper">
445 <#list tourismItem.ImmagineGallery.getSiblings() as pic>
446 <div class="swiper-slide">
447 <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')!''}">
448 </div>
449 </#list>
450 </div>
451 </div>
452 </div>
453 </div>
454 </div>
455 </div>
456 </section>
457 </#if>
458
459 <#if tourismItem.descriptionFieldSet.description?? && tourismItem.descriptionFieldSet.description.getData()?has_content>
460 <section id="description" class="mt-5">
461 <div class="container-fluid custom-container">
462 <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>
463 <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>
464 <div class="text-dark mt-5">
465 ${tourismItem.descriptionFieldSet.description.getData()}
466 </div>
467 </div>
468 </section>
469 </#if>
470
471 <#if AudioBlock.CodiceEmbedAudioAltro?? && AudioBlock.CodiceEmbedAudioAltro.data?has_content>
472 <section id="embeds" class="mt-20">
473 <div class="d-flex container-fluid custom-container">
474 <div class="row">
475 <#list AudioBlock.getSiblings() as embed>
476 <div class="col-12 col-lg-6 m-auto">
477 <div class="card">
478 <div class="embed-responsive embed-responsive-16by9 tw:rounded-md">
479 ${htmlUtil.unescape(embed.CodiceEmbedAudioAltro.getData())}
480 </div>
481 <#if (embed.AudioFields.titoloEmbedAudio?? && embed.AudioFields.titoloEmbedAudio.getData()?has_content) || (embed.AudioFields.descrizioneEmbedAudio?? && embed.AudioFields.descrizioneEmbedAudio.getData()?has_content)>
482 <div class="card-body tw:px-0">
483 <#if embed.AudioFields.titoloEmbedAudio?? && embed.AudioFields.titoloEmbedAudio.getData()?has_content >
484 <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>
485 </#if>
486 <#if embed.AudioFields.descrizioneEmbedAudio?? && embed.AudioFields.descrizioneEmbedAudio.getData()?has_content>
487 <p class="tw:text-dark tw:font-light">${embed.AudioFields.descrizioneEmbedAudio.getData()}</p>
488 </#if>
489 </div>
490 </#if>
491 </div>
492 </div>
493 </#list>
494 </div>
495 </div>
496 </section>
497 </#if>
498
499 <#if VideoBlock.embed_video?? && VideoBlock.embed_video.data?has_content>
500 <section id="videos" class="mt-5">
501 <div class="d-flex container-fluid custom-container">
502 <div class="row w-100">
503 <#list VideoBlock.getSiblings() as video>
504 <div class="col-12 col-lg-6 offset-lg-2">
505 <div class="card">
506 <div class="embed-responsive embed-responsive-16by9">
507 <iframe class="embed-responsive-item" src="${getBunnyEmbedUrl(video.embed_video.getData())}" loading="lazy" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
508 </div>
509 <#if (video.VideoFields.titoloEmbedVideo?? && video.VideoFields.titoloEmbedVideo.getData()?has_content) || (video.VideoFields.descrizioneEmbedVideo?? && video.VideoFields.descrizioneEmbedVideo.getData()?has_content)>
510 <div class="card-body py-3 px-0">
511 <#if video.VideoFields.titoloEmbedVideo?? && video.VideoFields.titoloEmbedVideo.getData()?has_content >
512 <p class="vid-title">${video.VideoFields.titoloEmbedVideo.getData()}</p>
513 </#if>
514 <#if video.VideoFields.descrizioneEmbedVideo?? && video.VideoFields.descrizioneEmbedVideo.getData()?has_content>
515 <p class="vid-desc">${video.VideoFields.titoloEmbedVideo.getData()}</p>
516 </#if>
517 </div>
518 </#if>
519 </div>
520 </div>
521 </#list>
522 </div>
523 </div>
524 </section>
525 </#if>
526
527 <#if hasDownloads>
528 <section id="downloads">
529 <div class="d-flex container-fluid custom-container mt-20">
530 <div class="sheet tw-bg-light tw:space-y-4 p-3">
531 <#list tourismItem.downloadsFieldSet.downloadsFieldSetFieldSet.getSiblings() as item>
532 <#-- #assign doc = getFileFromUuid(createObject(item.downloadUrl.data).uuid, groupId) -->
533
534 <div class="card tw:bg-transparent tw:border-0 tw:shadow-none">
535 <div class="card-row">
536 <div class="autofit-col">
537 <div class="autofit-section">
538 <i class="fal fa-file-pdf fa-lg tw:text-dark"></i>
539 </div>
540 </div>
541 <div class="autofit-col autofit-col-expand autofit-col-gutters">
542 <div class="autofit-section">
543 <a href="${item.downloadUrl.getData()}" class="tw:text-dark tw:font-bold" download>
544 <#-- ${doc.fileName} -->
545 ${item.downloadText.getData()}
546
547 <span class="tw:font-light muted tw:ml-2">(${getLabel('scarica_qui')})</span>
548 </a>
549 </div>
550 </div>
551 </div>
552 </div>
553 </#list>
554 </div>
555 </div>
556 </section>
557 </#if>
558
559
560 <#macro contatti>
561 <#assign
562 contactNameSz=""
563 street_number1Sz=""
564 localitaSz=""
565 comuneSz=""
566 countrySz=""
567 zipCodeSz=""
568 telSz=""
569 emailSz=""
570 email2Sz=""
571 webSiteSz=""
572 facebookSz=""
573 instagramSz=""
574 thereAreContcats="false"
575 />
576 <#if tourismItem.contactFields.singleContact.contactName?? && tourismItem.contactFields.singleContact.contactName.getData()?has_content>
577 <#assign contactNameSz=tourismItem.contactFields.singleContact.contactName.getData()>
578 <#assign thereAreContcats="true">
579 </#if>
580 <#if tourismItem.contactFields.singleContact.street_number1?? && tourismItem.contactFields.singleContact.street_number1.getData()?has_content>
581 <#assign street_number1Sz=tourismItem.contactFields.singleContact.street_number1.getData()>
582 <#assign thereAreContcats="true">
583 </#if>
584 <#if tourismItem.contactFields.singleContact.localita?? && tourismItem.contactFields.singleContact.localita.getData()?has_content>
585 <#assign localitaSz=tourismItem.contactFields.singleContact.localita.getData()>
586 <#assign thereAreContcats="true">
587 </#if>
588 <#if tourismItem.contactFields.singleContact.comune?? && tourismItem.contactFields.singleContact.comune.getData()?has_content>
589 <#assign comuneSz=tourismItem.contactFields.singleContact.comune.getData()>
590 <#assign thereAreContcats="true">
591 </#if>
592 <#if tourismItem.contactFields.singleContact.country?? && tourismItem.contactFields.singleContact.country.getData()?has_content>
593 <#assign countrySz=tourismItem.contactFields.singleContact.country.getData()>
594 <#assign thereAreContcats="true">
595 </#if>
596 <#if tourismItem.contactFields.singleContact.zipCode?? && tourismItem.contactFields.singleContact.zipCode.getData()?has_content>
597 <#assign zipCodeSz=tourismItem.contactFields.singleContact.zipCode.getData()>
598 <#assign thereAreContcats="true">
599 </#if>
600 <#if tourismItem.contactFields.singleContact.tel?? && tourismItem.contactFields.singleContact.tel.getSiblings()?has_content>
601 <#assign telSz=tourismItem.contactFields.singleContact.tel.getSiblings()>
602 <#assign thereAreContcats="true">
603 </#if>
604 <#if tourismItem.contactFields.singleContact.email?? && tourismItem.contactFields.singleContact.email.getData()?has_content>
605 <#assign emailSz=tourismItem.contactFields.singleContact.email.getData()>
606 <#assign thereAreContcats="true">
607 </#if>
608 <#if tourismItem.contactFields.singleContact.email2?? && tourismItem.contactFields.singleContact.email2.getData()?has_content>
609 <#assign email2Sz=tourismItem.contactFields.singleContact.email2.getData()>
610 <#assign thereAreContcats="true">
611 </#if>
612 <#if tourismItem.contactFields.singleContact.webSite?? && tourismItem.contactFields.singleContact.webSite.getData()?has_content>
613 <#assign webSiteSz=tourismItem.contactFields.singleContact.webSite.getData()>
614 <#assign thereAreContcats="true">
615 </#if>
616 <#if tourismItem.contactFields.singleContact.facebook?? && tourismItem.contactFields.singleContact.facebook.getData()?has_content>
617 <#assign facebookSz=tourismItem.contactFields.singleContact.facebook.getData()>
618 <#assign thereAreContcats="true">
619 </#if>
620 <#if tourismItem.contactFields.singleContact.instagram?? && tourismItem.contactFields.singleContact.instagram.getData()?has_content>
621 <#assign instagramSz=tourismItem.contactFields.singleContact.instagram.getData()>
622 <#assign thereAreContcats="true">
623 </#if>
624
625 <#assign acapo="false">
626 <#if thereAreContcats == "true">
627 <div class="text-dark mt-4">
628 <#if contactNameSz != "">
629 ${contactNameSz}
630 <#assign acapo="true">
631 </#if>
632 <#if street_number1Sz != "">
633 <#if acapo == "true"><br/></#if>
634 ${street_number1Sz}
635 <#assign acapo="true">
636 </#if>
637 <#if localitaSz != "">
638 <#if acapo == "true"><br/></#if>
639 ${localitaSz}
640 <#assign acapo="true">
641 </#if>
642
643 <#if zipCodeSz != "" || comuneSz != "" || countrySz != "">
644 <#if acapo == "true"><br/></#if>
645 ${zipCodeSz} ${comuneSz} ${countrySz}
646 <#assign acapo="true">
647 </#if>
648
649 <#if telSz?has_content>
650 <#assign telExists = false>
651
652 <#list telSz as tel>
653 <#if tel.getData()?has_content>
654 <#assign telExists = true>
655 <#break>
656 </#if>
657 </#list>
658
659 <#if telExists>
660 <#if acapo == "true"><br/></#if>
661
662 <div class="card-row tw:space-x-2">
663 <div class="autofit-col mb-auto">
664 <div class="autofit-section">
665 <p class="tw:text-dark tw:text-base mb-0">${getLabel('tel')}:</p>
666 </div>
667 </div>
668 <div class="autofit-col autofit-col-expand">
669 <div class="autofit-section">
670 <#list telSz as tel>
671 <p class="tw:text-dark tw:text-base mb-0">${tel.getData()}</p>
672 </#list>
673 </div>
674 </div>
675 </div>
676
677 <#assign acapo="true">
678 </#if>
679 </#if>
680 <#if emailSz != "">
681 <#if acapo == "true"><br/></#if>
682 ${getLabel('email')}: <a href="mailto:${emailSz}" >${emailSz}</a>
683 <#if email2Sz != "">
684 <a href="mailto:${email2Sz}" style="margin-left: 20px;">${email2Sz}</a>
685 </#if>
686 <#assign acapo="true">
687 </#if>
688
689
690 <#if webSiteSz != "" || facebookSz != "" || instagramSz != "">
691 <#if acapo == "true"><br/></#if>
692 <#if webSiteSz != "">
693 <a href="${webSiteSz}" title="${webSiteSz}" alt="${webSiteSz}" target="_blank">${getLabel('sito-web')}</a>
694 </#if>
695 <#if facebookSz != "">
696 <a href="${facebookSz}" title="${facebookSz}" alt="${facebookSz}" target="_blank"><i class="fab fa-facebook-f" style="margin-left: 20px;"></i></a>
697 </#if>
698 <#if instagramSz != "">
699 <a href="${instagramSz}" title="${instagramSz}" alt="${instagramSz}" target="_blank"><i class="fab fa-instagram" style="margin-left: 20px;"></i></a>
700 </#if>
701
702 </#if>
703
704 </div>
705 </#if>
706 </#macro>
707</div>
708
709<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/components/securityV2.js"></script>
710
711<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/components/initVueApp.js"></script>
712<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/mixins/js/favorites.js"></script>
713<script src="https://s3-eu-west-1.amazonaws.com/mkspresstage.suggesto.eu/mixins/js/share.js"></script>
714
715<script>
716 var ${portletNamespace}_custom_hook = {
717 data: {
718 title: "${tourismItem.title.getData()?js_string}",
719 item: {
720 id: "${articleId}",
721 contentJSON: {
722 title: "${tourismItem.title.getData()?js_string}",
723 description: "${tourismItem.introDescription.getData()?js_string}",
724 geoRef: '${tourismItem.geoRef.getData()}',
725 previewPicture: "${tourismItem.previewPicture.getData()}",
726 viewUrl: window.location.href
727 }
728 },
729 loading: true,
730 coords: {
731 lat: "${lat}",
732 lng: "${lng}"
733 },
734 regionLat: "44.3921388",
735 regionLng: "7.5211695",
736 slider: null,
737 gallery: null,
738 thumbnails: null,
739 lightbox: null,
740 map: null
741 },
742 mounted(){
743 var that = this;
744
745 if(this.coords.lat != 0 && this.coords.lng != 0){
746 this.createMap();
747 }
748
749 if(${hasSlides?c}){
750 this.initSlider();
751 }
752
753 if(${hasGallery?c}){
754 this.initGallery();
755
756 $("#lightbox-modal").on("shown.bs.modal", function(e){
757 that.lightbox.update();
758 that.thumbnails.update();
759 that.lightbox.slideTo($(e.relatedTarget).data("slider"));
760 that.lightbox.update();
761 });
762
763 $("#lightbox-modal .swiper-wrapper").on("click", function(e){
764 if($(e.target).attr("class").includes("swiper-slide")){
765 $("#lightbox-modal").modal("hide");
766 }
767 });
768 }
769
770 this.loading = false;
771 },
772 methods: {
773 createMap: function(){
774 var map = new SuggestoMap("suggesto-map"),
775 maskImage = "${images_folder}/cuneo-mask-styled.png",
776 maskBounds = [[ 44.86534447171959, 6.845056749880314 ], [ 44.04193085127058, 8.226587511599066 ]],
777 location = [
778 parseFloat(this.coords.lat),
779 parseFloat(this.coords.lng)
780 ],
781 mapData = {
782 tilelayer: "none",
783 tilelayers: [''],
784 mapcenter: [
785 parseFloat(this.regionLat),
786 parseFloat(this.regionLng)
787 ],
788 zoom: 9,
789 zoomControl: false,
790 attributionControl: false,
791 markersFilter: "*",
792 gestureHandling: false,
793 fitBounds: false,
794 markers: [],
795 layers: []
796 };
797
798 map.sm.createMap(mapData);
799 map.sm.disableMapTouch();
800
801 var marker = L.circleMarker(location, {
802 radius: 3,
803 color: "#000",
804 fillOpacity: 1
805 }).addTo(map.sm.lmap);
806
807 var icon = L.divIcon({
808 iconSize: -10,
809 html: this.title.toUpperCase()
810 });
811
812 L.marker(location, {
813 icon: icon
814 }).addTo(map.sm.lmap);
815
816 L.imageOverlay(maskImage, maskBounds).addTo(map.sm.lmap);
817 L.imageOverlay(maskImage, maskBounds).bringToFront();
818
819 this.map = map;
820 },
821 initSlider: function(){
822 this.slider = new Swiper("#slideshow .swiper-container", {
823 loop: ${(slides > 1)?c},
824 effect: "fade",
825 speed: 3000,
826 allowTouchMove: false,
827 autoplay: {
828 delay: 3000,
829 disableOnInteraction: false,
830 },
831 fadeEffect: {
832 crossFade: true,
833 },
834 });
835 },
836 initGallery: function(){
837 this.gallery = new Swiper("#gallery .swiper-container", {
838 slidesPerView: 1,
839 spaceBetween: 25,
840 centerSlides: true,
841 centerInsufficientSlides: true,
842 navigation: {
843 prevEl: ".btn-prev",
844 nextEl: ".btn-next",
845 },
846 breakpoints: {
847 768: {
848 slidesPerView: 2,
849 spaceBetween: 25,
850 },
851 992: {
852 slidesPerView: 3,
853 spaceBetween: 25,
854 },
855 },
856 });
857
858 this.thumbnails = new Swiper("#thumbnail-swiper", {
859 spaceBetween: 10,
860 slidesPerView: 2,
861 centerInsufficientSlides: true,
862 freeMode: true,
863 watchSlidesVisibility: true,
864 watchSlidesProgress: true,
865 breakpoints: {
866 768: {
867 slidesPerView: 3
868 },
869 992: {
870 slidesPerView: 4
871 },
872 1200: {
873 slidesPerView: 5
874 }
875 },
876 });
877
878 this.lightbox = new Swiper("#lightbox-swiper", {
879 spaceBetween: 10,
880 autoHeight: true,
881 observer: true,
882 observeSlideChildren: true,
883 keyboard: {
884 enabled: true
885 },
886 navigation: {
887 nextEl: ".swiper-button-next",
888 prevEl: ".swiper-button-prev"
889 },
890 thumbs: {
891 swiper: this.thumbnails
892 }
893 });
894 },
895 customShare: function(type, title, description, image = ""){
896 if(type == "facebook"){
897 var winHeight = 450,
898 winWidth = 600,
899 winTop = window.screen.height / 2 - winHeight / 2,
900 winLeft = window.screen.width / 2 - winWidth / 2,
901 params = "scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no,width=" + winWidth + ",height=" + winHeight + ",left=" + winLeft + ",top=" + winTop,
902 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;
903
904 window.open(link, "Facebook", params);
905 }
906
907 if(type == "twitter"){
908 var link = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(title) + "&url=" + encodeURIComponent(window.location.href);
909
910 window.open(link, "_blank").focus();
911 }
912
913 if(type == "pinterest"){
914 var link = "https://pinterest.com/pin/create/button/?url=" + encodeURIComponent(window.location.href) + "&description=" + encodeURIComponent(title);
915
916 window.open(link, "_blank").focus();
917 }
918
919 if(type == "whatsapp"){
920 var link = "https://wa.me?text=" + encodeURIComponent(title + ": " + window.location.href);
921
922 window.open(link, "_blank").focus();
923 }
924
925 if(type == "telegram"){
926 var link = "https://t.me/share/url?url=" + window.location.href + "&text=" + encodeURIComponent(title);
927
928 window.open(link, "_blank").focus();
929 }
930
931 if(type == "print"){
932 window.print();
933 }
934
935 if(type == "link"){
936 this.legacyShare();
937 }
938 }
939 }
940 };
941
942 document.addEventListener("DOMContentLoaded", function(){
943 var app = initVueApp(
944 "#${portletNamespace}",
945 "${portletNamespace}",
946 [d40_favorites, d40_share, ${portletNamespace}_custom_hook]
947 );
948 });
949
950 var groupedCategories = '${groupedCategories?js_string}';
951 var contentCoords = [${lat}, ${lng}];
952 console.log("espongo " + groupedCategories);
953</script>
it_IT
Cosa
fare
it_IT
Esperienze
it_IT
Dove
dormire
it_IT
Offerte
it_IT
Info