Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> request.getParameter("articulo") [in template "20096#20122#8051391" at line 183, column 25] ---- 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 myParamValue = request.getPar... [in template "20096#20122#8051391" at line 183, column 1] ----
1<!--AECID-CC-Publicador-Detalle-Noticias-->
2
3<style>
4 /**********************/
5 /* Estilos de las OCE */
6 /**********************/
7
8 .aecid-detalle a {
9 color: var(--brand-color-1);
10 }
11
12 .aecid-detalle a:hover,
13 .aecid-detalle .share-option:hover {
14 opacity: .5;
15 }
16
17 .aecid-detalle h2 {
18 color: var(--brand-color-1);
19 margin-bottom: 20px;
20 font-size: 24px;
21 }
22
23 .separador {
24 color: #000;
25 }
26
27 .fecha {
28 font-weight: bold;
29 }
30
31 .categoria {
32 color: #6f6f6f;
33 font-size: 0.85em;
34 text-transform: uppercase;
35 }
36
37 .resumen {
38 color: #6f6f6f;
39 font-size: 0.9em;
40 }
41
42 .aecid-detalle iframe {
43 width: 100%;
44 height: 30em;
45 }
46
47 .contenido {
48 font-family: Arial;
49 }
50
51 .contenido img {
52 margin-left: 0 !important;
53 max-width: 100% !important;
54 height: auto;
55 }
56
57 .pieFoto {
58 font-size: 14px;
59 }
60
61 .botonRRSS {
62 display: inline-block;
63 color: #fff;
64 vertical-align: middle;
65 cursor: pointer;
66 -webkit-user-select: none;
67 -moz-user-select: none;
68 user-select: none;
69 background-color: transparent;
70 border: 1px solid transparent;
71 padding: 0.375rem 0.75rem;
72 border-radius: 0.25rem;
73 transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
74 }
75
76 .share-option {
77 background-color: transparent;
78 border: none;
79 padding: 0;
80 }
81
82 .facebook {
83 background-color: #3B5998;
84 }
85
86 .fb-xfbml-parse-ignore {
87 background-color: transparent;
88 border: none;
89 }
90
91 .fb-xfbml-parse-ignore:hover {
92 opacity: .5;
93 }
94
95 .twitter {
96 background-color: #1D9BF0;
97 }
98
99 .mainImg {
100 max-height: 21rem;
101 object-fit: cover;
102 width: auto;
103 max-width: 100%;
104 }
105
106 @media screen and (max-width: 576px) {
107 .aecid-noticia {
108 padding-left: 10px;
109 padding-right: 10px;
110 }
111 }
112
113 /*************************************/
114 /* Estilos de los Centros Culturales */
115 /*************************************/
116 .detalle-noticia img {
117 max-width: 100%;
118 }
119 .detalle-noticia h2 {
120 font-size: 2.167rem;
121 }
122 .estado {
123 -webkit-border-radius: 10px;
124 -moz-border-radius: 10px;
125 border-radius: 10px;
126 padding: .28rem .556rem;
127 display: block;
128 width: fit-content;
129 min-width: 7.4rem;
130 text-align: center;
131 }
132 .estado.neutro {
133 background-color: var(--gris-fondo);
134 }
135 .estado.verde {
136 background-color: #a4cb23;
137 color:#ffffff;
138 }
139 .estado.azul {
140 background-color: #4fc0fd;
141 color:#ffffff;
142 }
143 .estado.naranja {
144 background-color: #f39918;
145 color:#ffffff;
146 }
147 .estado.amarillo {
148 background-color: #feb71b;
149 color:#ffffff;
150 }
151 .estado.rojo {
152 background-color: #de0032;
153 color:#ffffff;
154 }
155 .estado.morado {
156 background-color: #540081;
157 color:#ffffff;
158 }
159
160 .estado.Accesibilidad {background-color: #09861e; color:#ffffff;}
161 .estado.Artes {background-color: #f5bce9; color:#ffffff;}
162 .estado.Ciencia {background-color: #034ea2; color:#ffffff;}
163 .estado.Cine {background-color: #540081; color:#ffffff;}
164 .estado.Ciudadania {background-color: #33b6ba; color:#ffffff;}
165 .estado.Cultura {background-color: #7d2721; color:#ffffff;}
166 .estado.Debate {background-color: #8f98dc; color:#ffffff;}
167 .estado.Diversidad {background-color: #ca09f1; color:#ffffff;}
168 .estado.Escenicas {background-color: #f5c109; color:#ffffff;}
169 .estado.Examenes {background-color: #ec0909; color:#ffffff;}
170 .estado.Exposiciones {background-color: #000000; color:#ffffff;}
171 .estado.Formacion {background-color: #e01451; color:#ffffff;}
172 .estado.Infantil {background-color: #a4cb22; color:#ffffff;}
173 .estado.Letras {background-color: #f39918; color:#ffffff;}
174 .estado.Mediacion {background-color: #e5de8a; color:#ffffff;}
175 .estado.Medioambiente {background-color: #3ec11a; color:#ffffff;}
176 .estado.Musica {background-color: #4fc0fd; color:#ffffff;}
177 .estado.Patrimonio {background-color: #d12929; color:#ffffff;}
178 .estado.Radio {background-color: #f462d4; color:#ffffff;}
179
180</style>
181
182
183<#assign myParamValue = request.getParameter("articulo")>
184<#assign grupostr = request.getParameter("sitio")>
185<#assign grupolong = grupostr?number >
186
187<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
188<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") />
189<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
190<#assign articleId = request.getParameter("articulo")>
191<#assign article = journalArticleLocalService.getArticle(grupolong, articleId)>
192<#assign articleResource = journalArticleResourceLocalService.getArticleResource(article.getResourcePrimKey())>
193<#assign articleResourcePK = articleResource.getPrimaryKey()>
194<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
195<#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")>
196<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", articleResourcePK) />
197<#assign assetEntryId = assetEntry.getEntryId() />
198<#assign groupLocalService = staticUtil["com.liferay.portal.kernel.service.GroupLocalServiceUtil"]>
199<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
200
201<!-- Funciones -->
202<#function getJournalArticleRootElement journal>
203 <#attempt>
204 <#if journal?has_content>
205 <#local journalLocaleContent = journal.getContentByLocale(locale.toString()) />
206 <#local journalContentXml = saxReaderUtil.read(journalLocaleContent) />
207 <#local rootElementContent = journalContentXml.getRootElement() />
208 <#if rootElementContent?? && rootElementContent?has_content>
209 <#return rootElementContent />
210 </#if>
211 </#if>
212 <#recover >
213 </#attempt>
214 <#return "" />
215</#function>
216
217<#function getXmlTextElement rootElementContent fieldReference>
218 <#attempt>
219 <#local xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='" + fieldReference + "']") />
220 <#local element = xPathSelector.selectSingleNode(rootElementContent) />
221 <#return element.getStringValue()?trim />
222 <#recover >
223 </#attempt>
224 <#return "" />
225</#function>
226
227<#function getXmlTextElement rootElementContent fieldReference>
228 <#attempt>
229 <#local xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='" + fieldReference + "']") />
230 <#local element = xPathSelector.selectSingleNode(rootElementContent) />
231 <#return element.getStringValue()?trim />
232 <#recover >
233 </#attempt>
234 <#return "" />
235</#function>
236
237<#function getJournalArticle resourcePrimKey>
238 <#attempt>
239 <#local journal = journalArticleLocalService.getLatestArticle(resourcePrimKey, 0) />
240 <#return journal />
241 <#recover >
242 </#attempt>
243 <#return "" />
244</#function>
245
246<#function getJournalArticleByJsonElement elementJson>
247 <#attempt>
248 <#local resourcePrimKey = elementJson.classPK?number />
249 <#local journal = getJournalArticle(resourcePrimKey) />
250 <#return journal />
251 <#recover >
252 </#attempt>
253 <#return "" />
254</#function>
255
256<#function obtenerCamposRepetidos documentRoot fieldReference >
257 <#return documentRoot.selectNodes("dynamic-element[@field-reference='" + fieldReference + "']")/>
258</#function>
259
260<#function getFriendlyUrlJournal journal>
261 <#return "/-/" + journal.getUrlTitle() />
262</#function>
263
264<#function removeUrlParams url>
265 <#if url?contains("?") >
266 <#return url?substring(0, url?index_of("?")) />
267 </#if>
268 <#return url/>
269</#function>
270
271<#macro fechaPublicacionJournal pattern="MMMM '|' dd '|' yyyy" upperCase=true>
272 <#local date = getJournalArticleDisplayDate(article) />
273 <#if date?has_content>
274 <#local dateFormat = formatDate(date, pattern) />
275 ${upperCase?then(dateFormat?upper_case, dateFormat)}
276 </#if>
277</#macro>
278
279<#function getJournalArticleDisplayDate articulo>
280 <#local journalArticleDisplayDateF = "">
281 <#attempt>
282 <#local journalArticleDisplayDate = articulo.getDisplayDate() />
283 <#if journalArticleDisplayDate?has_content>
284 <#local journalArticleDisplayDateF = journalArticleDisplayDate />
285 <#local date = dateUtil.parseDate("EEE, dd MMM yyyy HH:mm:ss Z", journalArticleDisplayDate, localeUtil.getDefault()) />
286 <#local journalArticleDisplayDateF = date />
287 </#if>
288 <#recover>
289 </#attempt>
290 <#return journalArticleDisplayDateF />
291</#function>
292
293<#function formatDate date datePattern="EEEE, dd MMMM yyyy HH:mm">
294 <#attempt>
295 <#local timeZoneMadrid = timeZoneUtil.getTimeZone("Europe/Madrid") />
296 <#local dateFormat = dateUtil.getDate(date, datePattern, locale, timeZoneMadrid) />
297 <#return dateFormat />
298 <#recover>
299 </#attempt>
300 <#return "" />
301</#function>
302
303<#assign currentURL=themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
304<#if (serviceLocator.findService("es.aecid.shorturl.service.AecidShortUrlService"))??>
305 <#assign shortUrlService=serviceLocator.findService("es.aecid.shorturl.service.AecidShortUrlService") />
306 <#assign currentShortURL=themeDisplay.getPortalURL() + '/' + shortUrlService.getShortUrl(currentURL, companyId, groupId, themeDisplay.getUserId()) />
307<#else>
308 <#assign currentShortURL=currentURL />
309</#if>
310
311
312<!-- Primero se comprueba que tipo de contenido, es decir, si el contenido es de un centro cultural o si viene de los centros de OCE -->
313<#assign site = groupLocalService.getGroup(grupolong)>
314<#assign NombreSite = site.getDescriptiveName(themeDisplay.getLocale())>
315<#assign NombreSite = NombreSite?split(" -")[0]>
316
317<!--<p> Nombre cortado ${NombreSite} </p>-->
318
319<!-- El id de las categorías de Categorias CC -->
320<!-- <#assign vocabularyId = 1682640 /> --> <!-- PRE -->
321<#assign vocabularyId = 7623391 /> <!-- PRO -->
322
323<!-- Se obtiene el id de la estructura del contenido -->
324
325<!------------------------------------->
326<!-- obtener los datos de los campos -->
327<!------------------------------------->
328<#if NombreSite == 'CCE'>
329 <#assign journalRootElementCC = getJournalArticleRootElement(article) />
330 <#assign URLPortal = themeDisplay.getURLPortal() />
331 <#assign URLCurrent = themeDisplay.getURLCurrent() />
332 <#assign URLComplete = URLPortal + URLCurrent />
333 <#assign URLCompleteNoParams = removeUrlParams(URLComplete) />
334 <#assign twitterAccount = "AECID-CC-Argentina" />
335<#else>
336 <#assign journalRootElement = getJournalArticleRootElement(article) />
337</#if>
338
339<#assign contenido = article.getContent() />
340
341
342<#if journalRootElementCC?has_content>
343 <#assign ImagenCC = getXmlTextElement(journalRootElementCC, "image") />
344 <#assign SubtituloCC = getXmlTextElement(journalRootElementCC, "Subtitulo") />
345 <#assign ContenidoCC = getXmlTextElement(journalRootElementCC, "mainText") />
346 <#assign LugarCC = getXmlTextElement(journalRootElementCC, "Lugar") />
347 <#assign CupoCC = getXmlTextElement(journalRootElementCC, "Cupo") />
348 <#assign FechaDesdeCC = getXmlTextElement(journalRootElementCC, "startDate") />
349 <#assign FechaHastaCC = getXmlTextElement(journalRootElementCC, "endDate") />
350 <#assign AdmisionCC = getXmlTextElement(journalRootElementCC, "PublicacionDeAdmision") />
351 <#assign CierreCC = getXmlTextElement(journalRootElementCC, "CierreDeInscripciones") />
352 <#assign HorarioCC = getXmlTextElement(journalRootElementCC, "schedule") />
353 <#assign ColaboradorCC = getXmlTextElement(journalRootElementCC, "Colaborador") />
354 <#assign OrganizadorCC = getXmlTextElement(journalRootElementCC, "Organizador") />
355 <#assign PosterCC = getXmlTextElement(journalRootElementCC, "Poster") />
356 <#assign VideoCC = getXmlTextElement(journalRootElementCC, "VideoMP4") />
357</#if>
358
359
360<#if journalRootElement?has_content>
361 <#assign video = getXmlTextElement(journalRootElement, "video") />
362 <#assign Resumen = getXmlTextElement(journalRootElement, "resumen") />
363 <#assign Imagen = getXmlTextElement(journalRootElement, "image") />
364 <#assign Contenido = getXmlTextElement(journalRootElement, "content") />
365</#if>
366
367<#assign redirectUrl = paramUtil.getString(request, "redirect", "") />
368<a class="back-button" href="${redirectUrl}">
369 <img src="${themeDisplay.getPathThemeImages()}/abajo.svg" alt="">
370 <span>Atrás</span>
371</a>
372
373
374<!-- Si el contenido que se va a visualizar es de un site de Centro Cultural se pintara de la siguiente forma-->
375<#if NombreSite == 'CCE'>
376
377 <!-------------------------------------------------------------------------->
378 <!--- Se visualiza el contenido con el diseño de los Centros Culturales ---->
379 <!-------------------------------------------------------------------------->
380
381 <div class="container px-3 px-lg-0 detalle-noticia">
382 <div class="col-2-1-d">
383 <div class="col-izq">
384 <h1 class="tit-h3 txt-bold txt-primario mb-4">${article.getTitle(locale)}</h1>
385
386 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
387 <#assign jsonObject = jsonFactory.createJSONObject(ImagenCC)>
388 <#assign urlImagen = jsonObject.getString("url")>
389 <#assign urlImagenAlt = jsonObject.getString("alt")>
390
391 <img class="rounded mb-3" alt="${urlImagenAlt}" src="${urlImagen}" />
392 <#if SubtituloCC??>
393 <h2 class="mt-2 tit-h3">${SubtituloCC}</h2>
394 </#if>
395
396 <#if ContenidoCC??>
397 <div class="col-content">
398 ${ContenidoCC}
399 </div>
400 </#if>
401
402 <!-- Visualiza el vídeo -->
403 <#if PosterCC?? && PosterCC?has_content>
404 <#if VideoCC?? && VideoCC?has_content>
405 <!-- Imagen -->
406 <#assign jsonObject = jsonFactory.createJSONObject(PosterCC)>
407 <#assign urlImagenPoster = jsonObject.getString("url")>
408 <#assign urlImagenAltPoster = jsonObject.getString("alt")>
409 <!-- Vídeo -->
410 <#-- 1. Limpiar barras invertidas dobles -->
411 <#assign VideoCC = VideoCC?replace('\\\\', '') />
412
413 <#-- 2. Extraer groupId -->
414 <#assign VideoGroupID = VideoCC?replace('.*"groupId"\\s*:\\s*"([^"]+)".*', '$1', 'r') />
415
416 <#-- 3. Extraer uuid -->
417 <#assign Videouuid = VideoCC?replace('.*"uuid"\\s*:\\s*"([^"]+)".*', '$1', 'r') />
418
419 <#-- 4. Construir URL del video -->
420 <#assign URLVideo = "/documents/${VideoGroupID}/${Videouuid}" />
421
422 <#-- 6. Reproducir video -->
423 <div class="embed-responsive embed-responsive-16by9 bdr-radius">
424 <video controls="" poster="${urlImagenPoster}">
425 <source src="${URLVideo}" type="video/mp4" />
426 Tu navegador no soporta la etiqueta de vídeo.
427 </video>
428 </div>
429 </#if>
430 </#if>
431
432 </div>
433 <div class="col-der">
434 <dl>
435 <!-- Categoria -->
436
437
438 <#assign categoryIds = assetEntry.getCategoryIds() />
439 <#assign categories = [] />
440 <#list categoryIds as categoryId>
441 <#assign category = assetCategoryLocalService.fetchAssetCategory(categoryId) />
442 <#if category?? && category.getVocabularyId() == vocabularyId>
443 <#assign categories += [category] />
444 </#if>
445 </#list>
446
447 <#if categories?? && categories?has_content>
448 <dt class="tit-h5 txt-uppercase txt-medi mb-2">categoria</dt>
449 <#list categories as category>
450 <#assign categoriaFiltrada = category.getName() />
451 <!--<p>categoria - ${categoriaFiltrada}</p>-->
452
453 <#switch categoriaFiltrada>
454 <#case "Accesibilidad / Inclusión">
455 <dd class="txt-uppercase"><span class="estado Accesibilidad">${categoriaFiltrada}</span></dd>
456 <#break>
457 <#case "Artes Visuales">
458 <dd class="txt-uppercase"><span class="estado Artes">${categoriaFiltrada}</span></dd>
459 <#break>
460 <#case "Ciencia / Tecnología">
461 <dd class="txt-uppercase"><span class="estado Ciencia">${categoriaFiltrada}</span></dd>
462 <#break>
463 <#case "Cine / Audiovisual">
464 <dd class="txt-uppercase"><span class="estado Cine">${categoriaFiltrada}</span></dd>
465 <#break>
466 <#case "Ciudadanía / Comunidad">
467 <dd class="txt-uppercase"><span class="estado Ciudadania">${categoriaFiltrada}</span></dd>
468 <#break>
469 <#case "Cultura para el Desarrollo">
470 <dd class="txt-uppercase"><span class="estado Cultura">${categoriaFiltrada}</span></dd>
471 <#break>
472 <#case "Debate / Pensamiento">
473 <dd class="txt-uppercase"><span class="estado Debate">${categoriaFiltrada}</span></dd>
474 <#break>
475 <#case "Diversidad / Géneros">
476 <dd class="txt-uppercase"><span class="estado Diversidad">${categoriaFiltrada}</span></dd>
477 <#break>
478 <#case "Escénicas">
479 <dd class="txt-uppercase"><span class="estado Escenicas">${categoriaFiltrada}</span></dd>
480 <#break>
481 <#case "Exámenes de español">
482 <dd class="txt-uppercase"><span class="estado Examenes">${categoriaFiltrada}</span></dd>
483 <#break>
484 <#case "Exposiciones">
485 <dd class="txt-uppercase"><span class="estado Exposiciones">${categoriaFiltrada}</span></dd>
486 <#break>
487 <#case "Formación">
488 <dd class="txt-uppercase"><span class="estado Formacion">${categoriaFiltrada}</span></dd>
489 <#break>
490 <#case "Infantil / Juvenil">
491 <dd class="txt-uppercase"><span class="estado Infantil">${categoriaFiltrada}</span></dd>
492 <#break>
493 <#case "Letras">
494 <dd class="txt-uppercase"><span class="estado Letras">${categoriaFiltrada}</span></dd>
495 <#break>
496 <#case "Mediación">
497 <dd class="txt-uppercase"><span class="estado Mediacion">${categoriaFiltrada}</span></dd>
498 <#break>
499 <#case "Medioambiente / Sostenibilidad">
500 <dd class="txt-uppercase"><span class="estado Medioambiente">${categoriaFiltrada}</span></dd>
501 <#break>
502 <#case "Música / Sonido">
503 <dd class="txt-uppercase"><span class="estado Musica">${categoriaFiltrada}</span></dd>
504 <#break>
505 <#case "Patrimonio">
506 <dd class="txt-uppercase"><span class="estado Patrimonio">${categoriaFiltrada}</span></dd>
507 <#break>
508 <#case "Radio / Pódcast">
509 <dd class="txt-uppercase"><span class="estado Radio">${categoriaFiltrada}</span></dd>
510 <#break>
511 <#default>
512 <dd class="txt-uppercase"><span class="estado neutro">${categoriaFiltrada}</span></dd>
513 <#break>
514 </#switch>
515 </#list>
516 </#if>
517
518 <!-- Fecha desde/hasta -->
519 <#assign startDate_Data = getterUtil.getString(FechaDesdeCC)>
520 <#assign endDate_Data = getterUtil.getString(FechaHastaCC)>
521 <#if startDate_Data?? && endDate_Data??>
522 <#assign startDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", startDate_Data, locale)>
523 <#assign endDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", endDate_Data, locale)>
524 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Fecha</dt>
525 <dd class="txt-uppercase">
526 <#if startDate_Data == endDate_Data>
527 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)}
528 <#else>
529 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)} - ${dateUtil.getDate(endDate_DateObj, "MMMM yyyy", locale)}
530 </#if>
531 </dd>
532 </#if>
533
534 <!-- Campo horario -->
535 <#if (schedule.getData())?? && (schedule.getData())?has_content>
536 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Horario</dt>
537 <dd class="txt-uppercase"><span class="estado-neutro">${schedule.getData()}</span></dd>
538 </#if>
539
540 <!-- Lugar -->
541 <#if LugarCC?? && LugarCC?has_content>
542 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Lugar</dt>
543 <#switch LugarCC>
544 <#case "Opción94049536">
545 <dd class="txt-uppercase"><span class="estado neutro">Presencial</span></dd>
546 <#break>
547 <#case "Opción97760043">
548 <dd class="txt-uppercase"><span class="estado neutro">Online</span></dd>
549 <#break>
550 <#case "Opción36010935">
551 <dd class="txt-uppercase"><span class="estado neutro">Fuera del Centro</span></dd>
552 <#break>
553 </#switch>
554 </#if>
555
556 <!-- Colaborador -->
557 <#if ColaboradorCC?? && ColaboradorCC?has_content>
558 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Colaborador</dt>
559 <dd class="txt-uppercase"><span class="estado-neutro">${ColaboradorCC}</span></dd>
560 </#if>
561
562 <!-- Cupo -->
563 <#if CupoCC?? && CupoCC?has_content>
564 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cupo</dt>
565 <dd class="txt-uppercase">${CupoCC}</dd>
566 </#if>
567
568 <!-- Organizador -->
569 <#if OrganizadorCC?? && OrganizadorCC?has_content>
570 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Organizador</dt>
571 <dd class="txt-uppercase">${OrganizadorCC}</dd>
572 </#if>
573
574 <!-- Cierre de inscripciones -->
575 <#assign CierreDeInscripciones_Data = getterUtil.getString(CierreCC)?trim>
576 <#if CierreDeInscripciones_Data?has_content>
577 <#-- Intenta parsear solo si el valor tiene contenido y está en el formato correcto -->
578 <#assign CierreDeInscripciones_DateObj = dateUtil.parseDate("yyyy-MM-dd", CierreDeInscripciones_Data, locale)>
579 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cierre de inscripciones</dt>
580 <dd class="txt-uppercase">${dateUtil.getDate(CierreDeInscripciones_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
581 </#if>
582
583 <!-- Publicacion de admision -->
584 <#assign PublicacionDeAdmision_Data = getterUtil.getString(AdmisionCC)>
585 <#if validator.isNotNull(PublicacionDeAdmision_Data)>
586 <#assign PublicacionDeAdmision_DateObj = dateUtil.parseDate("yyyy-MM-dd", PublicacionDeAdmision_Data, locale)>
587 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Publicacion de Admision</dt>
588 <dd class="txt-uppercase">${dateUtil.getDate(PublicacionDeAdmision_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
589 </#if>
590 </dl>
591 </div>
592 </div>
593 </div>
594
595<#else>
596 <div id="aecid-detalle-noticia" class="container p-0 aecid-detalle mt-5 mb-5">
597 <div class="row aecid-noticia px-3 px-md-0">
598 <!----------------------------------------------------------->
599 <!--- Se visualiza el contenido con el diseño de las OCE ---->
600 <!----------------------------------------------------------->
601 <div class="col-lg-6 col-12 row px-0">
602 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
603 <#assign jsonObject = jsonFactory.createJSONObject(Imagen)>
604 <#assign urlImagen = jsonObject.getString("url")>
605 <#assign urlImagenAlt = jsonObject.getString("alt")>
606
607 <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria">
608 <#if (video?has_content)>
609 <div class="col-12 p-0">
610 <div class="row justify-content-center">
611 <div class="col-12 p-0">
612 <#if video?contains("www.youtube.com/embed/")>
613 <iframe
614 title="Reproductor de vídeo YouTube" src="${video}" frameborder="0"
615 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
616 allowfullscreen>
617 </iframe>
618
619 <#elseif video?contains("www.youtube.com/") && video?split("/")?size gte 2>
620 <iframe title="Reproductor de vídeo YouTube"
621 src="https://www.youtube.com/embed/${video?split("/")[3]}"
622 frameborder="0"
623 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
624 allowfullscreen>
625 </iframe>
626
627 <#elseif video?contains("youtu.be")>
628 <a href="${friendlyURLs[themeDisplay.getLanguageId()]!""}" title="${languageUtil.get(locale, "lleva.a.pagina")} ${article.getTitle(locale)?truncate(100, '...')}">
629 <iframe tabindex="0" height="210px" title="Reproductor de vídeo YouTube"
630 src="https://www.youtube.com/embed/${video?split("/")[3]}?showinfo=0"
631 frameborder="0"
632 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
633 allowfullscreen>
634 </iframe>
635 </a>
636
637 <#elseif video?contains("vimeo") && video?split("/")?size gte 2>
638 <iframe title="Reproductor de vídeo Vimeo"
639 src="https://player.vimeo.com/video/${video?split("/")[3]}?"
640 frameborder="0" allow="autoplay; fullscreen; picture-in-picture"
641 allowfullscreen>
642 </iframe>
643 </#if> <!-- Asegura que este cierre esté presente -->
644 </div>
645 </div>
646 </div>
647 <#else>
648 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
649 <#assign jsonObject = jsonFactory.createJSONObject(Imagen)>
650 <#assign urlImagen = jsonObject.getString("url")>
651 <#assign urlImagenAlt = jsonObject.getString("alt")>
652 <div class="col-12 p-0">
653 <#if urlImagen?has_content>
654 <img alt="${urlImagenAlt}" src="${urlImagen}" class="mainImg w-100" />
655 <p class="pieFoto"><em tabindex="0"><span class="sr-only">${languageUtil.get(locale, "pie.de.foto")}: </span>
656 ${urlImagenAlt}
657 </em></p>
658 <#assign ImagenRedes = jsonObject.getString("url")>
659 <#else>
660 <img alt="Logo de AECID" src="/documents/d/global/noticias-convocatoria" class="mainImg w-100" />
661 <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria">
662 </#if>
663 </div>
664 </#if>
665 </div>
666 <div class="col-lg-6 col-12 pl-lg-5 px-0 flex-column justify-content-center">
667 <div class="p-0">
668 <h2 tabindex="0">${article.getTitle(locale)}</h2>
669 </div>
670 <div class="p-0">
671 <p class="fecha" tabindex="0"><@fechaPublicacionJournal pattern="dd/MM/yyyy - HH:mm" upperCase=false/></p>
672 </div>
673 <div class="p-0">
674 <p tabindex="0"><span class="sr-only">${languageUtil.get(locale, "categorias.de.la.noticia")}</span>
675 <span class="categoria">
676 <#if categories?has_content>
677 <#list categories as category>
678 <#assign
679 numIdCategoria=category.getTreePath()?substring(category.getTreePath()?last_index_of("/")
680 - 5 , category.getTreePath()?length - 1) />
681 <span>${category.getName()}</span>
682 <span class="separador">
683 ${category?has_next?then(' | ', '')}
684 </span>
685 </#list>
686 </#if>
687 </span>
688 </p>
689 </div>
690 <div class="p-0">
691 <p class="resumen" tabindex="0"><span class="sr-only"> ${languageUtil.get(locale, "resumen.de.la.noticia")} </span>
692 <#if Resumen??>
693 ${Resumen}
694 </#if>
695 </p>
696 </div>
697 </div>
698
699 <div class="col-12 p-0">
700 <hr />
701 </div>
702 <div class="col-lg-10 col-12 p-0 ">
703 <div class="contenido" tabindex="0"><span class="sr-only">${languageUtil.get(locale, "contenido.de.la.noticia")} </span>
704 <#if Contenido??>
705 ${Contenido}
706 </#if>
707 </div>
708 </div>
709
710 <div class="col-2 d-lg-block d-none"></div>
711 <@liferay_util["html-top"]
712 outputKey="htmltop">
713 <!-- METAS RRSS -->
714 <meta property="og:url" content="${currentShortURL}" />
715 <meta property="og:site_name" content="SiteName" />
716 <meta property="og:type" content="website" />
717 <meta property="og:locale" content="gl_ES" />
718 <meta property="og:locale:alternate" content="gl_ES" />
719 <meta name="twitter:card" content="summary_large_image" />
720 <meta property="og:title" content="${article.getTitle(locale)}" />
721 <meta name="twitter:title" content="${article.getTitle(locale)}" />
722
723 <#if Resumen != "">
724 <meta property="og:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" />
725 <meta name="twitter:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" />
726 <#else>
727 <meta property="og:description" content="${article.getTitle(locale)}" />
728 <meta name="twitter:description" content="${article.getTitle(locale)}" />
729 </#if>
730
731 <meta property="og:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
732 <meta property="og:image:secure_url" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
733 <meta name="twitter:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
734 <meta property="og:image:alt" content="Alt img og" />
735 <meta property="fb:app_id" content="???">
736 <meta property="fb:admins" content="https://www.facebook.com/Aecid.es">
737 <meta name="twitter:domain" content="${currentShortURL}" />
738 <meta name="twitter:site" content="@AECID_es" />
739 </@>
740 <div class="row col-12 p-0">
741 <!-- button visible facebook -->
742 <div class="col-flex mr-2">
743 <button class="fb-xfbml-parse-ignore" onClick="shareFacebook();" target="_blank" class="share-option"
744 index-social-media-list="0">
745 <div class="botonRRSS facebook">
746 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
747 class="bi bi-facebook" viewBox="0 0 16 16">
748 <path
749 d="M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z" />
750 </svg>
751 </div>
752 </button>
753 </div>
754 <!-- button visible twitter -->
755 <div class="col-flex mr-2">
756 <a href="https://twitter.com/intent/tweet?text=Mira esta noticia: ${article.getTitle(locale)} ${currentShortURL}"
757 class="twitter-share share-option no-ico" target="_blank" index-social-media-list="1">
758 <div class="botonRRSS twitter">
759 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
760 class="bi bi-twitter" viewBox="0 0 16 16">
761 <path
762 d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z" />
763 </svg>
764 </div>
765 </a>
766 </div>
767 </div>
768 </div>
769 </div>
770</#if>
771
772<#macro compartirRedesSocialesImprimir url=URLCompleteNoParams text="" twitter=true facebook=true>
773
774 <#local urlEncoded = urlCodec.encodeURL(url) />
775
776 <#local textF= text />
777 <#if text?has_content >
778 <#local textF= htmlParserUtil.extractText(text)?trim />
779 </#if>
780
781 <!-- TWITTER -->
782 <#if twitter>
783 <#local twitterShareURL = "https://x.com/intent/tweet?url=" + urlEncoded />
784 <#if textF?has_content >
785 <#local textTwitter = textF?truncate(280, '...') />
786 <#local textTwitter = urlCodec.encodeURL(textTwitter) />
787 <#local twitterShareURL = twitterShareURL + "&text=" + textTwitter + "%0a%0a" />
788 </#if>
789 <#local twitterShareURL = twitterShareURL + "&via=" + twitterAccount />
790 </#if>
791 <#-- // -->
792
793 <#-- FACEBOOK -->
794 <#if facebook>
795 <#local facebookShareURL = "https://www.facebook.com/sharer/sharer.php?u=" + urlEncoded />
796 <#if textF?has_content >
797 <#local textFacebook = urlCodec.encodeURL(textF) />
798 <#local facebookShareURL = facebookShareURL + ""e=" + textFacebook />
799 </#if>
800 </#if>
801 <#-- // -->
802
803 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Compartir</dt>
804 <dd>
805 <#if facebookShareURL?has_content >
806 <a class="no-ico" href="${facebookShareURL}" target="_blank" title="Compartir en facebook">
807 <img alt="icono facebook" src="/o/aecid-oces-theme/images/ico-facebook.svg" /></a>
808 </#if>
809
810 <#if twitterShareURL?has_content >
811 <a class="ml-2 no-ico" href="${twitterShareURL}" target="_blank" title="Compartir en X">
812 <img alt="icono X" src="/o/aecid-oces-theme/images/ico-x.svg" /></a>
813 </#if>
814 </dd>
815</#macro>