处理模板时发生错误。
The following has evaluated to null or missing:
==> nameTitle [in template "20604#20642#165940" at line 248, column 80]
----
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: ${nameTitle} [in template "20604#20642#165940" at line 248, column 78]
----
1<#import "_TEMPLATE_CONTEXT_/20604/20630/23609/495509" as d40>
2
3<#assign
4 dlService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")
5 journalServiceAPI = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
6 jals = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
7 lat = "0"
8 lng = "0"
9 hasCoords = false
10 articleId = .vars['reserved-article-id'].data
11 serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
12 httpServletRequest = serviceContext.getRequest()
13 groupIdSacriMonti=20630
14 articleGroupId=groupId
15/>
16<#assign headerCut="tr:w-3200,h-1200,fo-center">
17<#assign article = jals.getLatestArticle(groupId,articleId) />
18<#assign elasticId="com.liferay.journal.model.JournalArticle_PORTLET_"+article.getPrimaryKey()>
19<#assign z=httpServletRequest.setAttribute("elasticId", elasticId)>
20<#assign articleUuId = article.getPrimaryKey() />
21
22<script>
23 var articleUuId='${articleUuId}';
24 itinTitle=""
25 itinUrl=""
26
27</script>
28
29<#assign
30 currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()
31/>
32
33<#assign itineraryId = getParam("itId", currentUrl) />
34<#assign ddmItineraryStructureKey="587356">
35<#assign ddmTourStructureKey="165751">
36<#assign itinerarystructureKey="165751">
37
38<#if itineraryId?has_content>
39 <#assign itineraryGroupId = getParam("itGid",currentUrl)>
40 <#assign itinUrl=d40.getDetailUrl(itineraryId,itineraryGroupId?number,groupIdSacriMonti)>
41 <#assign itineraryArticle = jals.getLatestArticle(itineraryGroupId?number,itineraryId) />
42 <#assign itinerarystructureKey= itineraryArticle.getDDMStructureKey()/>
43 <#assign document = saxReaderUtil.read(itineraryArticle.getContent())>
44 <#assign rootElement = document.getRootElement()>
45 <#assign stringSelector = "dynamic-element[@name='CopyOftitle']/dynamic-content[@language-id = '" + locale + "']">
46 <#assign xPathSelector = saxReaderUtil.createXPath(stringSelector)>
47 <#if xPathSelector.selectSingleNode(rootElement)??>
48 <#assign itinTitle = xPathSelector.selectSingleNode(rootElement).getStringValue()>
49 <#else>
50 <#assign stringSelector2 = "dynamic-element[@name='title']/dynamic-content[@language-id = '" + locale + "']">
51 <#assign xPathSelector2 = saxReaderUtil.createXPath(stringSelector2)>
52 <#if xPathSelector2.selectSingleNode(rootElement)??>
53 <#assign itinTitle = xPathSelector2.selectSingleNode(rootElement).getStringValue()>
54 </#if>
55 </#if>
56
57
58</#if>
59
60<#-- FIXED OBJ - VISITA VIRTUALE -->
61<#if infoItemFieldSet.infoItemFieldSetFieldSet?? && infoItemFieldSet.infoItemFieldSetFieldSet.getSiblings()?has_content>
62 <#list infoItemFieldSet.getSiblings() as singleSet>
63 <#assign cur_infoSet = singleSet.infoItemFieldSetFieldSet />
64
65 <#if cur_infoSet.infoItemPiority.getData()?? && cur_infoSet.infoItemPiority.getData() == 'preview' >
66 <#if cur_infoSet.infoItemType.getData() == 'media360' >
67 <#if cur_infoSet.infoItemMediaItem.getSiblings()?has_content && cur_infoSet.infoItemMediaItem.getSiblings()[0].getData() != ''>
68 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/pannellum@2.5.6/build/pannellum.css"/>
69 <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/pannellum@2.5.6/build/pannellum.js"></script>
70 <style>
71 #panorama {
72 width: 100vw;
73 height: 100vh;
74 }
75 </style>
76
77 <!-- VT trigger modal -->
78 <button type="button" class="virtual-tour" id="vt-btn" data-toggle="modal" data-target="#vtModal">
79 visita virtuale
80 </button>
81
82 <!-- VT Modal -->
83 <div class="modal fade" id="vtModal" tabindex="-1" aria-labelledby="vtModal">
84 <div class="modal-dialog modal-full-screen">
85 <div class="modal-content">
86 <div class="modal-header">
87 <button type="button" class="close btn-green" data-dismiss="modal" aria-label="Close">
88 × ${d40.getLabel('chiudi')}
89 </button>
90 </div>
91 <div class="modal-body">
92 <div id="panorama"></div>
93 </div>
94 </div>
95 </div>
96 </div>
97
98 <script>
99<#-- AUI().ready((function(){
100 pannellum.viewer('panorama', {
101 "type": "equirectangular",
102 "panorama": "${cur_infoSet.infoItemMediaItem.getSiblings()[0].getData()}",
103 "autoLoad": true,
104 "mouseZoom": false
105 });
106 }));
107-->
108 AUI().ready((function(){
109 console.log("AUIReady");
110 jQuery('#vtModal').on('shown.bs.modal', function () {
111 console.log("onShowModal");
112 setTimeout(view360, 100);
113 })
114 }));
115
116 function view360 () {
117 console.log("360");
118 pannellum.viewer('panorama', {
119 "type": "equirectangular",
120 "panorama": "${cur_infoSet.infoItemMediaItem.getSiblings()[0].getData()}",
121 "autoLoad": true,
122 "mouseZoom": false
123 });
124 }
125
126 </script>
127 </#if>
128 </#if>
129 </#if>
130 </#list>
131</#if>
132
133
134<#-- STEPS NAVIGATION -->
135 <#assign
136 currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()
137 itineraryId = getParam("itId",currentUrl)
138 itineraryGroupId = getParam("itGid",currentUrl)
139 z=httpServletRequest.setAttribute("stageArticleId", articleId)
140 z=httpServletRequest.setAttribute("stageGroupId", groupId)
141 />
142
143 <#if itineraryId?has_content>
144 <div class="row-info-tour pt-5">
145 <@liferay_journal["journal-article"]
146 articleId=itineraryId
147 ddmTemplateKey="540085"
148 groupId=itineraryGroupId?number
149 />
150 </div>
151 </#if>
152<#-- END STEPS NAVIGATION -->
153
154<#-- set banner -->
155<#if infoItemFieldSet.infoItemFieldSetFieldSet?? && infoItemFieldSet.infoItemFieldSetFieldSet.getSiblings()?has_content>
156 <#list infoItemFieldSet.getSiblings() as singleSet>
157 <#assign cur_infoSet = singleSet.infoItemFieldSetFieldSet />
158 <#if cur_infoSet.infoItemPiority.getData()?? && cur_infoSet.infoItemPiority.getData() == 'preview' >
159 <#if cur_infoSet.infoItemMainPicture.getData()?? && cur_infoSet.infoItemMainPicture.getData() ?has_content >
160 <#assign banner=d40.getKitPrefix(cur_infoSet.infoItemMainPicture.getData(), headerCut)>
161 <#else>
162 <#assign banner="/o/sacrimonti-theme/images/suggesto/placeholders/pl_head.jpg">
163 </#if>
164 </#if>
165 </#list>
166</#if>
167
168<!-- HEADER -->
169<#assign numSlide = 0 />
170<div id="base-header" class="container-fluid">
171 <div class="row">
172 <div id="carouselFade" class="carousel slide carousel-fade" data-ride="carousel">
173 <div class="carousel-inner">
174 <#if slideshow.getSiblings()?has_content && slideshow.getSiblings()[0].getData()?has_content>
175 <#list slideshow.getSiblings() as cur_slideshow>
176 <#assign numSlide = numSlide + 1 />
177 <#if cur_slideshow?index == 0 >
178 <#assign slideClass = 'carousel-item active' />
179 <#else>
180 <#assign slideClass = 'carousel-item' />
181 </#if>
182 <#if (cur_slideshow.getData())?? && cur_slideshow.getData() != "">
183 <div class="${slideClass}">
184 <picture>
185 <source media="(max-width:850px)" srcset="${d40.getKitPrefix(cur_slideshow.getData(), headerCut)}">
186 <img class="d-block vw-100" alt="${cur_slideshow.getAttribute("alt")}" src="${d40.getKitPrefix(cur_slideshow.getData(), headerCut)}" loading="lazy" class="lazyload" />
187 </picture>
188 </div>
189 </#if>
190 </#list>
191 <#else>
192 <div class="carousel-item active">
193 <#if (img_desktop.getData())?? && img_desktop.getData() != "">
194 <picture>
195 <source media="(max-width:850px)" srcset="${d40.getKitPrefix(banner, 'tr:w-1200,fo-center')}">
196 <img class="d-block vw-100" alt="" src="${d40.getKitPrefix(img_desktop.getData(), headerCut)}" loading="lazy" class="lazyload" />
197 </picture>
198 <#else>
199 <picture>
200 <source media="(max-width:850px)" srcset="${d40.getKitPrefix(banner, 'tr:w-1200,fo-center')}">
201 <img class="d-block vw-100" alt="" src="${d40.getKitPrefix(banner, headerCut)}" loading="lazy" class="lazyload" />
202 </picture>
203 </#if>
204 <#-- <img class="d-block vw-100" src="${banner}" alt=""> -->
205 </div>
206 </#if>
207 </div>
208 <#if numSlide != 0>
209 <div class="carousel-indicators">
210 <#list slideshow.getSiblings() as cur_indi>
211 <#if cur_indi?index == 0 >
212 <#assign indClass = 'active' />
213 <#else>
214 <#assign indClass = '' />
215 </#if>
216 <button type="button" data-target="#carouselFade" data-slide-to="${cur_indi?index}" class="${indClass}" aria-current="true"></button>
217 </#list>
218 </div>
219 </#if>
220 </div>
221 </div>
222
223 <div class="title-overlay">
224
225 <#assign
226 webContentData = jsonFactoryUtil.createJSONObject(tourCollegato.getData())
227 />
228 <#if itinTitle?has_content>
229 <div class="go-back">
230 <a href="${itinUrl}">${itinTitle}</a>
231 </div>
232 <#elseif webContentData?? && webContentData.title??>
233 <#assign
234 article=jals.getLatestArticle(webContentData.classPK?number)
235 viewUrl=d40.getDetailUrl(article.articleId,groupId,groupId)
236 />
237
238 <div class="go-back">
239
240 <#assign document = saxReaderUtil.read(article.getContent())>
241 <#assign rootElement = document.getRootElement()>
242
243 <#assign stringSelector = "dynamic-element[@name='title']/dynamic-content[@language-id = '" + locale + "']">
244 <#assign xPathSelector = saxReaderUtil.createXPath(stringSelector)>
245 <#if xPathSelector.selectSingleNode(rootElement)??>
246 <#assign nameTitle = xPathSelector.selectSingleNode(rootElement).getStringValue()>
247 </#if>
248 <a href="${viewUrl}">${nameTitle}</a>
249
250 </div>
251 </#if>
252 <#if (title.getData())??>
253 <h1>${title.getData()}</h1>
254 </#if>
255 </div>
256</div>
257
258<!-- ROW-TXT-OFFSET -->
259<#if infoItemFieldSet.infoItemFieldSetFieldSet?? && infoItemFieldSet.infoItemFieldSetFieldSet.getSiblings()?has_content>
260 <#list infoItemFieldSet.getSiblings() as singleSet>
261 <#assign cur_infoSet = singleSet.infoItemFieldSetFieldSet />
262
263 <#if cur_infoSet.infoItemPiority.getData()?? && cur_infoSet.infoItemPiority.getData() == 'preview' >
264 <div class="container-fluid custom-container offset-left row-txt-offset mb-5">
265 <div class="row">
266 <div class="col-12 bg-gray p-lg-6">
267 <#if (cur_infoSet.infoItemTitle.getData())??>
268 <h2>${cur_infoSet.infoItemTitle.getData()}</h2>
269 </#if>
270 <#if (cur_infoSet.infoItemRichText.getData())??>
271 <p>${cur_infoSet.infoItemRichText.getData()}</p>
272 </#if>
273 </div>
274 </div>
275 </div>
276 </#if>
277 </#list>
278</#if>
279
280
281<!-- row-gallery -->
282<#assign
283 hasContentSlider = false
284 curGallery = 0
285
286 siteUrl = themeDisplay.getURLPortal()?replace("://", ".")
287/>
288
289<@setupGallery />
290
291<#if hasContentSlider>
292 <#if curGallery != 0>
293 <#assign dlFiles = dlService.getFileEntries(groupId, curGallery)>
294
295 <div class="row-gallery mb-5">
296 <div class="container-fluid custom-container">
297 <div class="row">
298 <div class="slider position-relative">
299 <div class="swiper carousel sliderGallery">
300 <div class="swiper-wrapper">
301
302 <#assign galleryIndex = 0>
303 <#list dlFiles as dlFile>
304 <#if (dlFile.getFileVersion().status == 0) && (dlFile.getFileVersion().description != "HIDE")>
305 <#assign defImage = "">
306 <#if galleryIndex == 0>
307 <#assign class = "active">
308 <#else>
309 <#assign class = "">
310 </#if>
311
312 <#assign descImage = "">
313 <#if dlFile.description != "" >
314 <#assign descImage = dlFile.description>
315 </#if>
316
317 <#assign uet = htmlUtil.unescape(dlFile.getTitle())>
318 <#if !defImage?has_content>
319 <#assign defImage = "/documents/${groupId}/${curGallery}/${uet}">
320 </#if>
321
322 <div class="swiper-slide">
323 <div class="carousel__slide w-100">
324 <a href="${d40.getKitPrefix(defImage, 'tr:w-1700,h-1000,fo-center')}" data-fancybox="gallery">
325 <div class="generalImg bg">
326 <img class="round-border" data-src="${d40.getKitPrefix(defImage, 'tr:w-850,h-500,fo-center')}" loading="lazy" class="lazyload" alt="${descImage}">
327 </div>
328 </a>
329 </div>
330 </div>
331
332 <#assign galleryIndex = galleryIndex + 1>
333 </#if>
334 </#list>
335
336 </div>
337 </div>
338
339 <div class="swiperBtn swiper-button-next">
340 <img src="/o/sacrimonti-theme/images/suggesto/icons/slider-arrow.svg">
341 </div>
342
343 <div class="swiperBtn swiper-button-prev">
344 <img src="/o/sacrimonti-theme/images/suggesto/icons/slider-arrow.svg">
345 </div>
346
347 <script type="text/javascript">
348 document.addEventListener('DOMContentLoaded', (e) => {
349 SuggestoImages.slider(".sliderGallery", {
350 breakpoints: {
351 991: { slidesPerView: 3, spaceBetween: 25 },
352 0: { slidesPerView: 2, spaceBetween: 15 },
353 }
354 });
355
356 SuggestoImages.gallery(".sliderGallery");
357 });
358 </script>
359 </div>
360 </div>
361 </div>
362 </div>
363 </#if>
364</#if>
365
366<#macro setupGallery>
367 <#if mainImageFolder??>
368 <#if mainImageFolder.getData()?has_content>
369 <#assign mainImage = mainImageFolder.getData()>
370 <#if mainImage??>
371 <#assign
372 startFrom = mainImage?last_index_of("/") + 1
373 endTo = mainImage?last_index_of("?") - 1
374 mainImageUid = mainImage[startFrom..endTo]
375 />
376 <#if mainImageUid??>
377 <#if dlService.getFileEntryByUuidAndGroupId(mainImageUid, groupId)??>
378 <#assign curGallery = dlService.getFileEntryByUuidAndGroupId(mainImageUid, groupId).folderId?number>
379 <#assign hasContentSlider = true>
380 <#else>
381 mainImageUid: ${mainImageUid}
382 </#if>
383 </#if>
384 </#if>
385 </#if>
386 </#if>
387</#macro>
388<!-- fine image gallery -->
389
390
391<!-- ROW-MAP -->
392<#-- inclusione mappa -->
393<#assign z=httpServletRequest.setAttribute("mapMediaItem","")>
394<#assign z=httpServletRequest.setAttribute("mapPDF","")>
395<#-- tour generale sacromonte collegato -->
396<#assign
397 smArticleId=""
398 webContentData = jsonFactoryUtil.createJSONObject(tourCollegato.getData())
399/>
400<#if itineraryId?has_content && itinerarystructureKey==ddmItineraryStructureKey>
401 <script>
402 var currentArticleId="${articleId}";
403 var currentTourArticleId="${itineraryId}";
404 var currentGroupId=${groupId};
405 var test="xxx";
406 var currentQueryType="itinerarytour";
407 var lat=${lat};
408 var lng=${lng};
409 </script>
410 <#assign mapArticle="523180">
411 <@liferay_journal["journal-article"]
412 articleId="${mapArticle}"
413 ddmTemplateKey="523174"
414 groupId=20630
415 />
416<#elseif itineraryId?has_content && itinerarystructureKey==ddmTourStructureKey>
417 <script>
418 var currentArticleId="${articleId}";
419 var currentTourArticleId="${itineraryId}";
420 var currentGroupId=${groupId};
421 var test="xxx";
422 var currentQueryType="stagetour";
423 var lat=${lat};
424 var lng=${lng};
425 </script>
426 <#assign mapArticle="523180">
427 <@liferay_journal["journal-article"]
428 articleId="${mapArticle}"
429 ddmTemplateKey="523174"
430 groupId=20630
431 />
432
433<#elseif webContentData?? && webContentData.classPK??>
434 <#assign article=journalServiceAPI.getLatestArticle(webContentData.classPK?number)>
435 <#assign smArticleId=article.getArticleId()>
436 <script>
437 var currentArticleId="${articleId}";
438 var currentTourArticleId="${smArticleId}";
439 var currentGroupId=${groupId};
440 var currentQueryType="stagetour";
441 var lat=${lat};
442 var lng=${lng};
443 </script>
444
445 <#assign mapArticle="523180">
446 <@liferay_journal["journal-article"]
447 articleId="${mapArticle}"
448 ddmTemplateKey="523174"
449 groupId=20630
450 />
451 </#if>
452
453
454
455
456
457
458<#--
459<div class="row-map mb-5">
460 <div class="container-fluid">
461 <div class="row">
462 <div class="col-12 text-center">
463 <h2>Scopri i Sacri Monti</h2>
464 <p>Lorem ipsum</p>
465 </div>
466 <div class="col-12 switch d-none">
467 <div class="contain-icon">
468 <i class="fa fa-map"></i>
469 <span>mappa</span>
470 </div>
471 <div class="contain-icon">
472 <i class="fa fa-grid"></i>
473 <span>griglia</span>
474 </div>
475 </div>
476 <div class="col-8 map">
477 <img class="responsive" src="/o/sacrimonti-theme/images/suggesto/placeholders/pl_map.png">
478 </div>
479 <div class="col-4">
480 <img class="responsive" src="/documents/d/guest/500x600">
481 </div>
482 </div>
483 </div>
484</div>
485-->
486
487<#-- Cycle infoItem -->
488<#if infoItemFieldSet.infoItemFieldSetFieldSet?? && infoItemFieldSet.infoItemFieldSetFieldSet.getSiblings()?has_content>
489 <#list infoItemFieldSet.getSiblings() as singleSet>
490 <#assign cur_infoSet = singleSet.infoItemFieldSetFieldSet />
491
492 <#if cur_infoSet.infoItemPiority.getData()?? && cur_infoSet.infoItemPiority.getData() == 'main' >
493 <#if cur_infoSet.infoItemType.getData() == 'media360' >
494 <#elseif cur_infoSet.infoItemType.getData() == 'mediaPicture' >
495 </#if>
496 </#if>
497 </#list>
498</#if>
499
500<#function getParam parName url>
501 <#assign parValue="">
502 <#assign params = url?keep_after("?")>
503 <#if params?has_content>
504 <#assign szList=params?split("&")>
505 <#list szList as par>
506 <#if par?starts_with(parName)>
507 <#assign parValue=par?keep_after(parName+"=")>
508 </#if>
509 </#list>
510 </#if>
511 <#return parValue>
512</#function>