处理模板时发生错误。
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														&times;   ${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>