Il 402° Festino di Santa Rosalia, patrona di Palermo, animerà il cuore della città la sera del 14 luglio 2026 e sarà accompagnato da un ricco calendario di eventi che anticipano l’anno europeo dei Normanni 2027 di cui sarà protagonista la città.
Medaglia di bronzo al Bea World Festival 2024 e medaglia d’oro al BEA Italia 2025, come miglior evento italiano culturale, il Festino di Santa Rosalia si inserisce ufficialmente tra i più attesi eventi al mondo e attrae ogni anno milioni di visitatori attraverso il suo tradizionale percorso.
Dal 1624, infatti, un corteo umano trasporta, a bordo di un Carro tematico, la Santuzza che liberò Palermo dalla peste da Palazzo dei Normanni fino a Porta Felice: quattro tappe narrative di canti, balli e musica.
“Viva Palermo e Santa Rosalia” è la voce di Palermo che si alza ai Quattro Canti attraverso un coro di liberazione e di festa.
LA STORIA DI SANTA ROSALIA E DEL FESTINO
The following has evaluated to null or missing:
==> structureService.getStructureAttrattoreKey() [in template "20099#20135#153060" at line 11, column 39]
----
Tip: If the failing expression is known to be 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: #assign attrattoreStructureKey = stru... [in template "20099#20135#153060" at line 11, column 5]
---- 1<#-- CAROSELLO MULTITIPO 05/07/2023--> 2 3<#assign showTemplate = false /> 4<#assign emptyEntries = false /> 5 6<#assign structureService = serviceLocator.findService("it.inera.palermo.structure.service.StructureService")> 7<#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)> 8 9<#if entries?has_content> 10 <#assign showTemplate = true /> 11 <#assign attrattoreStructureKey = structureService.getStructureAttrattoreKey()> 12 <#assign eventoStructureKey = structureService.getStructureEventoKey()> 13 <#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()> 14 <#assign ricettaStructureKey = structureService.getStructureRicettaKey()> 15 <#assign luogoStructureKey = structureService.getStructureLuogoKey()> 16 <#assign categoriaStructureKey = "34431"> 17 18 <#assign layout = themeDisplay.getLayout()/> 19 <#assign currentSite = themeDisplay.getSiteGroup()/> 20 <#assign currentSiteUrl = currentSite.getPathFriendlyURL(false, themeDisplay)/> 21 <#assign currentSiteFriendlyUrl = currentSite.getFriendlyURL()/> 22 23 <#assign count = 1/> 24 <#list entries as curEntry> 25 <#assign assetRenderer = curEntry.getAssetRenderer()/> 26 <#if validator.isNotNull(assetRenderer)> 27 <#assign className = assetRenderer.getClassName() /> 28 <#if className == "com.liferay.journal.model.JournalArticle"> 29 <#assign ja = assetRenderer.getArticle() /> 30 <#assign structureId = ja.getStructureId() /> 31 32 <#if showTemplate && structureId != attrattoreStructureKey && structureId != eventoStructureKey 33 && structureId != itinerarioStructureKey && structureId != ricettaStructureKey 34 && structureId != luogoStructureKey && structureId != categoriaStructureKey> 35 <#assign showTemplate = false /> 36 </#if> 37 <#else> 38 <#assign showTemplate = false /> 39 </#if> 40 <#else> 41 <#assign showTemplate = false /> 42 </#if> 43 </#list> 44<#else> 45 <#assign emptyEntries = true /> 46</#if> 47 48<#if !emptyEntries> 49 <#if showTemplate> 50 <div class="container mb-5"> 51 <div class="row"> 52 <div class="col-12"> 53 <div class="tab-content category-offers" id="offer-tab-content"> 54 <div class="tab-pane fade show active" id="visite-guidate" role="tabpanel" aria-labelledby="visite-guidate-label"> 55 <div class="row"> 56 <div class="col-12"> 57 <div class="card-carousel owl-carousel std-card-carousel" data-carousel="{"nav":true,"navText":["<i class='icon-angle-left'></i>","<i class='icon-angle-right'></i>"],"autoplay":false,"autoplayHoverPause":true,"responsiveClass":true,"responsive":{"0":{"items":1,"slideBy":1},"480":{"items":2,"slideBy":2},"768":{"items":3,"slideBy":3}}}"> 58 59 <#list entries as curEntry> 60 <#assign assetRenderer = curEntry.getAssetRenderer()/> 61 <#assign ja = assetRenderer.getArticle() /> 62 <#assign structureId = ja.getStructureId() /> 63 <#assign langId = themeDisplay.getLanguageId() /> 64 <#assign contentByLocale = ja.getContentByLocale(themeDisplay.getLanguageId()) /> 65 66 <#assign colorebordo = "border-bottom-yellow"> 67 <#assign subpage = "luogo"> 68 <#assign destinationPage = "" /> 69 <#assign url = ""> 70 <#assign textAltImg = "" /> 71 <#assign titolo = ""> 72 <#assign sottotitolo_abstract = ""> 73 74 <#if structureId == categoriaStructureKey> 75 76 <#assign document = saxReaderUtil.read(contentByLocale) > 77 <#assign rootElement = document.getRootElement()> 78 79 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 80 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 81 82 <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 83 <#assign sottotitolo_abstract = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()> 84 85 <#assign colorebordo = "border-bottom-yellow"> 86 <#assign xPathColorBorder = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")> 87 <#if xPathColorBorder?? && xPathColorBorder?has_content 88 && saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")?has_content 89 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?? 90 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?has_content> 91 <#assign colorebordo = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue()> 92 </#if> 93 94 <#assign xPathImmagine = saxReaderUtil.createXPath("dynamic-element[@name='immagine']")> 95 <#if xPathImmagine?? && xPathImmagine?has_content > 96 <#assign imgNews = xPathImmagine.selectSingleNode(rootElement).getStringValue()> 97 <#if imgNews?? && imgNews?has_content && (imgNews?length > 1)> 98 99 <#attempt> 100 <#assign imgJson = jsonFactoryUtil.createJSONObject(imgNews)> 101 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 102 <#recover> 103 </#attempt> 104 </#if> 105 </#if> 106 107 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine']")> 108 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 109 110 <#assign xPathLinkAPagina = saxReaderUtil.createXPath("dynamic-element[@name='link_a_pagina']")> 111 <#assign linkToPage = "" > 112 113 <#if xPathLinkAPagina?? > 114 <#if xPathLinkAPagina?has_content > 115 <#assign linkAPagina = xPathLinkAPagina.selectSingleNode(rootElement).getStringValue() > 116 <#assign linkAPaginaSplitted = linkAPagina?split("@") > 117 <#assign layoutIdPage = linkAPaginaSplitted?first > 118 <#assign layoutIdPage = getterUtil.getLong(layoutIdPage) > 119 <#assign groupIdPage = linkAPaginaSplitted?last > 120 <#assign groupIdPage = getterUtil.getLong(groupIdPage) > 121 122 <#if layoutIdPage != 0 > 123 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")> 124 <#assign contentPage = ""> 125 <#attempt> 126 <#assign contentPage = layoutLocalService.getLayout(groupIdPage, false, layoutIdPage ) > 127 <#if contentPage?? > 128 <#assign linkToPage = contentPage.getFriendlyURL(locale) > 129 <#assign linkToPage = currentSiteUrl + currentSiteFriendlyUrl + linkToPage?trim> 130 </#if> 131 <#recover> 132 </#attempt> 133 </#if> 134 135 </#if> 136 </#if> 137 138 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 139 <#assign xPathLinkEsterno = saxReaderUtil.createXPath("dynamic-element[@name='link_esterno']")> 140 <#assign linkToPage = xPathLinkEsterno.selectSingleNode(rootElement).getStringValue() > 141 <#assign linkToPage = linkToPage?trim> 142 </#if> 143 144 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 145 <#assign xPathLinkInterno = saxReaderUtil.createXPath("dynamic-element[@name='link_interno']")> 146 <#assign linkToPage = xPathLinkInterno.selectSingleNode(rootElement).getStringValue() > 147 <#assign linkToPage = linkToPage?trim> 148 </#if> 149 <#assign destinationPage = linkToPage> 150 <#else> 151 <#if structureId == attrattoreStructureKey> 152 <#assign subpage = "attrazione"> 153 <#elseif structureId == eventoStructureKey> 154 <#assign subpage = "evento"> 155 <#elseif structureId == itinerarioStructureKey> 156 <#assign subpage = "itinerario"> 157 <#elseif structureId == ricettaStructureKey> 158 <#assign subpage = "ricetta"> 159 <#elseif structureId == luogoStructureKey> 160 <#assign subpage = "luogo"> 161 <#else> 162 </#if> 163 <#--CONTENT BY DEFAULT LOCALE--> 164 <#attempt> 165 <#assign contentByDefaultLocale = ja.getContentByLocale(localeUtil.getDefault()) /> 166 <#assign documentByDefaultLocale = saxReaderUtil.read(contentByDefaultLocale) > 167 <#assign rootElementByDefaultLocale = documentByDefaultLocale.getRootElement()> 168 <#assign xPathImmagineListaByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 169 <#if xPathImmagineListaByDefaultLocale?? && xPathImmagineListaByDefaultLocale?has_content> 170 <#if xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?? && xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?has_content> 171 <#assign immagineListaByDefaultLocale = xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 172 </#if> 173 </#if> 174 <#assign xPathImmagineBannerByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 175 <#if xPathImmagineBannerByDefaultLocale?? && xPathImmagineBannerByDefaultLocale?has_content> 176 <#assign immagineBannerByDefaultLocale = xPathImmagineBannerByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 177 <#if immagineListaByDefaultLocale?trim?has_content> 178 <#assign immagineByDefaultLocale = immagineListaByDefaultLocale> 179 <#else> 180 <#assign immagineByDefaultLocale = immagineBannerByDefaultLocale> 181 </#if> 182 </#if> 183 <#if validator.isNotNull(immagineByDefaultLocale)> 184 <#attempt> 185 <#assign imgJsonByDefaultLocale = jsonFactoryUtil.createJSONObject(immagineByDefaultLocale)> 186 <#assign url = "/documents/"+ imgJsonByDefaultLocale.groupId +"/" +imgJsonByDefaultLocale.classPK +"/"+ imgJsonByDefaultLocale.title +"/"+imgJsonByDefaultLocale.uuid + "?width=600" > 187 <#recover> 188 <#assign url = ""> 189 </#attempt> 190 </#if> 191 <#recover> 192 </#attempt> 193 <#--CONTENT BY DEFAULT LOCALE--> 194 195 <#assign urlTitle = ja.getUrlTitle() /> 196 <#assign document = saxReaderUtil.read(contentByLocale) > 197 <#assign rootElement = document.getRootElement()> 198 <#assign xPathTitolo = "" /> 199 <#assign xPathSottotitolo_abstract = "" /> 200 <#assign xPathImmagineBanner = "" /> 201 <#assign xPathTextAltImg = "" /> 202 <#assign immagineLista = ""> 203 <#assign textAltImgLista = ""> 204 <#assign immagine = ""> 205 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 206 <#assign xPathSottotitolo_abstract = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 207 208 <#assign xPathImmagineLista = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 209 <#if xPathImmagineLista?? && xPathImmagineLista?has_content> 210 <#if xPathImmagineLista.selectSingleNode(rootElement)?? && xPathImmagineLista.selectSingleNode(rootElement)?has_content> 211 <#assign immagineLista = xPathImmagineLista.selectSingleNode(rootElement).getStringValue()> 212 </#if> 213 </#if> 214 <#assign xPathTextAltImgLista = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_lista']")> 215 <#if xPathTextAltImgLista?? && xPathTextAltImgLista?has_content> 216 <#if xPathTextAltImgLista.selectSingleNode(rootElement)?? && xPathTextAltImgLista.selectSingleNode(rootElement)?has_content> 217 <#assign textAltImgLista = xPathTextAltImgLista.selectSingleNode(rootElement).getStringValue()> 218 </#if> 219 </#if> 220 221 <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 222 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_banner']")> 223 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 224 <#assign destinationPage = "${detailBaseUrl}/search/-/search/${subpage}/${urlTitle}" /> 225 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 226 <#assign sottotitolo_abstract = xPathSottotitolo_abstract.selectSingleNode(rootElement).getStringValue()> 227 228 <#assign immagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()> 229 <#if !textAltImg?has_content> 230 <#assign textAltImg = titolo> 231 </#if> 232 233 <#if immagineLista?trim?has_content> 234 <#assign immagine = immagineLista> 235 <#assign textAltImg = textAltImgLista> 236 <#else> 237 <#assign immagine = immagineBanner> 238 </#if> 239 240 <#if validator.isNotNull(immagine)> 241 <#attempt> 242 <#assign imgJson = jsonFactoryUtil.createJSONObject(immagine)> 243 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 244 <#recover> 245 </#attempt> 246 </#if> 247 </#if> 248 <div class="card-container col-12 palermo-carousel-item ${colorebordo}"> 249 <div class="row"> 250 <div class="card"> 251 <a href="${destinationPage}"> 252 <img class="card-img-top" src="${url}" alt="${textAltImg}"> 253 <div class="card-body"> 254 <h3 class="card-title">${titolo} 255 </h3> 256 <p class="card-text"> 257 ${sottotitolo_abstract} 258 </p> 259 </div> 260 </a> 261 </div> 262 </div> 263 </div> 264 </#list> 265 </div> 266 </div> 267 </div> 268 </div> 269 </div> 270 </div> 271 </div> 272 </div> 273 <#else> 274 <div style="border: 1px solid red; padding:20px;"> 275 <h3 style="color: red;">Questo template supporta solo contenuti di tipo Web Content con struttura attrattori, eventi, itinerari, ricette, luoghi e proposte di viaggio.</h3> 276 <h3 style="color: red;">Configurare opportunamente l'aggregatore risorse</h3> 277 </div> 278 </#if> 279 280</#if> The following has evaluated to null or missing:
==> structureService.getStructureAttrattoreKey() [in template "20099#20135#153060" at line 11, column 39]
----
Tip: If the failing expression is known to be 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: #assign attrattoreStructureKey = stru... [in template "20099#20135#153060" at line 11, column 5]
---- 1<#-- CAROSELLO MULTITIPO 05/07/2023--> 2 3<#assign showTemplate = false /> 4<#assign emptyEntries = false /> 5 6<#assign structureService = serviceLocator.findService("it.inera.palermo.structure.service.StructureService")> 7<#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)> 8 9<#if entries?has_content> 10 <#assign showTemplate = true /> 11 <#assign attrattoreStructureKey = structureService.getStructureAttrattoreKey()> 12 <#assign eventoStructureKey = structureService.getStructureEventoKey()> 13 <#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()> 14 <#assign ricettaStructureKey = structureService.getStructureRicettaKey()> 15 <#assign luogoStructureKey = structureService.getStructureLuogoKey()> 16 <#assign categoriaStructureKey = "34431"> 17 18 <#assign layout = themeDisplay.getLayout()/> 19 <#assign currentSite = themeDisplay.getSiteGroup()/> 20 <#assign currentSiteUrl = currentSite.getPathFriendlyURL(false, themeDisplay)/> 21 <#assign currentSiteFriendlyUrl = currentSite.getFriendlyURL()/> 22 23 <#assign count = 1/> 24 <#list entries as curEntry> 25 <#assign assetRenderer = curEntry.getAssetRenderer()/> 26 <#if validator.isNotNull(assetRenderer)> 27 <#assign className = assetRenderer.getClassName() /> 28 <#if className == "com.liferay.journal.model.JournalArticle"> 29 <#assign ja = assetRenderer.getArticle() /> 30 <#assign structureId = ja.getStructureId() /> 31 32 <#if showTemplate && structureId != attrattoreStructureKey && structureId != eventoStructureKey 33 && structureId != itinerarioStructureKey && structureId != ricettaStructureKey 34 && structureId != luogoStructureKey && structureId != categoriaStructureKey> 35 <#assign showTemplate = false /> 36 </#if> 37 <#else> 38 <#assign showTemplate = false /> 39 </#if> 40 <#else> 41 <#assign showTemplate = false /> 42 </#if> 43 </#list> 44<#else> 45 <#assign emptyEntries = true /> 46</#if> 47 48<#if !emptyEntries> 49 <#if showTemplate> 50 <div class="container mb-5"> 51 <div class="row"> 52 <div class="col-12"> 53 <div class="tab-content category-offers" id="offer-tab-content"> 54 <div class="tab-pane fade show active" id="visite-guidate" role="tabpanel" aria-labelledby="visite-guidate-label"> 55 <div class="row"> 56 <div class="col-12"> 57 <div class="card-carousel owl-carousel std-card-carousel" data-carousel="{"nav":true,"navText":["<i class='icon-angle-left'></i>","<i class='icon-angle-right'></i>"],"autoplay":false,"autoplayHoverPause":true,"responsiveClass":true,"responsive":{"0":{"items":1,"slideBy":1},"480":{"items":2,"slideBy":2},"768":{"items":3,"slideBy":3}}}"> 58 59 <#list entries as curEntry> 60 <#assign assetRenderer = curEntry.getAssetRenderer()/> 61 <#assign ja = assetRenderer.getArticle() /> 62 <#assign structureId = ja.getStructureId() /> 63 <#assign langId = themeDisplay.getLanguageId() /> 64 <#assign contentByLocale = ja.getContentByLocale(themeDisplay.getLanguageId()) /> 65 66 <#assign colorebordo = "border-bottom-yellow"> 67 <#assign subpage = "luogo"> 68 <#assign destinationPage = "" /> 69 <#assign url = ""> 70 <#assign textAltImg = "" /> 71 <#assign titolo = ""> 72 <#assign sottotitolo_abstract = ""> 73 74 <#if structureId == categoriaStructureKey> 75 76 <#assign document = saxReaderUtil.read(contentByLocale) > 77 <#assign rootElement = document.getRootElement()> 78 79 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 80 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 81 82 <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 83 <#assign sottotitolo_abstract = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()> 84 85 <#assign colorebordo = "border-bottom-yellow"> 86 <#assign xPathColorBorder = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")> 87 <#if xPathColorBorder?? && xPathColorBorder?has_content 88 && saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")?has_content 89 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?? 90 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?has_content> 91 <#assign colorebordo = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue()> 92 </#if> 93 94 <#assign xPathImmagine = saxReaderUtil.createXPath("dynamic-element[@name='immagine']")> 95 <#if xPathImmagine?? && xPathImmagine?has_content > 96 <#assign imgNews = xPathImmagine.selectSingleNode(rootElement).getStringValue()> 97 <#if imgNews?? && imgNews?has_content && (imgNews?length > 1)> 98 99 <#attempt> 100 <#assign imgJson = jsonFactoryUtil.createJSONObject(imgNews)> 101 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 102 <#recover> 103 </#attempt> 104 </#if> 105 </#if> 106 107 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine']")> 108 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 109 110 <#assign xPathLinkAPagina = saxReaderUtil.createXPath("dynamic-element[@name='link_a_pagina']")> 111 <#assign linkToPage = "" > 112 113 <#if xPathLinkAPagina?? > 114 <#if xPathLinkAPagina?has_content > 115 <#assign linkAPagina = xPathLinkAPagina.selectSingleNode(rootElement).getStringValue() > 116 <#assign linkAPaginaSplitted = linkAPagina?split("@") > 117 <#assign layoutIdPage = linkAPaginaSplitted?first > 118 <#assign layoutIdPage = getterUtil.getLong(layoutIdPage) > 119 <#assign groupIdPage = linkAPaginaSplitted?last > 120 <#assign groupIdPage = getterUtil.getLong(groupIdPage) > 121 122 <#if layoutIdPage != 0 > 123 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")> 124 <#assign contentPage = ""> 125 <#attempt> 126 <#assign contentPage = layoutLocalService.getLayout(groupIdPage, false, layoutIdPage ) > 127 <#if contentPage?? > 128 <#assign linkToPage = contentPage.getFriendlyURL(locale) > 129 <#assign linkToPage = currentSiteUrl + currentSiteFriendlyUrl + linkToPage?trim> 130 </#if> 131 <#recover> 132 </#attempt> 133 </#if> 134 135 </#if> 136 </#if> 137 138 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 139 <#assign xPathLinkEsterno = saxReaderUtil.createXPath("dynamic-element[@name='link_esterno']")> 140 <#assign linkToPage = xPathLinkEsterno.selectSingleNode(rootElement).getStringValue() > 141 <#assign linkToPage = linkToPage?trim> 142 </#if> 143 144 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 145 <#assign xPathLinkInterno = saxReaderUtil.createXPath("dynamic-element[@name='link_interno']")> 146 <#assign linkToPage = xPathLinkInterno.selectSingleNode(rootElement).getStringValue() > 147 <#assign linkToPage = linkToPage?trim> 148 </#if> 149 <#assign destinationPage = linkToPage> 150 <#else> 151 <#if structureId == attrattoreStructureKey> 152 <#assign subpage = "attrazione"> 153 <#elseif structureId == eventoStructureKey> 154 <#assign subpage = "evento"> 155 <#elseif structureId == itinerarioStructureKey> 156 <#assign subpage = "itinerario"> 157 <#elseif structureId == ricettaStructureKey> 158 <#assign subpage = "ricetta"> 159 <#elseif structureId == luogoStructureKey> 160 <#assign subpage = "luogo"> 161 <#else> 162 </#if> 163 <#--CONTENT BY DEFAULT LOCALE--> 164 <#attempt> 165 <#assign contentByDefaultLocale = ja.getContentByLocale(localeUtil.getDefault()) /> 166 <#assign documentByDefaultLocale = saxReaderUtil.read(contentByDefaultLocale) > 167 <#assign rootElementByDefaultLocale = documentByDefaultLocale.getRootElement()> 168 <#assign xPathImmagineListaByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 169 <#if xPathImmagineListaByDefaultLocale?? && xPathImmagineListaByDefaultLocale?has_content> 170 <#if xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?? && xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?has_content> 171 <#assign immagineListaByDefaultLocale = xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 172 </#if> 173 </#if> 174 <#assign xPathImmagineBannerByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 175 <#if xPathImmagineBannerByDefaultLocale?? && xPathImmagineBannerByDefaultLocale?has_content> 176 <#assign immagineBannerByDefaultLocale = xPathImmagineBannerByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 177 <#if immagineListaByDefaultLocale?trim?has_content> 178 <#assign immagineByDefaultLocale = immagineListaByDefaultLocale> 179 <#else> 180 <#assign immagineByDefaultLocale = immagineBannerByDefaultLocale> 181 </#if> 182 </#if> 183 <#if validator.isNotNull(immagineByDefaultLocale)> 184 <#attempt> 185 <#assign imgJsonByDefaultLocale = jsonFactoryUtil.createJSONObject(immagineByDefaultLocale)> 186 <#assign url = "/documents/"+ imgJsonByDefaultLocale.groupId +"/" +imgJsonByDefaultLocale.classPK +"/"+ imgJsonByDefaultLocale.title +"/"+imgJsonByDefaultLocale.uuid + "?width=600" > 187 <#recover> 188 <#assign url = ""> 189 </#attempt> 190 </#if> 191 <#recover> 192 </#attempt> 193 <#--CONTENT BY DEFAULT LOCALE--> 194 195 <#assign urlTitle = ja.getUrlTitle() /> 196 <#assign document = saxReaderUtil.read(contentByLocale) > 197 <#assign rootElement = document.getRootElement()> 198 <#assign xPathTitolo = "" /> 199 <#assign xPathSottotitolo_abstract = "" /> 200 <#assign xPathImmagineBanner = "" /> 201 <#assign xPathTextAltImg = "" /> 202 <#assign immagineLista = ""> 203 <#assign textAltImgLista = ""> 204 <#assign immagine = ""> 205 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 206 <#assign xPathSottotitolo_abstract = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 207 208 <#assign xPathImmagineLista = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 209 <#if xPathImmagineLista?? && xPathImmagineLista?has_content> 210 <#if xPathImmagineLista.selectSingleNode(rootElement)?? && xPathImmagineLista.selectSingleNode(rootElement)?has_content> 211 <#assign immagineLista = xPathImmagineLista.selectSingleNode(rootElement).getStringValue()> 212 </#if> 213 </#if> 214 <#assign xPathTextAltImgLista = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_lista']")> 215 <#if xPathTextAltImgLista?? && xPathTextAltImgLista?has_content> 216 <#if xPathTextAltImgLista.selectSingleNode(rootElement)?? && xPathTextAltImgLista.selectSingleNode(rootElement)?has_content> 217 <#assign textAltImgLista = xPathTextAltImgLista.selectSingleNode(rootElement).getStringValue()> 218 </#if> 219 </#if> 220 221 <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 222 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_banner']")> 223 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 224 <#assign destinationPage = "${detailBaseUrl}/search/-/search/${subpage}/${urlTitle}" /> 225 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 226 <#assign sottotitolo_abstract = xPathSottotitolo_abstract.selectSingleNode(rootElement).getStringValue()> 227 228 <#assign immagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()> 229 <#if !textAltImg?has_content> 230 <#assign textAltImg = titolo> 231 </#if> 232 233 <#if immagineLista?trim?has_content> 234 <#assign immagine = immagineLista> 235 <#assign textAltImg = textAltImgLista> 236 <#else> 237 <#assign immagine = immagineBanner> 238 </#if> 239 240 <#if validator.isNotNull(immagine)> 241 <#attempt> 242 <#assign imgJson = jsonFactoryUtil.createJSONObject(immagine)> 243 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 244 <#recover> 245 </#attempt> 246 </#if> 247 </#if> 248 <div class="card-container col-12 palermo-carousel-item ${colorebordo}"> 249 <div class="row"> 250 <div class="card"> 251 <a href="${destinationPage}"> 252 <img class="card-img-top" src="${url}" alt="${textAltImg}"> 253 <div class="card-body"> 254 <h3 class="card-title">${titolo} 255 </h3> 256 <p class="card-text"> 257 ${sottotitolo_abstract} 258 </p> 259 </div> 260 </a> 261 </div> 262 </div> 263 </div> 264 </#list> 265 </div> 266 </div> 267 </div> 268 </div> 269 </div> 270 </div> 271 </div> 272 </div> 273 <#else> 274 <div style="border: 1px solid red; padding:20px;"> 275 <h3 style="color: red;">Questo template supporta solo contenuti di tipo Web Content con struttura attrattori, eventi, itinerari, ricette, luoghi e proposte di viaggio.</h3> 276 <h3 style="color: red;">Configurare opportunamente l'aggregatore risorse</h3> 277 </div> 278 </#if> 279 280</#if> The following has evaluated to null or missing:
==> structureService.getStructureAttrattoreKey() [in template "20099#20135#153060" at line 11, column 39]
----
Tip: If the failing expression is known to be 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: #assign attrattoreStructureKey = stru... [in template "20099#20135#153060" at line 11, column 5]
---- 1<#-- CAROSELLO MULTITIPO 05/07/2023--> 2 3<#assign showTemplate = false /> 4<#assign emptyEntries = false /> 5 6<#assign structureService = serviceLocator.findService("it.inera.palermo.structure.service.StructureService")> 7<#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)> 8 9<#if entries?has_content> 10 <#assign showTemplate = true /> 11 <#assign attrattoreStructureKey = structureService.getStructureAttrattoreKey()> 12 <#assign eventoStructureKey = structureService.getStructureEventoKey()> 13 <#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()> 14 <#assign ricettaStructureKey = structureService.getStructureRicettaKey()> 15 <#assign luogoStructureKey = structureService.getStructureLuogoKey()> 16 <#assign categoriaStructureKey = "34431"> 17 18 <#assign layout = themeDisplay.getLayout()/> 19 <#assign currentSite = themeDisplay.getSiteGroup()/> 20 <#assign currentSiteUrl = currentSite.getPathFriendlyURL(false, themeDisplay)/> 21 <#assign currentSiteFriendlyUrl = currentSite.getFriendlyURL()/> 22 23 <#assign count = 1/> 24 <#list entries as curEntry> 25 <#assign assetRenderer = curEntry.getAssetRenderer()/> 26 <#if validator.isNotNull(assetRenderer)> 27 <#assign className = assetRenderer.getClassName() /> 28 <#if className == "com.liferay.journal.model.JournalArticle"> 29 <#assign ja = assetRenderer.getArticle() /> 30 <#assign structureId = ja.getStructureId() /> 31 32 <#if showTemplate && structureId != attrattoreStructureKey && structureId != eventoStructureKey 33 && structureId != itinerarioStructureKey && structureId != ricettaStructureKey 34 && structureId != luogoStructureKey && structureId != categoriaStructureKey> 35 <#assign showTemplate = false /> 36 </#if> 37 <#else> 38 <#assign showTemplate = false /> 39 </#if> 40 <#else> 41 <#assign showTemplate = false /> 42 </#if> 43 </#list> 44<#else> 45 <#assign emptyEntries = true /> 46</#if> 47 48<#if !emptyEntries> 49 <#if showTemplate> 50 <div class="container mb-5"> 51 <div class="row"> 52 <div class="col-12"> 53 <div class="tab-content category-offers" id="offer-tab-content"> 54 <div class="tab-pane fade show active" id="visite-guidate" role="tabpanel" aria-labelledby="visite-guidate-label"> 55 <div class="row"> 56 <div class="col-12"> 57 <div class="card-carousel owl-carousel std-card-carousel" data-carousel="{"nav":true,"navText":["<i class='icon-angle-left'></i>","<i class='icon-angle-right'></i>"],"autoplay":false,"autoplayHoverPause":true,"responsiveClass":true,"responsive":{"0":{"items":1,"slideBy":1},"480":{"items":2,"slideBy":2},"768":{"items":3,"slideBy":3}}}"> 58 59 <#list entries as curEntry> 60 <#assign assetRenderer = curEntry.getAssetRenderer()/> 61 <#assign ja = assetRenderer.getArticle() /> 62 <#assign structureId = ja.getStructureId() /> 63 <#assign langId = themeDisplay.getLanguageId() /> 64 <#assign contentByLocale = ja.getContentByLocale(themeDisplay.getLanguageId()) /> 65 66 <#assign colorebordo = "border-bottom-yellow"> 67 <#assign subpage = "luogo"> 68 <#assign destinationPage = "" /> 69 <#assign url = ""> 70 <#assign textAltImg = "" /> 71 <#assign titolo = ""> 72 <#assign sottotitolo_abstract = ""> 73 74 <#if structureId == categoriaStructureKey> 75 76 <#assign document = saxReaderUtil.read(contentByLocale) > 77 <#assign rootElement = document.getRootElement()> 78 79 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 80 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 81 82 <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 83 <#assign sottotitolo_abstract = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()> 84 85 <#assign colorebordo = "border-bottom-yellow"> 86 <#assign xPathColorBorder = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")> 87 <#if xPathColorBorder?? && xPathColorBorder?has_content 88 && saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")?has_content 89 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?? 90 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?has_content> 91 <#assign colorebordo = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue()> 92 </#if> 93 94 <#assign xPathImmagine = saxReaderUtil.createXPath("dynamic-element[@name='immagine']")> 95 <#if xPathImmagine?? && xPathImmagine?has_content > 96 <#assign imgNews = xPathImmagine.selectSingleNode(rootElement).getStringValue()> 97 <#if imgNews?? && imgNews?has_content && (imgNews?length > 1)> 98 99 <#attempt> 100 <#assign imgJson = jsonFactoryUtil.createJSONObject(imgNews)> 101 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 102 <#recover> 103 </#attempt> 104 </#if> 105 </#if> 106 107 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine']")> 108 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 109 110 <#assign xPathLinkAPagina = saxReaderUtil.createXPath("dynamic-element[@name='link_a_pagina']")> 111 <#assign linkToPage = "" > 112 113 <#if xPathLinkAPagina?? > 114 <#if xPathLinkAPagina?has_content > 115 <#assign linkAPagina = xPathLinkAPagina.selectSingleNode(rootElement).getStringValue() > 116 <#assign linkAPaginaSplitted = linkAPagina?split("@") > 117 <#assign layoutIdPage = linkAPaginaSplitted?first > 118 <#assign layoutIdPage = getterUtil.getLong(layoutIdPage) > 119 <#assign groupIdPage = linkAPaginaSplitted?last > 120 <#assign groupIdPage = getterUtil.getLong(groupIdPage) > 121 122 <#if layoutIdPage != 0 > 123 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")> 124 <#assign contentPage = ""> 125 <#attempt> 126 <#assign contentPage = layoutLocalService.getLayout(groupIdPage, false, layoutIdPage ) > 127 <#if contentPage?? > 128 <#assign linkToPage = contentPage.getFriendlyURL(locale) > 129 <#assign linkToPage = currentSiteUrl + currentSiteFriendlyUrl + linkToPage?trim> 130 </#if> 131 <#recover> 132 </#attempt> 133 </#if> 134 135 </#if> 136 </#if> 137 138 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 139 <#assign xPathLinkEsterno = saxReaderUtil.createXPath("dynamic-element[@name='link_esterno']")> 140 <#assign linkToPage = xPathLinkEsterno.selectSingleNode(rootElement).getStringValue() > 141 <#assign linkToPage = linkToPage?trim> 142 </#if> 143 144 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 145 <#assign xPathLinkInterno = saxReaderUtil.createXPath("dynamic-element[@name='link_interno']")> 146 <#assign linkToPage = xPathLinkInterno.selectSingleNode(rootElement).getStringValue() > 147 <#assign linkToPage = linkToPage?trim> 148 </#if> 149 <#assign destinationPage = linkToPage> 150 <#else> 151 <#if structureId == attrattoreStructureKey> 152 <#assign subpage = "attrazione"> 153 <#elseif structureId == eventoStructureKey> 154 <#assign subpage = "evento"> 155 <#elseif structureId == itinerarioStructureKey> 156 <#assign subpage = "itinerario"> 157 <#elseif structureId == ricettaStructureKey> 158 <#assign subpage = "ricetta"> 159 <#elseif structureId == luogoStructureKey> 160 <#assign subpage = "luogo"> 161 <#else> 162 </#if> 163 <#--CONTENT BY DEFAULT LOCALE--> 164 <#attempt> 165 <#assign contentByDefaultLocale = ja.getContentByLocale(localeUtil.getDefault()) /> 166 <#assign documentByDefaultLocale = saxReaderUtil.read(contentByDefaultLocale) > 167 <#assign rootElementByDefaultLocale = documentByDefaultLocale.getRootElement()> 168 <#assign xPathImmagineListaByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 169 <#if xPathImmagineListaByDefaultLocale?? && xPathImmagineListaByDefaultLocale?has_content> 170 <#if xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?? && xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?has_content> 171 <#assign immagineListaByDefaultLocale = xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 172 </#if> 173 </#if> 174 <#assign xPathImmagineBannerByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 175 <#if xPathImmagineBannerByDefaultLocale?? && xPathImmagineBannerByDefaultLocale?has_content> 176 <#assign immagineBannerByDefaultLocale = xPathImmagineBannerByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 177 <#if immagineListaByDefaultLocale?trim?has_content> 178 <#assign immagineByDefaultLocale = immagineListaByDefaultLocale> 179 <#else> 180 <#assign immagineByDefaultLocale = immagineBannerByDefaultLocale> 181 </#if> 182 </#if> 183 <#if validator.isNotNull(immagineByDefaultLocale)> 184 <#attempt> 185 <#assign imgJsonByDefaultLocale = jsonFactoryUtil.createJSONObject(immagineByDefaultLocale)> 186 <#assign url = "/documents/"+ imgJsonByDefaultLocale.groupId +"/" +imgJsonByDefaultLocale.classPK +"/"+ imgJsonByDefaultLocale.title +"/"+imgJsonByDefaultLocale.uuid + "?width=600" > 187 <#recover> 188 <#assign url = ""> 189 </#attempt> 190 </#if> 191 <#recover> 192 </#attempt> 193 <#--CONTENT BY DEFAULT LOCALE--> 194 195 <#assign urlTitle = ja.getUrlTitle() /> 196 <#assign document = saxReaderUtil.read(contentByLocale) > 197 <#assign rootElement = document.getRootElement()> 198 <#assign xPathTitolo = "" /> 199 <#assign xPathSottotitolo_abstract = "" /> 200 <#assign xPathImmagineBanner = "" /> 201 <#assign xPathTextAltImg = "" /> 202 <#assign immagineLista = ""> 203 <#assign textAltImgLista = ""> 204 <#assign immagine = ""> 205 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 206 <#assign xPathSottotitolo_abstract = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 207 208 <#assign xPathImmagineLista = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 209 <#if xPathImmagineLista?? && xPathImmagineLista?has_content> 210 <#if xPathImmagineLista.selectSingleNode(rootElement)?? && xPathImmagineLista.selectSingleNode(rootElement)?has_content> 211 <#assign immagineLista = xPathImmagineLista.selectSingleNode(rootElement).getStringValue()> 212 </#if> 213 </#if> 214 <#assign xPathTextAltImgLista = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_lista']")> 215 <#if xPathTextAltImgLista?? && xPathTextAltImgLista?has_content> 216 <#if xPathTextAltImgLista.selectSingleNode(rootElement)?? && xPathTextAltImgLista.selectSingleNode(rootElement)?has_content> 217 <#assign textAltImgLista = xPathTextAltImgLista.selectSingleNode(rootElement).getStringValue()> 218 </#if> 219 </#if> 220 221 <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 222 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_banner']")> 223 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 224 <#assign destinationPage = "${detailBaseUrl}/search/-/search/${subpage}/${urlTitle}" /> 225 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 226 <#assign sottotitolo_abstract = xPathSottotitolo_abstract.selectSingleNode(rootElement).getStringValue()> 227 228 <#assign immagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()> 229 <#if !textAltImg?has_content> 230 <#assign textAltImg = titolo> 231 </#if> 232 233 <#if immagineLista?trim?has_content> 234 <#assign immagine = immagineLista> 235 <#assign textAltImg = textAltImgLista> 236 <#else> 237 <#assign immagine = immagineBanner> 238 </#if> 239 240 <#if validator.isNotNull(immagine)> 241 <#attempt> 242 <#assign imgJson = jsonFactoryUtil.createJSONObject(immagine)> 243 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 244 <#recover> 245 </#attempt> 246 </#if> 247 </#if> 248 <div class="card-container col-12 palermo-carousel-item ${colorebordo}"> 249 <div class="row"> 250 <div class="card"> 251 <a href="${destinationPage}"> 252 <img class="card-img-top" src="${url}" alt="${textAltImg}"> 253 <div class="card-body"> 254 <h3 class="card-title">${titolo} 255 </h3> 256 <p class="card-text"> 257 ${sottotitolo_abstract} 258 </p> 259 </div> 260 </a> 261 </div> 262 </div> 263 </div> 264 </#list> 265 </div> 266 </div> 267 </div> 268 </div> 269 </div> 270 </div> 271 </div> 272 </div> 273 <#else> 274 <div style="border: 1px solid red; padding:20px;"> 275 <h3 style="color: red;">Questo template supporta solo contenuti di tipo Web Content con struttura attrattori, eventi, itinerari, ricette, luoghi e proposte di viaggio.</h3> 276 <h3 style="color: red;">Configurare opportunamente l'aggregatore risorse</h3> 277 </div> 278 </#if> 279 280</#if> The following has evaluated to null or missing:
==> structureService.getStructureAttrattoreKey() [in template "20099#20135#153060" at line 11, column 39]
----
Tip: If the failing expression is known to be 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: #assign attrattoreStructureKey = stru... [in template "20099#20135#153060" at line 11, column 5]
---- 1<#-- CAROSELLO MULTITIPO 05/07/2023--> 2 3<#assign showTemplate = false /> 4<#assign emptyEntries = false /> 5 6<#assign structureService = serviceLocator.findService("it.inera.palermo.structure.service.StructureService")> 7<#assign detailBaseUrl = structureService.getSiteBaseUrl(themeDisplay)> 8 9<#if entries?has_content> 10 <#assign showTemplate = true /> 11 <#assign attrattoreStructureKey = structureService.getStructureAttrattoreKey()> 12 <#assign eventoStructureKey = structureService.getStructureEventoKey()> 13 <#assign itinerarioStructureKey = structureService.getStructureItinerarioKey()> 14 <#assign ricettaStructureKey = structureService.getStructureRicettaKey()> 15 <#assign luogoStructureKey = structureService.getStructureLuogoKey()> 16 <#assign categoriaStructureKey = "34431"> 17 18 <#assign layout = themeDisplay.getLayout()/> 19 <#assign currentSite = themeDisplay.getSiteGroup()/> 20 <#assign currentSiteUrl = currentSite.getPathFriendlyURL(false, themeDisplay)/> 21 <#assign currentSiteFriendlyUrl = currentSite.getFriendlyURL()/> 22 23 <#assign count = 1/> 24 <#list entries as curEntry> 25 <#assign assetRenderer = curEntry.getAssetRenderer()/> 26 <#if validator.isNotNull(assetRenderer)> 27 <#assign className = assetRenderer.getClassName() /> 28 <#if className == "com.liferay.journal.model.JournalArticle"> 29 <#assign ja = assetRenderer.getArticle() /> 30 <#assign structureId = ja.getStructureId() /> 31 32 <#if showTemplate && structureId != attrattoreStructureKey && structureId != eventoStructureKey 33 && structureId != itinerarioStructureKey && structureId != ricettaStructureKey 34 && structureId != luogoStructureKey && structureId != categoriaStructureKey> 35 <#assign showTemplate = false /> 36 </#if> 37 <#else> 38 <#assign showTemplate = false /> 39 </#if> 40 <#else> 41 <#assign showTemplate = false /> 42 </#if> 43 </#list> 44<#else> 45 <#assign emptyEntries = true /> 46</#if> 47 48<#if !emptyEntries> 49 <#if showTemplate> 50 <div class="container mb-5"> 51 <div class="row"> 52 <div class="col-12"> 53 <div class="tab-content category-offers" id="offer-tab-content"> 54 <div class="tab-pane fade show active" id="visite-guidate" role="tabpanel" aria-labelledby="visite-guidate-label"> 55 <div class="row"> 56 <div class="col-12"> 57 <div class="card-carousel owl-carousel std-card-carousel" data-carousel="{"nav":true,"navText":["<i class='icon-angle-left'></i>","<i class='icon-angle-right'></i>"],"autoplay":false,"autoplayHoverPause":true,"responsiveClass":true,"responsive":{"0":{"items":1,"slideBy":1},"480":{"items":2,"slideBy":2},"768":{"items":3,"slideBy":3}}}"> 58 59 <#list entries as curEntry> 60 <#assign assetRenderer = curEntry.getAssetRenderer()/> 61 <#assign ja = assetRenderer.getArticle() /> 62 <#assign structureId = ja.getStructureId() /> 63 <#assign langId = themeDisplay.getLanguageId() /> 64 <#assign contentByLocale = ja.getContentByLocale(themeDisplay.getLanguageId()) /> 65 66 <#assign colorebordo = "border-bottom-yellow"> 67 <#assign subpage = "luogo"> 68 <#assign destinationPage = "" /> 69 <#assign url = ""> 70 <#assign textAltImg = "" /> 71 <#assign titolo = ""> 72 <#assign sottotitolo_abstract = ""> 73 74 <#if structureId == categoriaStructureKey> 75 76 <#assign document = saxReaderUtil.read(contentByLocale) > 77 <#assign rootElement = document.getRootElement()> 78 79 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 80 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 81 82 <#assign xPathSottotitolo = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 83 <#assign sottotitolo_abstract = xPathSottotitolo.selectSingleNode(rootElement).getStringValue()> 84 85 <#assign colorebordo = "border-bottom-yellow"> 86 <#assign xPathColorBorder = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")> 87 <#if xPathColorBorder?? && xPathColorBorder?has_content 88 && saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']")?has_content 89 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?? 90 && (saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue())?has_content> 91 <#assign colorebordo = saxReaderUtil.createXPath("dynamic-element[@name='colorebordo']").getStringValue()> 92 </#if> 93 94 <#assign xPathImmagine = saxReaderUtil.createXPath("dynamic-element[@name='immagine']")> 95 <#if xPathImmagine?? && xPathImmagine?has_content > 96 <#assign imgNews = xPathImmagine.selectSingleNode(rootElement).getStringValue()> 97 <#if imgNews?? && imgNews?has_content && (imgNews?length > 1)> 98 99 <#attempt> 100 <#assign imgJson = jsonFactoryUtil.createJSONObject(imgNews)> 101 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 102 <#recover> 103 </#attempt> 104 </#if> 105 </#if> 106 107 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine']")> 108 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 109 110 <#assign xPathLinkAPagina = saxReaderUtil.createXPath("dynamic-element[@name='link_a_pagina']")> 111 <#assign linkToPage = "" > 112 113 <#if xPathLinkAPagina?? > 114 <#if xPathLinkAPagina?has_content > 115 <#assign linkAPagina = xPathLinkAPagina.selectSingleNode(rootElement).getStringValue() > 116 <#assign linkAPaginaSplitted = linkAPagina?split("@") > 117 <#assign layoutIdPage = linkAPaginaSplitted?first > 118 <#assign layoutIdPage = getterUtil.getLong(layoutIdPage) > 119 <#assign groupIdPage = linkAPaginaSplitted?last > 120 <#assign groupIdPage = getterUtil.getLong(groupIdPage) > 121 122 <#if layoutIdPage != 0 > 123 <#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")> 124 <#assign contentPage = ""> 125 <#attempt> 126 <#assign contentPage = layoutLocalService.getLayout(groupIdPage, false, layoutIdPage ) > 127 <#if contentPage?? > 128 <#assign linkToPage = contentPage.getFriendlyURL(locale) > 129 <#assign linkToPage = currentSiteUrl + currentSiteFriendlyUrl + linkToPage?trim> 130 </#if> 131 <#recover> 132 </#attempt> 133 </#if> 134 135 </#if> 136 </#if> 137 138 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 139 <#assign xPathLinkEsterno = saxReaderUtil.createXPath("dynamic-element[@name='link_esterno']")> 140 <#assign linkToPage = xPathLinkEsterno.selectSingleNode(rootElement).getStringValue() > 141 <#assign linkToPage = linkToPage?trim> 142 </#if> 143 144 <#if linkToPage?? && (linkToPage?length == 0 || linkToPage?length == 1) > 145 <#assign xPathLinkInterno = saxReaderUtil.createXPath("dynamic-element[@name='link_interno']")> 146 <#assign linkToPage = xPathLinkInterno.selectSingleNode(rootElement).getStringValue() > 147 <#assign linkToPage = linkToPage?trim> 148 </#if> 149 <#assign destinationPage = linkToPage> 150 <#else> 151 <#if structureId == attrattoreStructureKey> 152 <#assign subpage = "attrazione"> 153 <#elseif structureId == eventoStructureKey> 154 <#assign subpage = "evento"> 155 <#elseif structureId == itinerarioStructureKey> 156 <#assign subpage = "itinerario"> 157 <#elseif structureId == ricettaStructureKey> 158 <#assign subpage = "ricetta"> 159 <#elseif structureId == luogoStructureKey> 160 <#assign subpage = "luogo"> 161 <#else> 162 </#if> 163 <#--CONTENT BY DEFAULT LOCALE--> 164 <#attempt> 165 <#assign contentByDefaultLocale = ja.getContentByLocale(localeUtil.getDefault()) /> 166 <#assign documentByDefaultLocale = saxReaderUtil.read(contentByDefaultLocale) > 167 <#assign rootElementByDefaultLocale = documentByDefaultLocale.getRootElement()> 168 <#assign xPathImmagineListaByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 169 <#if xPathImmagineListaByDefaultLocale?? && xPathImmagineListaByDefaultLocale?has_content> 170 <#if xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?? && xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale)?has_content> 171 <#assign immagineListaByDefaultLocale = xPathImmagineListaByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 172 </#if> 173 </#if> 174 <#assign xPathImmagineBannerByDefaultLocale = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 175 <#if xPathImmagineBannerByDefaultLocale?? && xPathImmagineBannerByDefaultLocale?has_content> 176 <#assign immagineBannerByDefaultLocale = xPathImmagineBannerByDefaultLocale.selectSingleNode(rootElementByDefaultLocale).getStringValue()> 177 <#if immagineListaByDefaultLocale?trim?has_content> 178 <#assign immagineByDefaultLocale = immagineListaByDefaultLocale> 179 <#else> 180 <#assign immagineByDefaultLocale = immagineBannerByDefaultLocale> 181 </#if> 182 </#if> 183 <#if validator.isNotNull(immagineByDefaultLocale)> 184 <#attempt> 185 <#assign imgJsonByDefaultLocale = jsonFactoryUtil.createJSONObject(immagineByDefaultLocale)> 186 <#assign url = "/documents/"+ imgJsonByDefaultLocale.groupId +"/" +imgJsonByDefaultLocale.classPK +"/"+ imgJsonByDefaultLocale.title +"/"+imgJsonByDefaultLocale.uuid + "?width=600" > 187 <#recover> 188 <#assign url = ""> 189 </#attempt> 190 </#if> 191 <#recover> 192 </#attempt> 193 <#--CONTENT BY DEFAULT LOCALE--> 194 195 <#assign urlTitle = ja.getUrlTitle() /> 196 <#assign document = saxReaderUtil.read(contentByLocale) > 197 <#assign rootElement = document.getRootElement()> 198 <#assign xPathTitolo = "" /> 199 <#assign xPathSottotitolo_abstract = "" /> 200 <#assign xPathImmagineBanner = "" /> 201 <#assign xPathTextAltImg = "" /> 202 <#assign immagineLista = ""> 203 <#assign textAltImgLista = ""> 204 <#assign immagine = ""> 205 <#assign xPathTitolo = saxReaderUtil.createXPath("dynamic-element[@name='titolo']")> 206 <#assign xPathSottotitolo_abstract = saxReaderUtil.createXPath("dynamic-element[@name='sottotitolo']")> 207 208 <#assign xPathImmagineLista = saxReaderUtil.createXPath("dynamic-element[@name='immagine_lista']")> 209 <#if xPathImmagineLista?? && xPathImmagineLista?has_content> 210 <#if xPathImmagineLista.selectSingleNode(rootElement)?? && xPathImmagineLista.selectSingleNode(rootElement)?has_content> 211 <#assign immagineLista = xPathImmagineLista.selectSingleNode(rootElement).getStringValue()> 212 </#if> 213 </#if> 214 <#assign xPathTextAltImgLista = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_immagine_lista']")> 215 <#if xPathTextAltImgLista?? && xPathTextAltImgLista?has_content> 216 <#if xPathTextAltImgLista.selectSingleNode(rootElement)?? && xPathTextAltImgLista.selectSingleNode(rootElement)?has_content> 217 <#assign textAltImgLista = xPathTextAltImgLista.selectSingleNode(rootElement).getStringValue()> 218 </#if> 219 </#if> 220 221 <#assign xPathImmagineBanner = saxReaderUtil.createXPath("dynamic-element[@name='banner']")> 222 <#assign xPathTextAltImg = saxReaderUtil.createXPath("dynamic-element[@name='testo_alternativo_banner']")> 223 <#assign textAltImg = xPathTextAltImg.selectSingleNode(rootElement).getStringValue()> 224 <#assign destinationPage = "${detailBaseUrl}/search/-/search/${subpage}/${urlTitle}" /> 225 <#assign titolo = xPathTitolo.selectSingleNode(rootElement).getStringValue()> 226 <#assign sottotitolo_abstract = xPathSottotitolo_abstract.selectSingleNode(rootElement).getStringValue()> 227 228 <#assign immagineBanner = xPathImmagineBanner.selectSingleNode(rootElement).getStringValue()> 229 <#if !textAltImg?has_content> 230 <#assign textAltImg = titolo> 231 </#if> 232 233 <#if immagineLista?trim?has_content> 234 <#assign immagine = immagineLista> 235 <#assign textAltImg = textAltImgLista> 236 <#else> 237 <#assign immagine = immagineBanner> 238 </#if> 239 240 <#if validator.isNotNull(immagine)> 241 <#attempt> 242 <#assign imgJson = jsonFactoryUtil.createJSONObject(immagine)> 243 <#assign url = "/documents/"+ imgJson.groupId +"/" +imgJson.classPK +"/"+ imgJson.title +"/"+imgJson.uuid + "?width=600" > 244 <#recover> 245 </#attempt> 246 </#if> 247 </#if> 248 <div class="card-container col-12 palermo-carousel-item ${colorebordo}"> 249 <div class="row"> 250 <div class="card"> 251 <a href="${destinationPage}"> 252 <img class="card-img-top" src="${url}" alt="${textAltImg}"> 253 <div class="card-body"> 254 <h3 class="card-title">${titolo} 255 </h3> 256 <p class="card-text"> 257 ${sottotitolo_abstract} 258 </p> 259 </div> 260 </a> 261 </div> 262 </div> 263 </div> 264 </#list> 265 </div> 266 </div> 267 </div> 268 </div> 269 </div> 270 </div> 271 </div> 272 </div> 273 <#else> 274 <div style="border: 1px solid red; padding:20px;"> 275 <h3 style="color: red;">Questo template supporta solo contenuti di tipo Web Content con struttura attrattori, eventi, itinerari, ricette, luoghi e proposte di viaggio.</h3> 276 <h3 style="color: red;">Configurare opportunamente l'aggregatore risorse</h3> 277 </div> 278 </#if> 279 280</#if> La Santuzza non è soltanto la patrona dei palermitani.
Tra i tanti gruppi etnici che hanno adottato Rosalia, quello dei Tamil è di sicuro il più devoto.
La comunità è veramente imponente, la più numerosa tra quelle presenti in Italia: circa 8mila persone, Palermo è la terza città nel mondo per numero di residenti Tamil, la maggior parte delle famiglie proviene dallo Sri Lanka e si è rifugiata a Palermo per sfuggire alla sanguinosa guerra civile scoppiata in patria.




Progetto cofinanaziato dall'Unione Europea - Fondi Strutturali e di Investimento Europei - Programma Operativo Città Metropolitane 2014-2020