Hora del conte | Vidrà
Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> root.selectSingleNode("dynamic-element[@name='" + name + "']/dynamic-content") [in template "10901#10934#AGENDA" at line 98, column 18]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #local node = root.selectSingleNode("... [in template "10901#10934#AGENDA" in function "nodeText" at line 98, column 3]
---- 1<#-- [I] Services & utils --> 2 3 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 4 <#assign friendlyURLNormalizer=staticUtil["com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil"]> 5 <#assign groupUtil = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")> 6 <#assign assetEntryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 7 <#assign assetCategoryService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 8 <#assign assetCategoryPropertyLocalService=serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService" )> 9 10<#-- [F] Services --> 11<#-- [I] Variables globals --> 12 13 <#assign geniusGroupId=6200569> 14 <#assign id = .vars['reserved-article-id'].data> 15 <#assign group=groupUtil.getGroup(groupId)> 16 <#assign articles = journalArticleLocalService.getStructureArticles(groupId, 341449, 0, 1, null)> 17 <#-- MIGRATION FIX: el fallback de bibliobús ara s'assigna a "articles" (abans anava a "articlesBibliobus", que mai s'utilitzava -> crida a servei malbaratada) --> 18 <#if !articles?has_content> 19 <#assign articles = journalArticleLocalService.getStructureArticles(groupId, 437558715, 0, 1, null)> 20 </#if> 21 <#assign journalArticle = journalArticleLocalService.getArticle(groupId, id)> 22 <#assign assetEntry = assetEntryService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey())> 23 <#assign categorias=assetCategoryService.getEntryCategories(assetEntry.getEntryId())> 24 <#assign themedisplayscopeid=themeDisplay.getScopeGroupId()> 25 26<#-- [F] Variables globals --> 27<#-- [I] IDs categories --> 28 29<#assign 30 idTipusAct = 57984278 31 idTipusPublic = 57984246 32 idPeriodicitat = 64158317 33 idDiesSetmana = 64158372 34 idBibliolab = 341097 35 idODS = 429525132 36 /> 37 38<#-- [F] IDs categories --> 39<#-- [I] Macros reutilitzables --> 40 41<#macro formatDate dateString> 42 <#if validator.isNotNull(dateString)> 43 <#assign dateObj = dateUtil.parseDate("yyyy-MM-dd", dateString, locale)> 44 ${dateUtil.getDate(dateObj, "dd/MM/yyyy", locale)} 45 </#if> 46</#macro> 47 48<#macro getDataString> 49 <#assign Data_Inici_Data = getterUtil.getString(Data_Inici.getData())> 50 <#assign Data_Fi_Data = getterUtil.getString(Data_Fi.getData())> 51 52 <#if (Data_Inici.getData() ==Data_Fi.getData())> 53 <@formatDate dateString=Data_Inici_Data /> 54 <#else > 55 <@formatDate dateString=Data_Inici_Data /> - <@formatDate dateString=Data_Fi_Data /> 56 </#if> 57</#macro> 58 59<#macro renderImage> 60 <#-- MIGRATION FIX: null-safety amb (...)!"" i ?has_content en tots els accessos a camps --> 61 <#assign imagenURL = (imatge.getData())!""> 62 <#if imagenURL?length == 0> 63 <#assign imagenURL = (imatge.urlExterna.getData())!""> 64 </#if> 65 <#if imagenURL?has_content> 66 <#assign descShort = stringUtil.shorten(htmlUtil.stripHtml((descripcio.getData())!""), 350)> 67 <#assign titolMeta = (titol.getData())!""> 68 <#assign peu = (peuImatge.getData())!""> 69 <div class="flotantesquerra" style="max-width:200px"> 70 <#if imagenURL?length gte 4 && imagenURL?substring(0,4) != "http"> 71 <#assign imagenURL = themeDisplay.getPortalURL() + imagenURL> 72 </#if> 73 <meta property="og:url" content="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}"/> 74 <meta property="og:type" content="article" /> 75 <meta property="og:description" content="${descShort}" /> 76 <meta property="og:title" content="${titolMeta}" /> 77 <meta property="og:image" content="${imagenURL}" /> 78 <meta property="og:image:width" content="250" /> 79 <meta property="og:image:height" content="200" /> 80 <meta name="twitter:card" content="summary_large_image" /> 81 <meta name="twitter:card" content="summary" /> 82 <meta name="twitter:title" content="${titolMeta}" /> 83 <meta name="twitter:description" content="${descShort}" /> 84 <meta name="twitter:url" content="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}"/> 85 <meta name="twitter:image" content="${imagenURL}" /> 86 87 <img alt="" src="${imagenURL}" style="max-width:200px"/> 88 <#if peu?has_content> 89 <span> ${peu}</span> 90 </#if> 91 </div> 92 </#if> 93</#macro> 94 95<#-- MIGRATION FIX: substitueix saxReaderUtil + selectSingleNode().getText() per un accés null-safe 96 al document ja carregat de l'article (art.getDocument()), sense servei extern de parsing XML --> 97<#function nodeText root name> 98 <#local node = root.selectSingleNode("dynamic-element[@name='" + name + "']/dynamic-content")> 99 <#if node?? && node?has_content> 100 <#return (node.getText())!""> 101 </#if> 102 <#return ""> 103</#function> 104 105<#macro printODS categories> 106 <#if validator.isNotNull(categories)> 107 <#assign additionalCssClass="" /> 108 <#if (getterUtil.getInteger(themedisplayscopeid) == getterUtil.getInteger(geniusGroupId))> 109 <#assign additionalCssClass="genius" /> 110 </#if> 111 <div class="row seccionOds ${additionalCssClass}"> 112 <div class="col-fluid"> 113 <a id="titolOds" class="btn" data-toggle="collapse" href="#categoryOds" role="button" aria-expanded="true" aria-controls="collapseExample" title="ODS"> 114 <img src="/documents/d/global/icona-objectius-globals"/> 115 <i class="icon-large fa-solid fa-chevron-right"/> 116 </a> 117 </div> 118 <div class="col collapse show" id="categoryOds"> 119 <#list categories as categoria> 120 <#--ODS--> 121 <#if (categoria.getVocabularyId()==idODS)> 122 <#-- MIGRATION FIX: variables locals (odsImatge/odsUrl) per no sobreescriure el camp global "imatge"; src amb cometes --> 123 <#local odsImatge = assetCategoryPropertyLocalService.getCategoryProperty(categoria.getCategoryId(), "imatge")> 124 <#local odsUrl = assetCategoryPropertyLocalService.getCategoryProperty(categoria.getCategoryId(), "url")> 125 <#if odsImatge?has_content && odsUrl?has_content> 126 <a href="${odsUrl.getValue()}" title="${categoria.getName()}" target="_blank"> 127 <img src="${odsImatge.getValue()}" alt="${categoria.getName()}" class="mb-2"> 128 </a> 129 </#if> 130 </#if> 131 </#list> 132 </div> 133 </div> 134 </#if> 135</#macro> 136 137 138<#-- [F] Macros reutilitzables --> 139<#-- [I] Valors categories --> 140 <#-- MIGRATION FIX: substituïm concatenacions de strings per llistes + ?join (més segur i llegible) --> 141 <#assign tipusActivitatList = []> 142 <#assign tipusPublicList = []> 143 <#assign periodicitatList = []> 144 <#assign diesList = []> 145 <#assign bibliolab = ""> 146 <#assign hasOds = false> 147 148 <#list categorias as categoria> 149 <#assign vocabId = categoria.getVocabularyId()> 150 <#assign titolCat = categoria.getTitle(locale, true)> 151 <#if vocabId == idTipusAct> 152 <#assign tipusActivitatList = tipusActivitatList + [titolCat]> 153 <#elseif vocabId == idTipusPublic> 154 <#assign tipusPublicList = tipusPublicList + [titolCat]> 155 <#elseif vocabId == idPeriodicitat> 156 <#assign periodicitatList = periodicitatList + [titolCat]> 157 <#elseif vocabId == idDiesSetmana> 158 <#assign diesList = diesList + [titolCat]> 159 <#elseif vocabId == idBibliolab> 160 <#if titolCat == "BiblioLab"> 161 <#assign bibliolab = "1"> 162 </#if> 163 <#elseif vocabId == idODS> 164 <#assign hasOds = true> 165 </#if> 166 </#list> 167 168 <#assign tipusActivitat = tipusActivitatList?join(" | ")> 169 <#assign tipusPublic = tipusPublicList?join(" | ")> 170 <#assign periodicitat = periodicitatList?join(",")> 171 <#assign dies = diesList?join(", ")> 172 <#-- MIGRATION FIX: eliminat el reset final de "bibliolab" que anul·lava el logo BiblioLab (bug) i les variables ...Biblio no utilitzades --> 173<#-- [F] Valors categories --> 174 175<#if (getterUtil.getInteger(themedisplayscopeid) != getterUtil.getInteger(geniusGroupId))> 176 <h2 class="titol"><@liferay.language key="activities"/></h2> 177</#if> 178<div class="detalleEvento" style="clear:both"> 179 <div class="seccionTitulo"> 180 <div class="titulo" style="float:left !important; margin-left:5px; width: calc(100% - 5px);"> 181 <span style="float:left !important; margin-left:5px">${(titol.getData())!""}</span> 182 <#if bibliolab == "1"> 183 <div class="logoBiblioLab" style="float:right !important; margin-left:5px"></div> 184 </#if> 185 </div> 186 </div> 187 <#if ((imatge.getData())!"")?has_content> 188 <@renderImage/> 189 </#if> 190 ${(descripcio.getData())!""} 191 <div class="seccionDatos"> 192 <div class="fechaHora"> 193 <div class="fecha"> 194 <@liferay.language key="date"/> 195 </div> 196 <div class="datoFecha"> 197 <@getDataString/> 198 <#if periodicitat?has_content> 199 <br/><@liferay.language key="periodicidad"/>: ${periodicitat} 200 <#if dies?has_content> 201 <br/><@liferay.language key="periodicidad.texto.dias"/>: ${dies} 202 </#if> 203 </#if> 204 </div> 205 <div class="fecha"> 206 <@liferay.language key="time"/> 207 </div> 208 <#assign horaIniciText = (horaInici.getData())!""> 209 <#if horaIniciText?has_content> 210 <div class="datoFecha"> 211 ${horaIniciText} 212 </div> 213 </#if> 214 <#assign duracioText = (duracio.getData())!""> 215 <#if duracioText?has_content> 216 <div class="fecha"> 217 <@liferay.language key="agenda.duracio"/> 218 </div> 219 <div class="datoFecha"> 220 ${duracioText} 221 </div> 222 </#if> 223 <#if tipusPublic?has_content> 224 <div class="fecha"> 225 <@liferay.language key="agenda.tipuspublic"/> 226 </div> 227 <div class="datoFecha"> 228 ${tipusPublic} 229 </div> 230 </#if> 231 </div> 232 <div class="lugares"> 233 <div class="lugar"> 234 <@liferay.language key="place"/> 235 </div> 236 <div class="lugarEvento"> 237 <#-- MIGRATION FIX: sense saxReaderUtil; s'usa art.getDocument() (document ja parsejat i cachejat per l'article) + funció nodeText null-safe --> 238 <#assign biblioName = (group.getDescriptiveName())!""> 239 <#assign biblioUrl = friendlyURLNormalizer.normalize(biblioName)?replace(".", "")?replace("-–-", "-")> 240 <#assign lang = languageUtil.getLanguageId(locale)> 241 <#if articles?has_content> 242 <#list articles as art> 243 <#assign doc = art.getDocument()!> 244 <#assign latitudBiblio = ""> 245 <#assign longitudBiblio = ""> 246 <#assign adressBiblio = ""> 247 <#assign phoneBiblio = ""> 248 <#assign emailBiblio = ""> 249 <#if doc?? && doc?has_content> 250 <#assign root = doc.getRootElement()> 251 <#assign latitudBiblio = nodeText(root, "latitude")> 252 <#assign longitudBiblio = nodeText(root, "longitude")> 253 <#assign adressBiblio = nodeText(root, "address")> 254 <#assign phoneBiblio = nodeText(root, "phone")> 255 <#assign emailBiblio = nodeText(root, "email")> 256 </#if> 257 <#-- Els camps latitud/longitud de la pròpia activitat tenen prioritat --> 258 <#if ((latitud.getData())!"")?has_content> 259 <#assign latitudBiblio = latitud.getData()?trim> 260 </#if> 261 <#if ((longitud.getData())!"")?has_content> 262 <#assign longitudBiblio = longitud.getData()?trim> 263 </#if> 264 265 <strong><a href="/${biblioUrl}">${biblioName}</a></strong> 266 <#if latitudBiblio?has_content && longitudBiblio?has_content> 267 <br/><a href="https://www.google.es/maps/place/${latitudBiblio},${longitudBiblio}?hl=${lang?substring(0,2)}" target="_blank">${languageUtil.get(locale, 'agenda.indicacions')}</a> 268 </#if> 269 <#if adressBiblio?has_content><br/>${adressBiblio}</#if> 270 <#if phoneBiblio?has_content> 271 Tel: ${phoneBiblio} 272 </#if> 273 <#if emailBiblio?has_content> 274 <br/><a href="mailto:${emailBiblio}">${emailBiblio}</a> 275 </#if> 276 </#list> 277 <#else> 278 <a href="/${biblioUrl}">${biblioName}</a> 279 </#if> 280 </div> 281 <#assign preuText = (preu.getData())!""> 282 <#if preuText?has_content> 283 <div class="lugar"> 284 <@liferay.language key="price"/> 285 </div> 286 <div class="lugarEvento"> 287 ${preuText} 288 </div> 289 </#if> 290 <#if tipusActivitat?has_content> 291 <div class="lugar"> 292 <@liferay.language key="agenda.tipusactivitat"/> 293 </div> 294 <div class="lugarEvento"> 295 ${tipusActivitat} 296 </div> 297 </#if> 298 <#if urlInscripcions?? && (urlInscripcions.getData())?has_content> 299 <a href="${urlInscripcions.getData()}" target="_blank" class="btn btn-default"> 300 <@liferay.language key="agenda.inscriurem"/> 301 </a> 302 </#if> 303 </div> 304 </div> 305 <#if hasOds> 306 <#-- TODO: Moure estils al tema --> 307 <style> 308 #titolOds img, #categoryOds img { 309 height: 3.5rem; 310 margin: 0px 5px; 311 } 312 .seccionOds { 313 margin: 0 0 20px 0; 314 display: inline-flex; 315 } 316 .seccionOds a { 317 text-decoration: none; 318 } 319 #categoryOds img { 320 margin-top: 0.375rem; 321 } 322 </style> 323 <@printODS categorias/> 324 </#if> 325</div> 326 327<#-- [I] Add to any --> 328<div style="clear:both"></div> 329<div class="a2a_kit a2a_kit_size_32 a2a_default_style" data-a2a-url="${themeDisplay.getPortalURL()}${themeDisplay.getURLCurrent()}" data-a2a-title="${(titol.getData())!""}" style="background-color: #e6e6e6;display: inline-block;" data-a2a-icon-color="#e6e6e6,#000000"> 330 <div class="a2a_kit a2a_kit_size_32 a2a_default_style"> 331 <a class="a2a_dd" href="https://www.addtoany.com/share"></a> 332 <a class="a2a_button_email"></a> 333 <a class="a2a_button_print"></a> 334 </div> 335</div> 336<div style="clear:both"></div> 337<script> 338 var a2a_config = a2a_config || {}; 339 a2a_config.onclick = false; 340 a2a_config.locale = "es"; 341 342 /* MIGRATION FIX: eliminat jQuery ($(document).ready) -> DOMContentLoaded natiu */ 343 document.addEventListener('DOMContentLoaded', function () { 344 try { 345 var script = document.createElement('script'); 346 script.src = "https://static.addtoany.com/menu/page.js"; 347 script.addEventListener('load', function () { 348 try { 349 a2a.init_all(); 350 } catch (error) { 351 console.error(error.message); 352 } 353 }); 354 document.head.appendChild(script); 355 } catch (error) { 356 console.error(error.message); 357 } 358 }); 359</script> 







