Si è verificato un errore nell'elaborarazione del modello.
The following has evaluated to null or missing: ==> pagina [in template "20099#20135#170997243" at line 506, column 38] ---- 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 pagina != "" [in template "20099#20135#170997243" at line 506, column 33] ----
1<#-- instanceId -->
2<#assign instanceId = themeDisplay.getPortletDisplay().getId()?keep_after("INSTANCE_") />
3
4<#-- Funzioni utilita -->
5<#-- Ripulisco stringa da caratteri speciali -->
6<#function escapeExtraChar text>
7 <#return text?replace("\"",""", "r")?replace("'","’", "r")>
8</#function>
9
10<#-- Verifico se il primo elemento di una lista esiste -->
11<#function firstOfListNotEmpty list>
12 <#assign esito = false />
13 <#if list?? && list?has_content && list.getSiblings()?has_content && list.getSiblings()?first.getData()?has_content>
14 <#assign esito = true />
15 </#if>
16 <#return esito>
17</#function>
18
19<#-- Ricavo alcuni meta dati associati all'articolo -->
20<#-- Ricavo article id -->
21<#assign articleId = .vars['reserved-article-id'].data />
22<#-- Ricavo il titolo -->
23<#assign titolo = .vars['reserved-article-title'].data />
24
25<#-- Servizi utili -->
26<#assign catLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
27<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
28<#assign dlFileEntryLocalService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryLocalService') />
29<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
30
31<#-- Altri dati associati all'articolo che ricavo tramite API -->
32<#assign article = journalArticleLocalService.getArticle( groupId, articleId ) />
33<#assign linkArticolo = article.getUrlTitle() />
34<#assign articlePrimKey = article.resourcePrimKey />
35<#assign articleModifiedDate = article.getModifiedDate() />
36
37<#-- funzione per verificare che ci sia almeno un elemento in lista -->
38<#function oneAtLeastOfListNotEmpty list>
39 <#assign esito = false />
40 <#if list?? && list?has_content && list.getSiblings()?has_content>
41 <#list list.getSiblings() as cur_elem>
42 <#if cur_elem.getData()?has_content && cur_elem.getData()?trim != "">
43 <#assign esito = true />
44 <#break>
45 </#if>
46 </#list>
47 </#if>
48 <#return esito>
49</#function>
50
51<#-- funzione per ricavare il content di un articolo -->
52<#function getArticleContent articleId, templateKey>
53 <#assign cur_webcontent_article_display = journalArticleLocalService.getArticleDisplay(groupId, articleId, templateKey, "", locale, themeDisplay) />
54 <#assign result = cur_webcontent_article_display.getContent()/>
55 <#return result/>
56</#function>
57
58<#-- ricavo il gruppo corrente -->
59<#if themeDisplay.getScopeGroup().isStagingGroup() == true>
60 <#assign currentGroup = themeDisplay.getLayout().getGroup().getLiveGroup() />
61<#else>
62 <#assign currentGroup = themeDisplay.getLayout().getGroup() />
63</#if>
64
65<#-- ricavo la lista di vocabolari esclusi, separati da virgola e la pagina di dettaglio degli argomenti -->
66<#assign listaIdVocabolariEsclusiStr = "" />
67<#assign paginaDettaglioArgomenti = "" />
68<#if validator.isNotNull(currentGroup.getExpandoBridge())>
69 <#if currentGroup.getExpandoBridge().hasAttribute("lista_vocabolari_esclusi")>
70 <#if currentGroup.getExpandoBridge().getAttribute("lista_vocabolari_esclusi")??>
71 <#assign listaIdVocabolariEsclusiStr = currentGroup.getExpandoBridge().getAttribute("lista_vocabolari_esclusi")/>
72 </#if>
73 </#if>
74 <#if currentGroup.getExpandoBridge().hasAttribute("pagina_dettaglio_argomenti") >
75 <#if currentGroup.getExpandoBridge().getAttribute("pagina_dettaglio_argomenti")??>
76 <#assign paginaDettaglioArgomenti = currentGroup.getExpandoBridge().getAttribute("pagina_dettaglio_argomenti")/>
77 <#if paginaDettaglioArgomenti != "">
78 <#assign pagina = layoutLocalService.fetchLayoutByFriendlyURL(groupId, false, paginaDettaglioArgomenti)!"" />
79 </#if>
80 </#if>
81 </#if>
82</#if>
83
84<#-- HTML -->
85<section class="foglia-base foglia-news clearfix">
86
87 <#-- sezione titolo -->
88 <#assign titoloNews = titolo?js_string />
89 <#if title??>
90 <#if validator.isNotNull(title) && validator.isNotNull(title.getData())>
91 <h2>${title.getData()}</h2>
92 <#assign titoloNews = title.getData() />
93 <#else>
94 <h2>${titolo}</h2>
95 </#if>
96 <#else>
97 <h2>${titolo}</h2>
98 </#if>
99
100 <div class="content-editor clearfix">
101
102 <#-- SEZIONE PRINCIPALE -->
103 <div class="clearfix">
104
105 <#-- immagine principale -->
106 <#if image?has_content && validator.isNotNull(image.getData())>
107 <#attempt>
108
109 <#-- associo un valore di default -->
110 <#-- sostituita la classe originale pull-{*} con float-{*}, perchè non esiste in bs4 -->
111 <#assign image_position_css = "float-right" />
112 <#if image.image_position??>
113 <#if image.image_position?has_content && validator.isNotNull(image.image_position.getData())>
114 <#if image.image_position.getData() == "left">
115 <#assign image_position_css = "float-left" />
116 </#if>
117 </#if>
118 </#if>
119
120 <#-- a partire dal link, lo splitto e ricavo il secondo ed il 5 argomento che mi servono per il metodo successivo -->
121 <#assign parts = (image.getData())?split("/") />
122 <#assign groupId = getterUtil.getLong(parts[2]) />
123 <#assign uuId = parts[5]?split("?")[0] />
124
125 <#assign dlFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(uuId,groupId) />
126 <#assign versionId = dlFileEntry.getLatestFileVersion(true).getFileVersionId() />
127
128 <#assign formMap = dlFileEntry.getDDMFormValuesMap(versionId) />
129
130 <#assign alt = "", watermark_title = "", watermark_color = "", watermark_position = "" />
131
132 <#-- ricavo i metadata associati al tipo di documento, se esistono-->
133 <#list formMap?keys as formKey>
134 <#assign formValues = formMap[formKey].getDDMFormFieldValues() />
135 <#if formValues??>
136 <#list formValues as formValue>
137 <#if formValue.getName() == "alt">
138 <#assign alt = escapeExtraChar(formValue.getValue().getString(locale)) />
139 <#elseif formValue.getName() == "watermark_title">
140 <#assign watermark_title = escapeExtraChar(formValue.getValue().getString(locale)) />
141 <#elseif formValue.getName() == "watermark_color">
142 <#assign watermark_color = escapeExtraChar(formValue.getValue().getString(locale)) />
143 <#elseif formValue.getName() == "watermark_position">
144 <#assign watermark_position = escapeExtraChar(formValue.getValue().getString(locale)) />
145 </#if>
146 </#list>
147 </#if>
148 </#list>
149 <#if alt == "">
150 <#if title??>
151 <#if validator.isNotNull(title) && validator.isNotNull(title.getData())>
152 <#assign alt = title.getData()?js_string />
153 <#else>
154 <#assign alt = titolo?js_string />
155 </#if>
156 <#else>
157 <#assign alt = titolo?js_string />
158 </#if>
159 </#if>
160
161 <#-- contenitore della singola immagine -->
162 <div id="watermark-img-${instanceId}-${articleId}"></div>
163
164 <script type="text/javascript">
165 watermark(["${image.getData()}"])
166 <#if watermark_position == "top_right">
167 .image(watermark.text.upperRight('${watermark_title}', '20px titillium-semibold', '${watermark_color}', 1.0))
168 <#elseif watermark_position == "top_left">
169 .image(watermark.text.upperLeft('${watermark_title}', '20px titillium-semibold', '${watermark_color}', 1.0))
170 <#elseif watermark_position == "bottom_left">
171 .image(watermark.text.lowerLeft('${watermark_title}', '20px titillium-semibold', '${watermark_color}', 1.0))
172 <#else>
173 .image(watermark.text.lowerRight('${watermark_title}', '20px titillium-semibold', '${watermark_color}', 1.0))
174 </#if>
175 .then(function(img) {
176 img.alt = '${alt}';
177 img.width="400";
178 img.height="300";
179 img.className="img-fluid ${image_position_css}";
180 document.getElementById("watermark-img-${instanceId}-${articleId}").appendChild(img);
181 });
182 </script>
183
184 <#recover>
185 <#-- nn viene visualizzata alcuna immagine -->
186 </#attempt>
187
188 </#if>
189
190 <#-- descrizione -->
191 <#if description?has_content && validator.isNotNull(description.getData())>
192 <div>${description.getData()}</div>
193 </#if>
194
195 </div>
196 <#-- FINE SEZIONE PRINCIPALE -->
197
198
199 <#-- SEZIONE CENTRALE -->
200 <div class="clearfix pt-2">
201 <#-- ricavo il video se è stato inserito -->
202 <#if youtube_link??>
203 <#if validator.isNotNull(youtube_link) && validator.isNotNull(youtube_link.getData())>
204
205 <#-- ricavo la posizione del video rispetto al testo -->
206 <#assign video_position_css = "align-left" />
207 <#if youtube_link.video_position??>
208 <#if validator.isNotNull(youtube_link.video_position) && validator.isNotNull(youtube_link.video_position.getData()) >
209 <#if youtube_link.video_position.getData() == "right">
210 <#assign video_position_css = "align-right" />
211 </#if>
212 </#if>
213 </#if>
214
215 <#-- ricavo il video -->
216 <#assign id_video_1 = ""/>
217 <#assign id_video_2 = ""/>
218 <#assign id_video = ""/>
219
220 <#-- link youtube: se è del tipo https://youtu.be/VDcs0xWyhmY o del tipo https://www.youtube.com/watch?v=VDcs0xWyhmY ricavo l ultima parte del link -->
221 <#assign id_video_1 = (youtube_link.getData())?keep_after_last("/") />
222
223 <#-- link youtube: se è del tipo https://www.youtube.com/watch?v=VDcs0xWyhmY devo prendere la parte finale -->
224 <#if id_video_1?has_content>
225 <#assign id_video_2 = (id_video_1)?keep_after("?v=") />
226 </#if>
227
228 <#if id_video_2?has_content == true >
229 <#assign id_video = id_video_2 />
230 <#else>
231 <#assign id_video = id_video_1 />
232 </#if>
233
234 <#if video_position_css == "align-right">
235 <#if id_video?has_content>
236 <div class="container-video ${video_position_css}">
237 <iframe width="560" height="315" src="https://www.youtube.com/embed/${id_video}" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
238 </div>
239 </#if>
240 <#if middle_description??>
241 <#if validator.isNotNull(middle_description) && validator.isNotNull(middle_description.getData())>
242 <div>${middle_description.getData()}</div>
243 </#if>
244 </#if>
245 <#elseif video_position_css == "align-left">
246 <#if id_video?has_content>
247 <div class="container-video ${video_position_css}">
248 <iframe width="560" height="315" src="https://www.youtube.com/embed/${id_video}" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
249 </div>
250 </#if>
251 <#if middle_description??>
252 <#if validator.isNotNull(middle_description) && validator.isNotNull(middle_description.getData())>
253 <div>${middle_description.getData()}</div>
254 </#if>
255 </#if>
256 </#if>
257
258 </#if>
259 </#if>
260 </div>
261 <#-- FINE SEZIONE CENTRALE -->
262
263 </div>
264
265 <#-- INIZIO SEZIONE FINALE -->
266
267 <#-- galleria immagini -->
268 <#if gallery_image??>
269 <#if oneAtLeastOfListNotEmpty(gallery_image)>
270
271 <script type="text/javascript">
272 var imgsMapGallery_${instanceId}_${articleId} = {};
273 var imgsListGallery_${instanceId}_${articleId} = [];
274 var launchedGallery_${instanceId}_${articleId} = false;
275 </script>
276
277 <div class="galleria galleria_mini clearfix" id="galleria-${instanceId}-${articleId}">
278 <div class="slick slider" id="galleria-${instanceId}-${articleId}-slick">
279 <#list gallery_image.getSiblings() as cur_image>
280 <#if validator.isNotNull(cur_image) && validator.isNotNull(cur_image.getData())>
281 <#attempt>
282 <#assign entryIndex = cur_image?index />
283
284 <#-- a partire dal link, lo splitto e ricavo il secondo ed il 5 argomento che mi servono per il metodo successivo -->
285 <#assign parts = (cur_image.getData())?split("/") />
286 <#assign groupId = getterUtil.getLong(parts[2]) />
287 <#assign uuId = parts[5]?split("?")[0] />
288
289 <#assign dlFileEntry = dlFileEntryLocalService.getFileEntryByUuidAndGroupId(uuId,groupId) />
290 <#assign versionId = dlFileEntry.getLatestFileVersion(true).getFileVersionId() />
291
292 <#assign formMap = dlFileEntry.getDDMFormValuesMap(versionId) />
293
294 <#assign alt = "", watermark_title = "", watermark_color = "", watermark_position = "" />
295
296 <#-- ricavo i metadata associati al tipo di documento, se esistono-->
297 <#list formMap?keys as formKey>
298 <#assign formValues = formMap[formKey].getDDMFormFieldValues() />
299 <#if formValues??>
300 <#list formValues as formValue>
301 <#if formValue.getName() == "alt">
302 <#assign alt = escapeExtraChar(formValue.getValue().getString(locale)) />
303 <#elseif formValue.getName() == "watermark_title">
304 <#assign watermark_title = escapeExtraChar(formValue.getValue().getString(locale)) />
305 <#elseif formValue.getName() == "watermark_color">
306 <#assign watermark_color = escapeExtraChar(formValue.getValue().getString(locale)) />
307 <#elseif formValue.getName() == "watermark_position">
308 <#assign watermark_position = escapeExtraChar(formValue.getValue().getString(locale)) />
309 </#if>
310 </#list>
311 </#if>
312 </#list>
313 <#-- se l'alt non è valorizzato nel tipo di documento, prendo il titolo articolo -->
314 <#if alt == "">
315 <#if title??>
316 <#if validator.isNotNull(title) && validator.isNotNull(title.getData())>
317 <#assign alt = title.getData()?js_string />
318 <#else>
319 <#assign alt = titolo?js_string />
320 </#if>
321 <#else>
322 <#assign alt = titolo?js_string />
323 </#if>
324 </#if>
325
326 <article>
327 <a href="#" data-caption="${alt}" title="${alt}" id="watermark-img-${instanceId}-${articleId}-${entryIndex}" class="thumbnail" target="_blank"></a>
328 <script type="text/javascript">
329 var imgsPropertiesGallery_${instanceId}_${articleId} = {
330 id: 'watermark-img-${instanceId}-${articleId}-${entryIndex}',
331 src : '${cur_image.getData()}',
332 position: '${watermark_position}',
333 title: '${watermark_title}',
334 color: '${watermark_color}',
335 alt: '${alt}',
336 };
337 imgsMapGallery_${instanceId}_${articleId}["watermark-img-${instanceId}-${articleId}-${entryIndex}"]=imgsPropertiesGallery_${instanceId}_${articleId};
338 imgsListGallery_${instanceId}_${articleId}.push(imgsPropertiesGallery_${instanceId}_${articleId});
339 </script>
340 </article>
341
342 <#recover>
343
344 </#attempt>
345
346 </#if>
347 </#list>
348 </div>
349 </div>
350
351 <script type="text/javascript">
352 function applySlickOnGallery_${instanceId}_${articleId}() {
353 $("#galleria-${instanceId}-${articleId}-slick").slick({
354 speed: 500,
355 accessibility: true,
356 dots: false,
357 infinite: true,
358 slidesToShow: 4,
359 slidesToScroll: 4,
360 responsive: [
361 {
362 breakpoint: 1024,
363 settings: {
364 slidesToShow: 3,
365 slidesToScroll: 3
366 }
367 },
368 {
369 breakpoint: 768,
370 settings: {
371 slidesToShow: 2,
372 slidesToScroll: 2
373 }
374 },
375 {
376 breakpoint: 500,
377 settings: {
378 slidesToShow: 1,
379 slidesToScroll: 1
380 }
381 }
382 ]
383 });
384 }
385 function applySlickLightbox_${instanceId}_${articleId}(){
386 $("#galleria-${instanceId}-${articleId}-slick").slickLightbox();
387 }
388
389 $(document).ready(function(){
390 if(!launchedGallery_${instanceId}_${articleId}) {
391 launchedGallery_${instanceId}_${articleId} = true;
392 imgsListGallery_${instanceId}_${articleId}.forEach(function(imgProp, index) {
393 var watermarkImagePositionCallback;
394 switch (imgProp.position) {
395 case "top_right":
396 watermarkImagePositionCallback = watermark.text.upperRight(imgProp.title, '20px titillium-semibold', imgProp.color, 1.0)
397 break;
398 case "top_left":
399 watermarkImagePositionCallback = watermark.text.upperLeft(imgProp.title, '20px titillium-semibold', imgProp.color, 1.0)
400 break;
401 case "bottom_left":
402 watermarkImagePositionCallback = watermark.text.lowerLeft(imgProp.title, '20px titillium-semibold', imgProp.color, 1.0)
403 break;
404 default:
405 watermarkImagePositionCallback = watermark.text.lowerRight(imgProp.title, '20px titillium-semibold', imgProp.color, 1.0)
406 break;
407 }
408 watermark([imgProp.src])
409 .image(watermarkImagePositionCallback)
410 .then(function(img) {
411 img.alt = imgProp.alt;
412 img.width="900";
413 img.height="600";
414 img.className="img-fluid";
415 $("#"+imgProp.id).append(img);
416 $("#"+imgProp.id).attr('href', img.src);
417 if(index == ( imgsListGallery_${instanceId}_${articleId}.length -1 )) {
418 applySlickOnGallery_${instanceId}_${articleId}();
419 }
420 index++;
421 });
422 });
423
424 applySlickLightbox_${instanceId}_${articleId}();
425
426 }else {
427 }
428 });
429 </script>
430 </#if>
431 </#if>
432
433 <#-- ricavo il testo finale -->
434 <#if final_description??>
435 <#if validator.isNotNull(final_description) && validator.isNotNull(final_description.getData())>
436 <div class="content-editor clearfix">${final_description.getData()}</div>
437 </#if>
438 </#if>
439
440 <#-- FINE SEZIONE FINALE -->
441
442
443 <#-- INIZIO SEZIONE MORE CONTENTS -->
444
445 <#-- richiamo i vari articoli -->
446 <#if more_web_content??>
447 <#if oneAtLeastOfListNotEmpty(more_web_content)>
448 <#list more_web_content.getSiblings() as cur_more_web_content>
449 <#if validator.isNotNull(cur_more_web_content) && validator.isNotNull(cur_more_web_content.getData()?trim)>
450 <#attempt>
451 <#-- ricavo articolo -->
452 <#assign cur_more_web_content_json_obj = jsonFactoryUtil.createJSONObject(cur_more_web_content.getData()) />
453 <#-- ricavo il classPK -->
454 <#assign cur_more_web_content_classpk = cur_more_web_content_json_obj.classPK?number />
455 <#-- ricavo l'articolo e il suo id -->
456 <#assign cur_more_web_content_article = journalArticleLocalService.getLatestArticle(cur_more_web_content_classpk)/>
457 <#assign cur_more_web_content_article_id = cur_more_web_content_article.getArticleId() />
458
459 <#-- ricavo content mediante funzione -->
460 <div class="clearfix">${getArticleContent(cur_more_web_content_article_id,cur_more_web_content_article.getDDMTemplateKey())}</div>
461 <#recover>
462
463 </#attempt>
464 </#if>
465 </#list>
466 </#if>
467 </#if>
468
469 <#-- FINE SEZIONE MORE CONTENTS -->
470
471</section>
472
473<#-- gestione categorie -->
474<#assign listaIdVocabolariEsclusi = [] />
475<#if listaIdVocabolariEsclusiStr != "">
476 <#assign parts = (listaIdVocabolariEsclusiStr)?split(",") />
477 <#list parts as part>
478 <#if part?has_content>
479 <#assign listaIdVocabolariEsclusi = listaIdVocabolariEsclusi + [part] />
480 </#if>
481 </#list>
482</#if>
483
484<#-- Se il carattere indicato è il prefisso della categoria, indica che la stessa non deve essere mostrata a video, ma viene solo usata per scopi funzionali -->
485<#assign PREFIX_SERVICE_CATEGORY = "_" />
486
487<#-- Ricavo tutte le categorie associate all' articolo a meno di quelle che hanno un prefisso "_" o il cui vocabolario appartiene alla lista di vocabolari esclusi -->
488<#assign categoryList = [] />
489<#assign articleCatNames = catLocalService.getCategories("com.liferay.journal.model.JournalArticle", getterUtil.getLong(articlePrimKey)) />
490<#if (articleCatNames?size > 0)>
491 <#list articleCatNames as category>
492 <#if !(listaIdVocabolariEsclusi?seq_contains(category.getVocabularyId()?trim)) && (category.name?substring(0,1) != PREFIX_SERVICE_CATEGORY) >
493 <#assign categoryList = categoryList + [category] />
494 </#if>
495 </#list>
496</#if>
497<#if (categoryList?size > 0)>
498 <div class="tags">
499 <p>
500 Argomenti:
501 </p>
502 <ul>
503 <#assign numCat = 0 />
504 <#list categoryList as singleCat>
505 <#assign numCat = numCat + 1 />
506 <#if pagina != "">
507 <li>
508 <a href="${pagina.getRegularURL(request)}?restrictCategoryId=${singleCat.categoryId}&fromPage=elencoArgomenti" title="vai all'argomento ${singleCat.name}">${singleCat.name}</a>
509 </li>
510 </#if>
511 </#list>
512 </ul>
513 </div>
514</#if>
515
516<#-- inizio sezione infopage -->
517<#assign paginacorrente = themeDisplay.getPortalURL()+themeDisplay.getURLCurrent() />
518
519<#assign twitterUrl = "http://twitter.com/share?text=${titoloNews} &url=${paginacorrente}" />
520<#assign facebookUrl = "http://www.facebook.com/sharer/sharer.php?u=${paginacorrente}" />
521<#--
522<#assign plusUrl = "https://web.comune.milano.it/wps/portal/ist/it/extra/social" />
523-->
524<#assign articleModifiedDateString = "" />
525<#if validator.isNotNull(articleModifiedDate)>
526 <#if "it_IT" == locale>
527 <#assign articleModifiedDateString = dateUtil.getDate(articleModifiedDate, "dd/MM/yyyy", locale) />
528 <#else>
529 <#assign articleModifiedDateString = dateUtil.getDate(articleModifiedDate, "yyyy/MM/dd", locale) />
530 </#if>
531</#if>
532
533<section class="infopage">
534 <p class="updatedpage">Aggiornato il: ${articleModifiedDateString}</p>
535 <div>
536 <p class="printpage">
537 <a href="#" onclick="window.print();" title="stampa il contenuto di questa pagina">Stampa<span class="sr-only"> questa pagina</span></a>
538 </p>
539 <p class="sharepage">
540 <span>Condividi</span>
541 <a href="${twitterUrl}" target="_blank" class="twitter" title="condividi questo contenuto su Twitter">
542 Twitter
543 </a>
544 <a href="${facebookUrl}" target="_blank" class="fb" title="condividi questo contenuto su Facebook">
545 Facebook
546 </a>
547 <#--
548 <a href="${plusUrl}" target="_blank" class="altro" title="consulta la lista di tutti i social degli enti del Comune di Milano">
549 scegli un altro social
550 </a>
551 -->
552 </p>
553 </div>
554</section>