Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> assetRenderer.getURLViewInContext(themeDisplay, null) [in template "20096#20122#8022999" at line 444, column 52]
----
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: #assign viewURL = assetRenderer.getUR... [in template "20096#20122#8022999" at line 444, column 33]
----
1<!--AECID-CC-Eventos-->
2
3<style>
4 .estado {
5 -webkit-border-radius: 10px;
6 -moz-border-radius: 10px;
7 border-radius: 10px;
8 padding: .28rem .556rem;
9 display: block;
10 width: fit-content;
11 min-width: 7.4rem;
12 text-align: center;
13 }
14 .estado.neutro {
15 background-color: var(--gris-fondo);
16 }
17 .estado.verde {
18 background-color: #a4cb23;
19 color:#ffffff;
20 }
21 .estado.azul {
22 background-color: #4fc0fd;
23 color:#ffffff;
24 }
25 .estado.naranja {
26 background-color: #f39918;
27 color:#ffffff;
28 }
29 .estado.amarillo {
30 background-color: #feb71b;
31 color:#ffffff;
32 }
33 .estado.rojo {
34 background-color: #de0032;
35 color:#ffffff;
36 }
37 .estado.morado {
38 background-color: #540081;
39 color:#ffffff;
40 }
41
42 .Caja-bordeada-gris {
43 border: 2px solid #999999;
44 }
45
46 .Accesibilidad {background-color: #A4CB23; color:#ffffff;}
47 .Artes {background-color: #4FC0FD; color:#ffffff;}
48 .Ciencia {background-color: #F39918; color:#ffffff;}
49 .CienciaTec {background-color: #FEB71B; color:#ffffff;}
50 .Cine {background-color: #DE0032; color:#ffffff;}
51 .Ciudadania {background-color: #540081; color:#ffffff;}
52 .Cultura {background-color: #A4CB23; color:#ffffff;}
53 .Debate {background-color: #4FC0FD; color:#ffffff;}
54 .Diversidad {background-color: #F39918; color:#ffffff;}
55 .Escenicas {background-color: #FEB71B; color:#ffffff;}
56 .Examenes {background-color: #ec0909; color:#ffffff;}
57 .Exposiciones {background-color: #DE0032; color:#ffffff;}
58 .Formacion {background-color: #540081; color:#ffffff;}
59 .Infantil {background-color: #A4CB23; color:#ffffff;}
60 .Letras {background-color: #4FC0FD; color:#ffffff;}
61 .Mediacion {background-color: #FEB71B; color:#ffffff;}
62 .Media {background-color: #F39918; color:#ffffff;}
63 .Medioambiente {background-color: #DE0032; color:#ffffff;}
64 .Musica {background-color: #540081; color:#ffffff;}
65 .Patrimonio {background-color: #A4CB23; color:#ffffff;}
66 .Radio {background-color: #4FC0FD; color:#ffffff;}
67
68</style>
69
70<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
71<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") />
72<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
73<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
74
75<#assign articleId = .vars['reserved-article-id'].data />
76<#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.journal.service.JournalArticleResourceLocalServiceUtil"]>
77<#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil"]>
78<#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, articleId)/>
79<!-- configurarlo desde el panel de control -> configuracion -> configuracion del sistema -> motores de plantilla (eliminar servicelocator de variables restringidas) -->
80<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
81<#--${assetEntryLocalService}-->
82<#assign assetEntryId = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", articleResourcePK).getEntryId() />
83
84<!---------------------------------------------------------------------------->
85<!-- Obtener el servicio para obtener los id de los contenidos relacionados -->
86<!---------------------------------------------------------------------------->
87<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.asset.link.service.AssetLinkLocalService")>
88<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", articleResourcePK)>
89<#assign assetLinks = assetLinkLocalService.getDirectLinks(assetEntry.getEntryId())>
90<!---------------------------------------------------------------------------->
91<!---------------------------------------------------------------------------->
92
93
94<#assign urlCodec = staticUtil["com.liferay.portal.kernel.util.URLCodec"] />
95<#assign htmlParserUtil = staticUtil["com.liferay.portal.kernel.util.HtmlParserUtil"] />
96<#assign htmlUtil = staticUtil["com.liferay.portal.kernel.util.HtmlUtil"] />
97
98<#function getJournalPriorityByArticleId articleId>
99 <#attempt>
100 <#local resourcePrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(themeDisplay.getScopeGroupId(), articleId) />
101 <#local assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", resourcePrimKey) />
102 <#return assetEntry.getPriority() />
103 <#recover>
104 </#attempt>
105 <#return "" />
106</#function>
107
108<#function getJournalPriority>
109 <#attempt>
110 <#return getJournalPriorityByArticleId(.vars['reserved-article-id'].data) />
111 <#recover>
112 </#attempt>
113 <#return "" />
114</#function>
115
116
117<#function getGroupVocabularyByName groupId vocabularyName >
118 <#attempt>
119 <#local vocabulary = assetVocabularyLocalService.getGroupVocabulary(groupId, vocabularyName) />
120 <#return vocabulary />
121 <#recover>
122 </#attempt>
123 <#return "" />
124</#function>
125
126<#function getCategoriesJournalArticle groupId articleId >
127 <#attempt>
128 <#local resourcePrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId, articleId) />
129 <#local categories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", resourcePrimKey) />
130 <#return categories />
131 <#recover>
132 </#attempt>
133 <#return "" />
134</#function>
135
136<#function obtenerCategoriasVocabulario articleId vocabularyId>
137 <#local categories = [] />
138 <#attempt>
139 <#local categoriesJ = getCategoriesJournalArticle(groupId, articleId) />
140 <#if categoriesJ?has_content && categoriesJ?size gt 0>
141 <#list categoriesJ as categoryA>
142 <#if categoryA.getVocabularyId() == vocabularyId >
143 <#local categories = categories + [categoryA] />
144 </#if>
145 </#list>
146 </#if>
147 <#recover>
148 </#attempt>
149 <#return categories />
150</#function>
151
152<#function obtenerCategoriasVocabularioNombre articleId vocabularyName>
153 <#local vocabulary = getGroupVocabularyByName(groupId, vocabularyName) />
154 <#return obtenerCategoriasVocabulario(articleId, vocabulary.getVocabularyId()) />
155</#function>
156
157
158
159<#function removeUrlParams url>
160 <#if url?contains("?") >
161 <#return url?substring(0, url?index_of("?")) />
162 </#if>
163 <#return url/>
164</#function>
165
166
167<#assign twitterAccount = ""/>
168<!-- valida también si no viene a null -->
169<#assign customFieldValue = themeDisplay.getSiteGroup().getExpandoBridge().getAttribute("AccountTwitter")!"">
170<#assign twitterAccount = customFieldValue/>
171<!--<p>--${twitterAccount}</p>-->
172
173<#assign URLPortal = themeDisplay.getURLPortal() />
174<#assign URLCurrent = themeDisplay.getURLCurrent() />
175<#assign URLComplete = URLPortal + URLCurrent />
176<#assign URLCompleteNoParams = removeUrlParams(URLComplete) />
177
178
179<!-- El id de las categorÃas de Categorias CC -->
180<!--<#assign vocabularyId = 1682640 />-->
181<#assign vocabularyId = 7623391 />
182
183
184
185<div class="container px-3 px-lg-0">
186 <#assign titulo = .vars['reserved-article-title'].data />
187 <div class="col-2-1-d">
188 <div class="col-izq">
189 <h1 class="tit-h3 txt-bold txt-primario mb-2">
190 <#-- Titulo del evento -->
191 <#if (title.getData())??>
192 ${title.getData()}
193 </#if>
194 </h1>
195 <#if (Subtitulo.getData())?? && Subtitulo.getData() != "">
196 <h2 class="tit-h4">${Subtitulo.getData()}</h2>
197 </#if>
198 <#if (image.getData())?? && image.getData() != "">
199 <#assign imgAltGS = image.getAttribute('alt')/>
200 <#if imgAltGS == "">
201 <#assign imgAltGS = title.getData()/>
202 </#if>
203 <img class="rounded mb-3" alt="${imgAltGS?truncate(150, '...')}" ${(imgAltGS?length > 150)?then('longdesc="' + imgAltGS + '"', '')} data-fileentryid="${image.getAttribute('fileEntryId')}" src="${image.getData()}" />
204 </#if>
205 <#--<#if (descripcionActualidadNoticia.getData())??>
206 <p>${descripcionActualidadNoticia.getData()}</p>
207 </#if>-->
208
209 </div>
210 <div class="col-content">
211 <#if (mainText.getData())??>
212 ${mainText.getData()}
213 </#if>
214
215 <#if (Poster.getData())?? && Poster.getData() != "">
216 <#if (VideoMP4.getData())?? && VideoMP4.getData() != "">
217
218 <div class="embed-responsive embed-responsive-16by9 bdr-radius">
219 <video controls="" poster="${Poster.getData()}">
220 <source src="${VideoMP4.getData()}" type="video/mp4" /> Su navegador no soporta la etiqueta de vídeo.
221 </video>
222 </div>
223
224 </#if>
225 </#if>
226
227 </div>
228
229 <div class="col-der">
230 <dl>
231 <!-- Categoria -->
232
233
234 <#assign categoryList=assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK)>
235
236 <#assign PrimeraCategoria = 0 >
237 <#list categoryList as categoryList>
238
239 <#if categoryList?? && categoryList.getVocabularyId() == vocabularyId>
240 <#assign PrimeraCategoria = PrimeraCategoria + 1>
241 <#if PrimeraCategoria == 1>
242 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Categoría</dt>
243 </#if>
244
245
246 <#assign categoriaFiltrada = categoryList.getName()>
247 <#assign categoriaFiltrada = categoriaFiltrada?trim>
248
249 <#switch categoriaFiltrada>
250 <#case "Accesibilidad / Inclusión">
251 <dd class="txt-uppercase"><span class="estado Accesibilidad">${categoriaFiltrada}</span></dd>
252 <#break>
253 <#case "Artes Visuales">
254 <dd class="txt-uppercase"><span class="estado Artes">${categoriaFiltrada}</span></dd>
255 <#break>
256 <#case "Ciencia">
257 <dd class="txt-uppercase"><span class="estado Ciencia">${categoriaFiltrada}</span></dd>
258 <#break>
259 <#case "Ciencia / Tecnología">
260 <dd class="txt-uppercase"><span class="estado CienciaTec">${categoriaFiltrada}</span></dd>
261 <#break>
262 <#case "Cine / Audiovisual">
263 <dd class="txt-uppercase"><span class="estado Cine">${categoriaFiltrada}</span></dd>
264 <#break>
265 <#case "Ciudadanía / Comunidad">
266 <dd class="txt-uppercase"><span class="estado Ciudadania">${categoriaFiltrada}</span></dd>
267 <#break>
268 <#case "Cultura para el Desarrollo">
269 <dd class="txt-uppercase"><span class="estado Cultura">${categoriaFiltrada}</span></dd>
270 <#break>
271 <#case "Debate / Pensamiento">
272 <dd class="txt-uppercase"><span class="estado Debate">${categoriaFiltrada}</span></dd>
273 <#break>
274 <#case "Diversidad / Géneros">
275 <dd class="txt-uppercase"><span class="estado Diversidad">${categoriaFiltrada}</span></dd>
276 <#break>
277 <#case "Escénicas">
278 <dd class="txt-uppercase"><span class="estado Escenicas">${categoriaFiltrada}</span></dd>
279 <#break>
280 <#case "Exámenes de español">
281 <dd class="txt-uppercase"><span class="estado Examenes">${categoriaFiltrada}</span></dd>
282 <#break>
283 <#case "Exposiciones">
284 <dd class="txt-uppercase"><span class="estado Exposiciones">${categoriaFiltrada}</span></dd>
285 <#break>
286 <#case "Formación">
287 <dd class="txt-uppercase"><span class="estado Formacion">${categoriaFiltrada}</span></dd>
288 <#break>
289 <#case "Infantil / Juvenil">
290 <dd class="txt-uppercase"><span class="estado Infantil">${categoriaFiltrada}</span></dd>
291 <#break>
292 <#case "Letras">
293 <dd class="txt-uppercase"><span class="estado Letras">${categoriaFiltrada}</span></dd>
294 <#break>
295 <#case "Mediación">
296 <dd class="txt-uppercase"><span class="estado Mediacion">${categoriaFiltrada}</span></dd>
297 <#break>
298 <#case "MediaLab">
299 <dd class="txt-uppercase"><span class="estado Media">${categoriaFiltrada}</span></dd>
300 <#break>
301 <#case "Medioambiente / Sostenibilidad">
302 <dd class="txt-uppercase"><span class="estado Medioambiente">${categoriaFiltrada}</span></dd>
303 <#break>
304 <#case "Música / Sonido">
305 <dd class="txt-uppercase"><span class="estado Musica">${categoriaFiltrada}</span></dd>
306 <#break>
307 <#case "Patrimonio">
308 <dd class="txt-uppercase"><span class="estado Patrimonio">${categoriaFiltrada}</span></dd>
309 <#break>
310 <#case "Radio / Pódcast">
311 <dd class="txt-uppercase"><span class="estado Radio">${categoriaFiltrada}</span></dd>
312 <#break>
313 <#default>
314 <dd class="txt-uppercase"><span class="estado neutro">${categoriaFiltrada}</span></dd>
315 <#break>
316 </#switch>
317 </#if>
318
319 </#list>
320
321 <#--<p class="eti-cat">${getJournalPriority()} -
322 <#assign categorias = obtenerCategoriasVocabularioNombre(.vars['reserved-article-id'].data, "Categorias AECID") />
323 <#if categorias?has_content && categorias?size gt 0>
324 ${categorias[0].getName()}
325 </#if>
326 </p>-->
327
328 <!---------------------------------------------------------------------------------------------------->
329 <!-- Si el campo de fechas repetido tiene contenido solo se pinta dichas fechas una detras de otra -->
330 <!-- si no tiene información se pintará la información de las fechas desde y hasta -->
331 <!---------------------------------------------------------------------------------------------------->
332 <#if Fechas.getSiblings()?has_content && Fechas.getSiblings()??>
333 <#if Fechas.getSiblings()?size gt 0 && Fechas.getSiblings()[0].getData() != "">
334 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Fecha</dt>
335 <dd class="txt-uppercase">
336 <#list Fechas.getSiblings() as cur_Fechas>
337 <#assign cur_Fechas_Data = getterUtil.getString(cur_Fechas.getData())>
338
339 <#if validator.isNotNull(cur_Fechas_Data)>
340 <#assign cur_Fechas_DateObj = dateUtil.parseDate("yyyy-MM-dd", cur_Fechas_Data, locale)>
341
342 ${dateUtil.getDate(cur_Fechas_DateObj, "dd MMMM yyyy", locale)}<br>
343 </#if>
344
345 </#list>
346 </dd>
347 <#else>
348 <!-- Fecha desde/hasta -->
349 <#assign startDate_Data = getterUtil.getString(startDate.getData())>
350 <#assign endDate_Data = getterUtil.getString(endDate.getData())>
351 <#if validator.isNotNull(startDate_Data) && validator.isNotNull(endDate_Data)>
352 <#assign startDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", startDate_Data, locale)>
353 <#assign endDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", endDate_Data, locale)>
354 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Fecha</dt>
355 <dd class="txt-uppercase">
356 <!-- Si la fecha desde es igual a la fecha hasta solo se pinta la fecha desde -->
357 <#if startDate_Data == endDate_Data>
358 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)}
359 <#else>
360 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)} - ${dateUtil.getDate(endDate_DateObj, "dd MMMM yyyy", locale)}
361 </#if>
362 </dd>
363 </#if>
364 </#if>
365 </#if>
366
367
368 <!-- Campo horario -->
369 <#if (schedule.getData())?? && (schedule.getData())?has_content>
370 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Horario</dt>
371 <dd class="txt-uppercase"><span class="estado-neutro">${schedule.getData()}</span></dd>
372 </#if>
373
374 <!-- Lugar -->
375 <#if (Lugares.getData())?? && (Lugares.getData())?has_content>
376 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Lugar</dt>
377 <dd class="txt-uppercase"><span class="estado-neutro">${Lugares.getData()}</span></dd>
378 </#if>
379
380 <!-- Colaborador -->
381 <#if (Colaborador.getData())?? && (Colaborador.getData())?has_content>
382 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Colaboramos con</dt>
383 <dd class="txt-uppercase"><span class="estado-neutro">${Colaborador.getData()}</span></dd>
384 </#if>
385
386 <!-- Cupo -->
387 <#if (Cupo.getData())?? && (Cupo.getData())?has_content>
388 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cupo</dt>
389 <dd class="txt-uppercase">${Cupo.getData()}</dd>
390 </#if>
391
392 <!-- Organizador -->
393 <#if (Organizador.getData())?? && (Organizador.getData())?has_content>
394 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Organizamos con</dt>
395 <dd class="txt-uppercase">${Organizador.getData()}</dd>
396 </#if>
397
398 <!-- Cierre de inscripciones -->
399 <#assign CierreDeInscripciones_Data = getterUtil.getString(CierreDeInscripciones.getData())>
400 <#if validator.isNotNull(CierreDeInscripciones_Data)>
401 <#assign CierreDeInscripciones_DateObj = dateUtil.parseDate("yyyy-MM-dd", CierreDeInscripciones_Data, locale)>
402 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cierre de inscripciones</dt>
403 <dd class="txt-uppercase">${dateUtil.getDate(CierreDeInscripciones_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
404 </#if>
405
406 <!-- Publicacion de admision -->
407 <#assign PublicacionDeAdmision_Data = getterUtil.getString(PublicacionDeAdmision.getData())>
408 <#if validator.isNotNull(PublicacionDeAdmision_Data)>
409 <#assign PublicacionDeAdmision_DateObj = dateUtil.parseDate("yyyy-MM-dd", PublicacionDeAdmision_Data, locale)>
410 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Publicacion de Admision</dt>
411 <dd class="txt-uppercase">${dateUtil.getDate(PublicacionDeAdmision_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
412 </#if>
413
414 <div id="redes-sociales-share-container" class="mt-4">
415 <@compartirRedesSocialesImprimir text=titulo />
416 </div>
417 </dl>
418 </div>
419 </div>
420
421 <!---------------------------------------->
422 <!-- Pinta los contenidos relacionados -->
423 <!---------------------------------------->
424 <#if assetLinks?? && assetLinks?has_content>
425 <h2 class="mt-3">Contenido relacionado</h2>
426 <div class=" mt-5 cont-convo"> <!--fd-gris-fondo py-50 py-lg-100-->
427 <div class="container px-3 px-lg-0">
428 <div class="content-cards cols-items-4">
429 <#list assetLinks as assetLink>
430 <#-- Obtenemos el AssetEntry relacionado (el "to" de la relación) -->
431 <#assign relatedAssetEntry = assetEntryLocalService.getEntry(assetLink.getEntryId2())>
432
433 <#-- Obtenemos el JournalArticle si el contenido relacionado también es un WebContent -->
434 <#if relatedAssetEntry.getClassName() == "com.liferay.journal.model.JournalArticle">
435 <#assign journalArticle = journalArticleLocalService.getLatestArticle(relatedAssetEntry.getClassPK())>
436
437 <!----------------------------->
438 <!-- Para obtener el ViewURL -->
439 <!----------------------------->
440 <#setting url_escaping_charset='UTF-8'>
441 <#assign viewURLWithRedirect = "">
442 <#assign assetRenderer = relatedAssetEntry.getAssetRenderer()>
443 <#if themeDisplay??>
444 <#assign viewURL = assetRenderer.getURLViewInContext(themeDisplay, null)>
445 <#assign redirectURL = themeDisplay.getURLCurrent()>
446 <#assign viewURLWithRedirect = viewURL + (viewURL?contains("?")?then("&", "?")) + "redirect=" + redirectURL?url>
447 <#--<a href="${viewURLWithRedirect}">${assetRenderer.getTitle(locale)}</a>-->
448 <#-- <#else>
449 <span>${assetRenderer.getTitle(locale)}</span>-->
450 </#if>
451
452 <!-- Obtener los campos necesarios para pintar los campos del contenido relacionado -->
453 <#assign document = saxReaderUtil.read(journalArticle.getContentByLocale(locale))>
454 <#assign rootElement = document.getRootElement()>
455 <#assign dynamicElements = rootElement.elements("dynamic-element")>
456
457 <#list dynamicElements as element>
458 <!--<p class="sr-only"> entra ${element.attributeValue("name")}</p>-->
459 <#if element.attributeValue("name") == "Image46184462">
460 <#assign imgGS = element.element("dynamic-content").getText()>
461 <#if imgGS?? && imgGS != "" && imgGS?trim != "{}">
462 <#assign imgUuidGS = imgGS?eval.uuid!"" />
463 </#if>
464 <#if imgUuidGS?has_content>
465 <#assign imgNameGS = imgGS?eval.title />
466 <#assign imgGroupIdGS = imgGS?eval.groupId />
467 <#assign imgAltGS = imgGS?eval.alt/>
468 </#if>
469 </#if>
470
471 <#if element.attributeValue("name") == "Date80828384">
472 <#assign fechaIni = element.element("dynamic-content").getText()>
473 </#if>
474
475 <#if element.attributeValue("name") == "Date51740027">
476 <#assign fechaFin = element.element("dynamic-content").getText()>
477 </#if>
478 </#list>
479 <div class="mb-4 mb-xl-0 cardReco d-flex flex-column justify-content-between parentAssetViewUrl Caja-bordeada-gris">
480 <div class="h-100 d-flex flex-column gap-1r position-relative">
481 <div class="p-0">
482 <#if imgUuidGS?has_content>
483 <div class="card-reco-img-container">
484 <img class="w-100" alt="${imgAltGS}" src="/documents/${imgGroupIdGS}/0/${imgNameGS}/${imgUuidGS}" />
485 </div>
486 <#else>
487 <div class="card-reco-img-container">
488 <img class="w-100" alt="Logo de Cooperacion Española" src="/documents/d/${themeDisplay.getScopeGroup().getFriendlyURL()}/generica" />
489 </div>
490 </#if>
491 </div>
492 <div class="fecha-rango mt-2">
493 <#assign startDate_Data = getterUtil.getString(fechaIni)>
494 <#assign endDate_Data = getterUtil.getString(fechaFin)>
495 <#if startDate_Data?? && endDate_Data??>
496 <#assign startDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", startDate_Data, locale)>
497 <#assign endDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", endDate_Data, locale)>
498 <#if startDate_Data == endDate_Data>
499 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)}
500 <#else>
501 Desde ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)} hasta ${dateUtil.getDate(endDate_DateObj, "dd MMMM yyyy", locale)}
502 </#if>
503 </#if>
504 </div>
505 <div class="card-text-cont">
506 <a class="title elipsis-3 enlace-total" href="${viewURLWithRedirect}" title="Ir a la recomendacion ${journalArticle.getTitle(locale)}"> ${journalArticle.getTitle(locale)}</a>
507 </div>
508 </div>
509 <div class="d-flex gap-1r flex-wrap">
510 <#-- Obtener el AssetEntry del contenido relacionado -->
511 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) />
512
513 <#-- Obtener las categorías -->
514 <#assign categoryIds = assetEntry.getCategoryIds() />
515 <#assign categories = [] />
516 <#list categoryIds as categoryId>
517 <#assign category = assetCategoryLocalService.fetchAssetCategory(categoryId) />
518 <#if category?? && category.getVocabularyId() == vocabularyId>
519 <#assign categories += [category] />
520 </#if>
521 </#list>
522
523 <#if categories?has_content>
524 <#list categories as category>
525
526 <#assign cat = category.getName() />
527
528 <#assign portalURL = themeDisplay.portalURL>
529 <#assign currentPageName = themeDisplay.layout.name>
530 <#assign siteFriendlyURL = themeDisplay.getScopeGroup().getFriendlyURL()>
531 <#assign siteName = siteFriendlyURL?substring(1)>
532 <#assign URLCategoria = portalURL + "/web/" + siteName + "/detalle-categorias/-/categories/" + category.getCategoryId()>
533
534 <#switch cat>
535 <#case "Accesibilidad / Inclusión">
536 <a class="cat-reco Accesibilidad" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
537 <#break>
538 <#case "Artes Visuales">
539 <a class="cat-reco Artes" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
540 <#break>
541 <#case "Ciencia / Tecnología">
542 <a class="cat-reco Ciencia" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
543 <#break>
544 <#case "Cine / Audiovisual">
545 <a class="cat-reco Cine" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
546 <#break>
547 <#case "Ciudadanía / Comunidad">
548 <a class="cat-reco Ciudadania" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
549 <#break>
550 <#case "Cultura para el Desarrollo">
551 <a class="cat-reco Cultura" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
552 <#break>
553 <#case "Debate / Pensamiento">
554 <a class="cat-reco Debate" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
555 <#break>
556 <#case "Diversidad / Géneros">
557 <a class="cat-reco Diversidad" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
558 <#break>
559 <#case "Escénicas">
560 <a class="cat-reco Escenicas" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
561 <#break>
562 <#case "Exámenes de español">
563 <a class="cat-reco Examenes" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
564 <#break>
565 <#case "Exposiciones">
566 <a class="cat-reco Exposiciones" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
567 <#break>
568 <#case "Formación">
569 <a class="cat-reco Formacion" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
570 <#break>
571 <#case "Infantil / Juvenil">
572 <a class="cat-reco Infantil" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
573 <#break>
574 <#case "Letras">
575 <a class="cat-reco Letras" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
576 <#break>
577 <#case "Mediación">
578 <a class="cat-reco Mediacion" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
579 <#break>
580 <#case "Medioambiente / Sostenibilidad">
581 <a class="cat-reco Medioambiente" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
582 <#break>
583 <#case "Música / Sonido">
584 <a class="cat-reco Musica" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
585 <#break>
586 <#case "Patrimonio">
587 <a class="cat-reco Patrimonio" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
588 <#break>
589 <#case "Radio / Pódcast">
590 <a class="cat-reco Radio" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
591 <#break>
592
593 <#default>
594 <a class="cat-reco cat-neg" href="${URLCategoria}" title="Filtar Por ${cat}">${cat}</a>
595 <#break>
596 </#switch>
597 </#list>
598 </#if>
599 </div>
600 </div>
601 </#if>
602 </#list>
603 </div>
604 </div>
605 </div>
606 </#if>
607</div>
608
609<#macro compartirRedesSocialesImprimir url=URLCompleteNoParams text="" twitter=true facebook=true>
610
611 <#local urlEncoded = urlCodec.encodeURL(url) />
612
613 <#local textF= text />
614 <#if text?has_content >
615 <#local textF= htmlParserUtil.extractText(text)?trim />
616 </#if>
617
618 <!-- TWITTER -->
619 <#if twitter>
620 <#local twitterShareURL = "https://x.com/intent/tweet?url=" + urlEncoded />
621 <#if textF?has_content >
622 <#local textTwitter = textF?truncate(280, '...') />
623 <#local textTwitter = urlCodec.encodeURL(textTwitter) />
624 <#local twitterShareURL = twitterShareURL + "&text=" + textTwitter + "%0a%0a" />
625 </#if>
626 <#local twitterShareURL = twitterShareURL + "&via=" + twitterAccount />
627 </#if>
628 <#-- // -->
629
630 <#-- FACEBOOK -->
631 <#if facebook>
632 <#local facebookShareURL = "https://www.facebook.com/sharer/sharer.php?u=" + urlEncoded />
633 <#if textF?has_content >
634 <#local textFacebook = urlCodec.encodeURL(textF) />
635 <#local facebookShareURL = facebookShareURL + ""e=" + textFacebook />
636 </#if>
637 </#if>
638 <#-- // -->
639
640 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Compartir</dt>
641 <dd>
642 <#if facebookShareURL?has_content >
643 <a class="no-ico" href="${facebookShareURL}" target="_blank" title="Compartir en facebook">
644 <img alt="icono facebook" src="/o/aecid-oces-theme/images/ico-facebook.svg" /></a>
645 </#if>
646
647 <#if twitterShareURL?has_content >
648 <a class="ml-2 no-ico" href="${twitterShareURL}" target="_blank" title="Compartir en X">
649 <img alt="icono X" src="/o/aecid-oces-theme/images/ico-x.svg" /></a>
650 </#if>
651 </dd>
652</#macro>