Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing:
==> dynamicElement.element("dynamic-content") [in template "20095#20121#35356" at line 278, column 18]
----
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 dynamicElement.element("dynamic-c... [in template "20095#20121#35356" at line 278, column 13]
----
1<#-- V3.2 -->
2
3<#setting locale = themeDisplay.getLocale() />
4<#setting time_zone = "Europe/Rome" />
5
6<#assign
7 FriendlyURLEntryLocalService = serviceLocator.findService("com.liferay.friendly.url.service.FriendlyURLEntryLocalService")
8 ClassNameService = serviceLocator.findService("com.liferay.portal.kernel.service.ClassNameService")
9 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
10 LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")
11 journalArticleId = .vars['reserved-article-id'].data
12 journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.journal.service.JournalArticleResourceLocalServiceUtil"]
13 assetCategoryLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil"]
14 articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)
15 categoryList = assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK)
16 AssetVocabularyLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetVocabularyLocalServiceUtil"]
17 has_custom_coordinates = (CustomLat.getData()?has_content && CustomLat.getData() != "null" && CustomLat.getData()?number != 0 && CustomLng.getData()?has_content && CustomLng.getData() != "null" && CustomLng.getData()?number != 0)
18/>
19
20<#if has_custom_coordinates>
21
22 <#attempt>
23 <#assign
24 custom_lat = CustomLat.getData()?number
25 custom_lng = CustomLng.getData()?number
26 />
27 <#recover>
28 <#assign has_custom_coordinates = false />
29 </#attempt>
30
31</#if>
32
33<#setting locale = themeDisplay.getLocale() />
34
35<#-- gestione dei breadcrumbs -->
36<#assign
37 paginaPadre = LayoutLocalService.getLayout(groupId, PaginaPadre.getData()?eval.privateLayout, PaginaPadre.getData()?eval.layoutId?number)
38 ancestors = paginaPadre.getAncestors()
39 sorted_ancestors = []
40/>
41
42<#list ancestors as parente>
43 <#assign
44 sorted_ancestors +=
45 [{
46 "name": parente.getName(themeDisplay.getLanguageId()),
47 "ancestors": parente.getAncestors()?size,
48 "data": parente
49 }]
50 />
51</#list>
52
53<div class="container finmatica-breadcrumb-container mb-4">
54 <div class="row justify-content-center">
55 <div class="col-12 col-lg-10">
56 <div class="cmp-breadcrumbs" role="navigation">
57 <nav class="breadcrumb-container" aria-label="breadcrumb">
58 <ol class="breadcrumb p-0" data-element="breadcrumb">
59 <li class="breadcrumb-item"><a
60 href="${themeDisplay.getThemeSetting('Home URL')}">
61 <span class="breadcrumb-text-truncate">Home</span>
62 </a>
63 <span class="separator">/</span>
64 </li>
65 <#list sorted_ancestors?sort_by("ancestors") as ancestor>
66 <li class="breadcrumb-item"><a
67 href="/portal${ancestor.data.getFriendlyURL()}">
68 <span class="breadcrumb-text-truncate">
69 ${ancestor.name}
70 </span>
71 </a>
72 <span class="separator">/</span>
73 </li>
74 </#list>
75 <li class="breadcrumb-item"><a
76 href="/portal${paginaPadre.getFriendlyURL()}">
77 <span class="breadcrumb-text-truncate">
78 ${paginaPadre.getName(themeDisplay.getLanguageId())}
79 </span>
80 </a>
81 <span class="separator">/</span>
82 </li>
83 <li class="breadcrumb-item">${Titolo.getData()}</li>
84 </ol>
85 </nav>
86 </div>
87 </div>
88 </div>
89</div>
90
91<#assign
92 argomenti = []
93 tipi_luogo = []
94/>
95<#list categoryList as categoryEntry>
96 <#assign
97 vocabulary = AssetVocabularyLocalServiceUtil.getVocabulary(categoryEntry.getVocabularyId())
98 className = ClassNameService.fetchClassName("com.liferay.asset.kernel.model.AssetCategory")
99 friendlyUrlEntry = FriendlyURLEntryLocalService.getMainFriendlyURLEntry(className.getClassNameId(), categoryEntry.categoryId)
100 friendlyUrlList = FriendlyURLEntryLocalService.getFriendlyURLEntryLocalizations(friendlyUrlEntry.friendlyURLEntryId)
101 cat_name = categoryEntry.name
102 cat_localized_name = categoryEntry.getTitle(themeDisplay.getLocale(), true),
103 cat_url = friendlyUrlList[0].urlTitle
104 />
105 <#if
106 vocabulary.name == "tassonomia argomenti"
107 || vocabulary.name == "tassonomia argomento"
108 >
109 <#assign
110 argomenti +=
111 [{
112 "name": cat_localized_name,
113 "url": cat_url
114 }]
115 />
116 <#elseif vocabulary.name == "tassonomia tipi di luogo">
117 <#assign
118 tipi_luogo += [ cat_localized_name ]
119 />
120 </#if>
121</#list>
122
123
124<#assign luoghi_collegati = [] />
125<#if LuoghiCollegati.getData()?has_content>
126 <#list LuoghiCollegati.getSiblings() as cur_LuoghiCollegati>
127 <#assign
128 luogoData = jsonFactoryUtil.createJSONObject(cur_LuoghiCollegati.getData())
129 relatedArticles = JournalArticleLocalService.getArticlesByResourcePrimKey(luogoData.classPK?number)
130 />
131 <#if relatedArticles?? && relatedArticles?size gt 0>
132 <#assign
133 relatedArticle = relatedArticles[0]
134 document = relatedArticle.getDocumentByLocale(themeDisplay.getLocale())
135 rootElement = document.getRootElement()
136 nome_luogo = ""
137 immagine = ""
138 orari_luogo = ""
139 indirizzo_luogo = ""
140 url_luogo = cur_LuoghiCollegati.getFriendlyUrl()
141 />
142 <#list rootElement.elements() as dynamicElement>
143 <#if dynamicElement.attributeValue("field-reference") == "Titolo">
144 <#assign nome_luogo = dynamicElement.element("dynamic-content").getText() />
145 <#elseif dynamicElement.attributeValue("field-reference")=="OrarioPerIlPubblico">
146 <#if dynamicElement.element("dynamic-content")??>
147 <#assign orari_luogo = dynamicElement.element("dynamic-content").getText() />
148 </#if>
149 <#elseif dynamicElement.attributeValue("field-reference")=="Indirizzo">
150 <#assign indirizzo_luogo = dynamicElement.element("dynamic-content").getText() />
151 <#elseif dynamicElement.attributeValue("field-reference")=="CAP">
152 <#if indirizzo_luogo != "">
153 <#assign
154 indirizzo_luogo += ", ${dynamicElement.element('dynamic-content').getText()}"
155 />
156 </#if>
157 <#elseif dynamicElement.attributeValue("field-reference") == "Immagine">
158 <#assign immagine = dynamicElement.element("dynamic-content").getText() />
159 <#if immagine?has_content>
160 <#assign immagine = jsonFactoryUtil.createJSONObject(immagine) />
161 <#if immagine?has_content>
162 <#assign immagine = immagine?eval />
163 </#if>
164 </#if>
165 </#if>
166 </#list>
167 <#assign
168 luoghi_collegati +=
169 [{
170 "nome": nome_luogo,
171 "immagine": immagine,
172 "orari": orari_luogo,
173 "url": url_luogo,
174 "indirizzo": indirizzo_luogo
175 }]
176 />
177 </#if>
178 </#list>
179</#if>
180
181<#-- GET STRUTTURA RESPONSABILE -->
182
183<#assign
184 struttura_responsabile_Data = jsonFactoryUtil.createJSONObject(StrutturaResponsabile.getData())
185 has_struttura_responsabile = struttura_responsabile_Data?eval?has_content
186/>
187
188<#if has_struttura_responsabile>
189 <#assign relatedArticles = JournalArticleLocalService.getArticlesByResourcePrimKey(struttura_responsabile_Data.classPK?number) />
190 <#if relatedArticles?? && relatedArticles?size gt 0>
191 <#assign
192 relatedArticle = relatedArticles[0]
193 document = relatedArticle.getDocumentByLocale(themeDisplay.getLocale())
194 struttura_responsabile_root = document.getRootElement()
195 nome_struttura = ""
196 indirizzo_struttura = ""
197 immagine_struttura = ""
198 orari_struttura = ""
199 url_struttura = relatedArticle.getUrlTitle()
200 />
201
202 <#list struttura_responsabile_root.elements() as dynamicElement>
203 <#if dynamicElement.attributeValue("field-reference") == "Titolo">
204 <#assign nome_struttura = dynamicElement.element("dynamic-content").getText() />
205 <#elseif dynamicElement.attributeValue("field-reference") == "SedePrincipale">
206 <#assign sede_data = jsonFactoryUtil.createJSONObject(dynamicElement.element("dynamic-content").getData()) />
207 <#if sede_data.classPK??>
208 <#assign
209 Sedi = JournalArticleLocalService.getArticlesByResourcePrimKey(sede_data.classPK?number)
210 Sede = Sedi[0]
211 document = Sede.getDocumentByLocale(themeDisplay.getLocale())
212 rootElement = document.getRootElement()
213 />
214 <#list rootElement.elements() as dynamicElement>
215 <#if dynamicElement.attributeValue("field-reference") == "Indirizzo">
216 <#assign indirizzo_struttura = dynamicElement.element("dynamic-content").getText() />
217 <#elseif dynamicElement.attributeValue("field-reference") == "CAP">
218 <#assign indirizzo_struttura += ', ${dynamicElement.element("dynamic-content").getText()}' />
219 <#elseif dynamicElement.attributeValue("field-reference") == "OrarioPerIlPubblico">
220 <#assign orari_struttura = dynamicElement.element("dynamic-content").getText() />
221 </#if>
222 </#list>
223 </#if>
224 <#elseif dynamicElement.attributeValue("field-reference") == "Immagine">
225 <#assign immagine_struttura = dynamicElement.element("dynamic-content").getText() />
226 <#if immagine_struttura?has_content>
227 <#assign immagine_struttura = jsonFactoryUtil.createJSONObject(immagine_struttura) />
228 <#if immagine_struttura?has_content>
229 <#assign immagine_struttura = immagine_struttura?eval />
230 </#if>
231 </#if>
232 </#if>
233 </#list>
234 </#if>
235</#if>
236
237<#-- GET VIDEOGALLERY -->
238<#assign videogallery = [] />
239<#if GalleriaDiVideo.getData()?has_content>
240 <#list GalleriaDiVideo.getSiblings() as cur_GalleriaDiVideo>
241 <#assign videogallery +=[cur_GalleriaDiVideo.getData()] />
242 </#list>
243</#if>
244
245<#-- GET PHOTOGALLERY -->
246<#assign photogallery = [] />
247<#if GalleriaDiImmagini.getSiblings()?has_content>
248<#list GalleriaDiImmagini.getSiblings() as cur_GalleriaDiImmagini>
249 <#if cur_GalleriaDiImmagini.getData()?? && cur_GalleriaDiImmagini.getData() != "">
250 <#assign
251 photogallery +=
252 [{
253 "alt": cur_GalleriaDiImmagini.getAttribute("alt"),
254 "fileentryid": cur_GalleriaDiImmagini.getAttribute("fileEntryId"),
255 "src": cur_GalleriaDiImmagini.getData()
256 }]
257 />
258 </#if>
259</#list>
260</#if>
261
262<#-- SEZIONE GET CONTATTI -->
263<#assign
264 contatti_wallet = []
265 contatti_data = jsonFactoryUtil.createJSONObject(PuntiDiContatto.getData())
266 has_contatti = contatti_data?eval?has_content
267/>
268
269<#if has_contatti>
270 <#assign relatedArticles = JournalArticleLocalService.getArticlesByResourcePrimKey(contatti_data.classPK?number) />
271 <#if relatedArticles?? && relatedArticles?size gt 0>
272 <#assign
273 relatedArticle = relatedArticles[0]
274 document = relatedArticle.getDocumentByLocale(themeDisplay.getLocale())
275 rootElement = document.getRootElement()
276 />
277 <#list rootElement.elements() as dynamicElement>
278 <#if dynamicElement.element("dynamic-content").getText()?has_content>
279 <#assign
280 tipo_contatto = (dynamicElement.attributeValue("field-reference") == "URL" )?string("Sito Web", dynamicElement.attributeValue("field-reference"))
281 contatti_wallet +=
282 [{
283 "tipo": tipo_contatto,
284 "valore": dynamicElement.element("dynamic-content").getText()
285 }]
286 />
287 </#if>
288 </#list>
289 </#if>
290</#if>
291
292<div class="container">
293 <div class="row justify-content-center">
294 <div class="col-12 col-lg-10">
295 <div class="cmp-heading pb-3 pb-lg-4">
296 <div class="row">
297 <div class="col-lg-8">
298 <h1 class="title-xxxlarge" data-element="service-title">
299 ${Titolo.getData()}
300 </h1>
301 <#if NomeAlternativo.getData() !="">
302 <p class="subtitle-small mb-5">
303 ${NomeAlternativo.getData()}
304 </p>
305 </#if>
306 </div>
307
308 <div class="col-lg-3 offset-lg-1">
309
310 <div class="dropdown" id="fallback-share">
311 <button
312 aria-label="condividi sui social"
313 class="btn btn-dropdown dropdown-toggle text-decoration-underline d-inline-flex align-items-center fs-6 text-primary"
314 type="button"
315 id="shareActions"
316 data-bs-toggle="dropdown"
317 aria-haspopup="true"
318 aria-expanded="false"
319 >
320 <svg class="icon icon-primary" aria-hidden="true">
321 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-share"></use>
322 </svg>
323 <small><@liferay.language key="share" /></small>
324 </button>
325 <div class="dropdown-menu shadow-lg" aria-labelledby="shareActions">
326 <div class="link-list-wrapper">
327 <ul class="link-list" role="menu">
328 <li role="none">
329 <button class="list-item text-primary px-3 fs-6" role="menuitem" onclick="shareOn('facebook')">
330 <svg class="icon icon-primary" aria-hidden="true">
331 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-facebook"></use>
332 </svg>
333 <span>Facebook</span>
334 </button>
335 </li>
336 <li role="none">
337 <button class="list-item text-primary px-3 fs-6" role="menuitem" onclick="shareOn('twitter')">
338 <svg class="icon icon-primary" aria-hidden="true">
339 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-twitter"></use>
340 </svg>
341 <span><@liferay.language key="Twitter" /></span>
342 </button>
343 </li>
344 <li role="none">
345 <button class="list-item text-primary px-3 fs-6" role="menuitem" onclick="shareOn('whatsapp')">
346 <svg class="icon icon-primary" aria-hidden="true">
347 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-whatsapp"></use>
348 </svg>
349 <span>Whatsapp</span>
350 </button>
351 </li>
352 </ul>
353 </div>
354 </div>
355 </div>
356
357 <div class="dropdown">
358 <button
359 aria-label="vedi azioni da compiere sulla pagina"
360 class="btn btn-dropdown dropdown-toggle text-decoration-underline d-inline-flex align-items-center fs-0"
361 type="button"
362 id="viewActions"
363 data-bs-toggle="dropdown"
364 aria-haspopup="true"
365 aria-expanded="false"
366 >
367 <svg class="icon icon-primary" aria-hidden="true">
368 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-more-items"></use>
369 </svg>
370 <small><@liferay.language key="actions" /></small>
371 </button>
372 <div class="dropdown-menu shadow-lg" aria-labelledby="viewActions">
373 <div class="link-list-wrapper">
374 <ul class="link-list" role="menu">
375 <li role="none">
376 <button class="list-item px-3 fs-6 text-primary" onclick="window.print()" role="menuitem">
377 <svg class="icon icon-primary" aria-hidden="true">
378 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-print"></use>
379 </svg>
380 <span><@liferay.language key="print" /></span>
381 </button>
382 </li>
383 <li role="none">
384 <a class="list-item mail-anchor px-3 fs-6" href="mailto:" role="menuitem">
385 <svg class="icon icon-primary" aria-hidden="true">
386 <use xlink:href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-mail"></use>
387 </svg>
388 <span><@liferay.language key="send" /></span>
389 </a>
390 </li>
391 </ul>
392 </div>
393 </div>
394 </div>
395
396 <#list tipi_luogo>
397 <div class="mt-4 mb-3">
398 <span class="text-paragraph-small fw-semibold"><@liferay.language key="place-type" />:</span>
399 </div>
400 <ul class="d-flex d-lg-block">
401
402 <ul class="d-flex flex-wrap gap-2 mt-10 mb-3">
403 <#items as tipo>
404 <li>
405 <span class="badge bg-primary">${tipo}</span>
406 </li>
407 </#items>
408 </ul>
409
410 </ul>
411 </#list>
412 </div>
413 </div>
414 </div>
415 </div>
416 </div>
417</div>
418
419<#-- IMMAGINE HERO -->
420<#if Immagine.getData()?? && Immagine.getData() !="">
421 <div class="container-fluid my-3">
422 <div class="row">
423 <figure class="figure px-0 img-full">
424 <img src="${Immagine.getData()}" class="figure-img img-fluid" alt="${Immagine.getAttribute('alt')}" loading="lazy">
425 <figcaption class="figure-caption text-center pt-3">
426 ${Immagine.getAttribute("alt")}
427 </figcaption>
428 </figure>
429 </div>
430 </div>
431</#if>
432<#-- NAVIGAZIONE E CONTENUTO -->
433<div class="container">
434 <div class="row border-top border-light row-column-menu-left pb-4 pb-lg-80">
435 <div class="col-12 col-lg-3 mb-4 border-col">
436 <div class="cmp-navscroll sticky-top" aria-labelledby="accordion-title-one">
437 <nav class="navbar it-navscroll-wrapper navbar-expand-lg" aria-label="${languageUtil.get(locale, 'page-index')}" data-bs-navscroll="">
438 <div class="navbar-custom" id="navbarNavProgress">
439 <div class="menu-wrapper">
440 <div class="link-list-wrapper">
441 <div class="accordion">
442 <div class="accordion-item">
443 <span class="accordion-header" id="accordion-title-one">
444 <button class="accordion-button pb-10 px-3" type="button" data-bs-toggle="collapse" data-bs-target="#collapse-one" aria-expanded="true" aria-controls="collapse-one">
445 <@liferay.language key="page-index" />
446 <svg class="icon icon-xs right">
447 <use href="${themeDisplay.getPathThemeImages()}/sprite.svg#it-expand"></use>
448 </svg>
449 </button>
450 </span>
451 <div class="progress">
452 <div class="progress-bar it-navscroll-progressbar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;" aria-label="Progress bar"></div>
453 </div>
454 <div id="collapse-one" class="accordion-collapse collapse show" role="region" aria-labelledby="accordion-title-one">
455 <div class="accordion-body">
456 <ul class="link-list" data-element="page-index">
457
458 <#-- LINK A SEZIONE -->
459 <#if DescrizioneEstesa.getData()?has_content>
460 <@navigatorLink sectionId="description" title="${languageUtil.get(locale, 'description')}" />
461 </#if>
462
463 <#if photogallery?size gt 0>
464 <@navigatorLink sectionId="photogallery" title="${languageUtil.get(locale, 'image-gallery')}" />
465 </#if>
466
467 <#if videogallery?size gt 0>
468 <@navigatorLink sectionId="videogallery" title="${languageUtil.get(locale, 'video-gallery')}" />
469 </#if>
470
471 <#if LuoghiCollegati.getData()?has_content && luoghi_collegati?size gt 0>
472 <@navigatorLink sectionId="related-places" title="${languageUtil.get(locale, 'related-places')}" />
473 </#if>
474
475 <#if ServiziPresentiNelLuogo.getData()?has_content>
476 <@navigatorLink sectionId="services" title="${languageUtil.get(locale, 'offered-services')}" />
477 </#if>
478
479 <#if ModalitaAccesso.getData()?has_content>
480 <@navigatorLink sectionId="access" title="${languageUtil.get(locale, 'access-mode')}" />
481 </#if>
482
483 <#if Indirizzo.getData()?has_content>
484 <@navigatorLink sectionId="location" title="${languageUtil.get(locale, 'address')}" />
485 </#if>
486
487 <#if OrarioPerIlPubblico.getData()?has_content>
488 <@navigatorLink sectionId="timetable" title="${languageUtil.get(locale, 'opening-times')}" />
489 </#if>
490
491 <#if has_contatti && contatti_wallet?size gt 0>
492 <@navigatorLink sectionId="contacts" title="${languageUtil.get(locale, 'contact')}" />
493 </#if>
494
495 <#if (StrutturaResponsabile.getData()?has_content && nome_struttura?has_content)>
496 <@navigatorLink sectionId="chief-uo" title="${languageUtil.get(locale, 'chief-UO')}" />
497 </#if>
498
499 <#if UlterioriInformazioni.getData()?has_content>
500 <@navigatorLink sectionId="more-info" title="${languageUtil.get(locale, 'additional-information')}" />
501 </#if>
502
503 </ul>
504 </div>
505 </div>
506 </div>
507 </div>
508 </div>
509 </div>
510 </div>
511 </nav>
512 </div>
513 </div>
514 <div class="col-12 col-lg-8 offset-lg-1">
515 <div class="it-page-sections-container pt-4 unstiled-lists-wrapper">
516
517 <#if DescrizioneEstesa.getData()?has_content>
518 <section class="it-page-section mb-30" id="description">
519 <h2 class="title-xxlarge mb-3"><@liferay.language key="description" /></h2>
520 <div class="richtext-wrapper lora">
521 ${DescrizioneEstesa.getData()}
522 </div>
523 </section>
524 </#if>
525
526 <#list photogallery>
527 <section class="it-page-section mb-30" id="photogallery">
528 <h2 class="title-xxlarge mb-3"><@liferay.language key="image-gallery" /></h2>
529 <div class="it-carousel-wrapper it-carousel-landscape-abstract-three-cols splide splide--slide splide--ltr splide--draggable is-active mb-4" data-bs-carousel-splide="" id="splide01">
530 <div class="splide__track" id="splide01-track" style="padding-left: 0px; padding-right: 0px;">
531 <ul class="splide__list it-carousel-all" id="splide01-list" style="transform: translateX(0px);">
532 <#items as img>
533 <li class="splide__slide is-active is-visible h-100" id="splide01-slide0${img?counter}" style="margin-right: 24px; width: calc(calc(100% / 3) - 16px);" tabindex="0" data-focus-mouse="false">
534 <div class="it-single-slide-wrapper">
535 <figure>
536 <a href="${img.src}">
537 <img src="${img.src}" alt="${img.alt}" class="img-fluid" style="width: 100%; object-fit: cover; object-position: center; aspect-ratio: 1/1;" loading="lazy">
538 </a>
539 <figcaption class="figure-caption mt-2 text-center small text-muted">
540 ${img.alt}
541 </figcaption>
542 </figure>
543 </div>
544 </li>
545 </#items>
546 </ul>
547 </div>
548 </div>
549 </section>
550 </#list>
551
552 <#list videogallery>
553 <section class="it-page-section mb-30" id="videogallery">
554 <h2 class="mb-3"><@liferay.language key="video-gallery" /></h2>
555 <div id="iframe-wrapper">
556 <#items as cur_Sezione_URLVideo>
557 <div class="iframe-element">
558 ${cur_Sezione_URLVideo}
559 </div>
560 </#items>
561 </div>
562 </section>
563 </#list>
564
565 <#list luoghi_collegati>
566 <section class="it-page-section mb-30" id="related-places">
567 <h2 class="title-xxlarge mb-3"><@liferay.language key="related-places" /></h2>
568 <div class="col-12 col-md-8 col-lg-6 mb-30 ps-0">
569 <#items as luogo>
570 <div class="card-wrapper rounded h-auto mt-10">
571 <div class="card card-teaser card-teaser-info rounded shadow-sm p-3">
572 <div class="card-body pe-3">
573 <a href="${luogo.url}">
574 <p class="card-title fw-semibold text-paragraph-regular-medium-semi mb-0 primary-color-b3">
575 ${luogo.nome}
576 </p>
577 </a>
578 <div class="card-text">
579 <#if luogo.orari?has_content>
580 <p class="u-main-black" style="word-break: break-word; font-size: 1rem !important;">
581 ${luogo.orari}
582 </p>
583 </#if>
584 <#if luogo.indirizzo?has_content>
585 <small class="small text-muted mt-3" style="word-break: break-word;">
586 ${luogo.indirizzo}
587 </small>
588 </#if>
589 </div>
590 </div>
591
592 <#if luogo.immagine?has_content && luogo.immagine.url?has_content>
593 <div class="avatar size-xl">
594 <img
595 title="${luogo.nome}"
596 alt="${luogo.immagine.alt}"
597 src="${luogo.immagine.url}"
598 style="aspect-ratio: 1;"
599 />
600 </div>
601 </#if>
602
603 </div>
604 </div>
605 </#items>
606 </div>
607 </section>
608 </#list>
609
610 <#if ServiziPresentiNelLuogo.getData()?has_content>
611 <section class="it-page-section mb-30" id="services">
612 <h2 class="title-xxlarge mb-3"><@liferay.language key="offered-services" /></h2>
613 <div class="richtext-wrapper lora">
614 ${ServiziPresentiNelLuogo.getData()}
615 </div>
616 </section>
617 </#if>
618
619 <#if ModalitaAccesso.getData()?has_content>
620 <section class="it-page-section mb-30" id="access">
621 <h2 class="title-xxlarge mb-3"><@liferay.language key="access-mode" /></h2>
622 <div class="richtext-wrapper lora">
623 ${ModalitaAccesso.getData()}
624 </div>
625 </section>
626 </#if>
627
628 <#if Indirizzo.getData()?has_content>
629 <section class="it-page-section mb-30" id="location">
630 <h2 class="title-xxlarge mb-3"><@liferay.language key="address" /></h2>
631 <div class="map-wrapper row">
632 <div class="col-12">
633
634 <#assign
635 latitude = 0
636 longitude = 0
637 />
638
639 <#-- Le coordinate definite dall'utente nei campi di testo hanno la precedenza su quelli definiti tramite marker -->
640 <#if has_custom_coordinates>
641
642 <#assign
643 latitude = custom_lat
644 longitude = custom_lng
645 />
646
647 <#elseif (Geolocalizzazione.getData() != "")>
648 <#assign geolocationJSONObject = jsonFactoryUtil.createJSONObject(Geolocalizzazione.getData())>
649
650 <#assign latitude = geolocationJSONObject.getDouble("lat")>
651 <#assign longitude = geolocationJSONObject.getDouble("lng")>
652 </#if>
653
654 <#if latitude?has_content && longitude?has_content>
655
656 <@liferay_map["map-display"]
657 geolocation=true
658 latitude=latitude
659 longitude=longitude
660 name="Geolocalizzazione${random.nextInt()}"
661 />
662
663 <div class="mt-2 d-flex flex-wrap align-items-center">
664 <small class="small text-muted d-inline-block me-3"><@liferay.language key="latitude" />: ${latitude}</small>
665 <small class="small text-muted d-inline-block"><@liferay.language key="longitude" />: ${longitude}</small>
666 </div>
667
668 </#if>
669 </div>
670 </div>
671 <div class="richtext-wrapper lora mt-4">
672 <#if (Indirizzo.getData())??>
673 <div>
674 <span class="fw-semibold"><@liferay.language key="address" />: </span>${Indirizzo.getData()}
675 </div>
676 </#if>
677 <#if (CAP.getData())??>
678 <div>
679 <span class="fw-semibold"><@liferay.language key="zip" />: </span>${CAP.getData()}
680 </div>
681 </#if>
682 <#if (Quartiere.getData())?? && Quartiere.getData()?has_content>
683 <div>
684 <span class="fw-semibold"><@liferay.language key="district" />: </span>${Quartiere.getData()}
685 </div>
686 </#if>
687 <#if (Circoscrizione.getData())?? && Circoscrizione.getData()?has_content>
688 <div>
689 <span class="fw-semibold"><@liferay.language key="precinct" />: </span>${Circoscrizione.getData()}
690 </div>
691 </#if>
692 </div>
693 </section>
694 </#if>
695
696 <#if OrarioPerIlPubblico.getData()?has_content>
697 <section class="it-page-section mb-30" id="timetable">
698 <h2 class="title-xxlarge mb-3"><@liferay.language key="opening-times" /></h2>
699 <div class="richtext-wrapper lora">
700 ${OrarioPerIlPubblico.getData()}
701 </div>
702 </section>
703 </#if>
704
705
706 <#if has_contatti>
707 <#list contatti_wallet>
708
709 <section class="it-page-section mb-30 pt-4" id="contacts">
710 <h2 class="title-xxlarge mb-3"><@liferay.language key="contact" /></h2>
711 <div class="row">
712 <div class="col-12 col-lg-6 shadow rounded p-3">
713 <#items as contatto>
714 <div>
715 <#assign url_type="" />
716 <#if
717 contatto.tipo=="Email"
718 || contatto.tipo=="PEC"
719 >
720 <#assign url_type="mailto:" />
721 <#elseif
722 contatto.tipo=="Telefono"
723 || contatto.tipo=="Whatsapp"
724 || contatto.tipo=="Telegram"
725 >
726 <#assign url_type="tel:" />
727 </#if>
728 <span class="fw-semibold">
729 <@liferay.language key="${contatto.tipo?replace(' ', '-')}" />:</span>
730 <span class="ms-1">
731 <a
732 href="${url_type}${contatto.valore}"
733 target="_blank"
734 class="t-primary"
735 >
736 ${contatto.valore}
737 </a>
738 </span>
739 </div>
740 </#items>
741 </div>
742 </div>
743 </section>
744
745 </#list>
746 </#if>
747
748 <#if has_struttura_responsabile && nome_struttura?has_content>
749 <section class="it-page-section mb-30" id="chief-uo">
750 <h2 class="title-xxlarge mb-3"><@liferay.language key="chief-UO" /></h2>
751 <div class="col-12 col-md-8 col-lg-6 mb-30 ps-0">
752 <div class="card-wrapper rounded h-auto mt-10">
753 <div class="card card-teaser card-teaser-info rounded shadow-sm p-3">
754 <div class="card-body pe-3">
755 <a href="${url_struttura}">
756 <p class="card-title fw-semibold text-paragraph-regular-medium-semi mb-0 primary-color-b3">
757 ${nome_struttura}
758 </p>
759 </a>
760 <div class="card-text">
761 <#if orari_struttura?has_content>
762 <p class="u-main-black" style="word-break: break-word; font-size: 1rem !important;">
763 ${orari_struttura}
764 </p>
765 </#if>
766 <#if indirizzo_struttura?has_content>
767 <small class="small text-muted mt-3" style="word-break: break-word;">
768 ${indirizzo_struttura}
769 </small>
770 </#if>
771 </div>
772 </div>
773
774 <#if immagine_struttura?has_content && immagine_struttura.url?has_content>
775 <div class="avatar size-xl">
776 <img
777 alt="${immagine_struttura.alt}"
778 src="${immagine_struttura.url}"
779 style="aspect-ratio: 1;"
780 />
781 </div>
782 </#if>
783
784 </div>
785 </div>
786 </div>
787 </section>
788 </#if>
789
790 <#if UlterioriInformazioni.getData()?has_content>
791 <section class="it-page-section mb-30" id="more-info">
792 <h2 class="title-xxlarge mb-3"><@liferay.language key="additional-information" /></h2>
793 <div class="richtext-wrapper lora">
794 ${UlterioriInformazioni.getData()}
795 </div>
796 </section>
797 </#if>
798
799 <#-- ARGOMENTI E CATEGORIE -->
800 <div class="border-top border-light pt-4 mt-2 mb-30">
801 <#list argomenti>
802 <span class="text-paragraph-small fw-semibold"><@liferay.language key="topics" />:</span>
803 <ul class="d-flex flex-wrap gap-2 mt-10 mb-3">
804 <#items as argomento>
805 <li>
806 <a href="${argomento.url}" class="chip chip-simple">
807 <span class="chip-label">${argomento.name}</span>
808 </a>
809 </li>
810 </#items>
811 </ul>
812 </#list>
813
814 <div class="mt-3">
815 <#-- DATA ULTIMA MODIFICA -->
816 <#assign
817 modifiedDate = dateUtil.parseDate("EEE, d MMM yyyy HH:mm:ss Z", .vars['reserved-article-modified-date'].data, localeUtil.getDefault())
818 displayModifiedDate = modifiedDate?datetime?string.short
819 />
820
821 <p class="text-paragraph-small mb-0 lora">
822 <span class="fw-semibold"><@liferay.language key="last-update-date" />: </span>
823 <span>
824 ${displayModifiedDate}
825 </span>
826 </p>
827 </div>
828
829 </div>
830 </div>
831 </div>
832 </div>
833</div>
834
835<script defer>
836 document.querySelectorAll(".mail-anchor").forEach(anchor => anchor.href = "mailto:&subject=${Titolo.getData()}&body=" + window.location.href)
837
838 function shareOn(type) {
839 let articleUrl = window.location.href;
840 const mapping = {
841 "facebook": "https://facebook.com/sharer/sharer.php?u=" + articleUrl,
842 "twitter": "https://twitter.com/intent/tweet/?text=" + articleUrl,
843 "linkedin": "http://www.linkedin.com/sharing/share-offsite/?url=" + articleUrl,
844 "whatsapp": "whatsapp://send?text=" + articleUrl
845 }
846
847 window.open(mapping[type], "_blank");
848 return
849 }
850
851 function bringMeTo(id) {
852 document.getElementById(id).scrollIntoView({behavior: 'smooth'});
853 }
854</script>
855
856<script>
857 // Function to dynamically load a script
858 function loadScript(src) {
859 return new Promise((resolve, reject) => {
860 const script = document.createElement('script');
861 script.src = src;
862 script.onload = resolve;
863 script.onerror = reject;
864 document.head.appendChild(script);
865 });
866 }
867
868 // Initialize all Splide elements on the page
869 async function initializeSplides() {
870 const splideElements = document.querySelectorAll('.splide');
871
872 // Check if there are any Splide elements on the page
873 if (splideElements.length === 0) {
874 return;
875 }
876
877 // Dynamically load Splide.js
878 try {
879 await loadScript('https://cdn.jsdelivr.net/npm/@splidejs/splide/dist/js/splide.min.js');
880
881 // Initialize each Splide element
882 splideElements.forEach((splideElement) => {
883 // Check if Splide is already initialized for this element
884 if (splideElement.classList.contains('is-initialized')) {
885 return;
886 }
887
888 // Initialize Splide
889 const splide = new Splide(splideElement, {
890 type: 'slide',
891 perPage: 3,
892 gap: 24,
893 padding: { left: 0, right: 0 },
894 arrows: false,
895 breakpoints: {
896 768: {
897 perPage: 1,
898 gap: 24,
899 padding: { left: 0, right: 0 },
900 arrows: false,
901 },
902 992: {
903 perPage: 2,
904 gap: 24,
905 padding: { left: 40, right: 40 },
906 arrows: false,
907 },
908 },
909 });
910
911 splide.mount();
912
913 // Mark Splide as initialized
914 splideElement.classList.add('is-initialized');
915 });
916 } catch (error) {
917 console.error("Failed to load Splide.js", error);
918 }
919 }
920
921 // Run the initializer after a 3-second delay
922 setTimeout(() => {
923 initializeSplides();
924 }, 3000);
925</script>
926
927<#macro navigatorLink sectionId title>
928<#local desc = "" />
929
930<#if title?? && title?has_content>
931 <#local desc = title />
932<#else>
933 <#local desc = sectionId />
934</#if>
935
936<li class="nav-item">
937 <a
938 class="nav-link active"
939 onclick="bringMeTo('${sectionId}')"
940 role="button"
941 aria-label="${languageUtil.get(locale, 'go-to-section')}: ${title}"
942 >
943 <span class="title-medium">${title}</span>
944 </a>
945</li>
946</#macro>