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<!-- <p>nombre del site sin tocar ${NombreSite} </p>-->
316<#assign NombreSite = NombreSite?replace(" ", "")>
317<#assign NombreSite = NombreSite?split("-")[0]>
318
319<!--<p> Nombre cortado ${NombreSite} </p>-->
320
321<!-- El id de las categorías de Categorias CC -->
322<!-- <#assign vocabularyId = 1682640 /> --> <!-- PRE -->
323<#assign vocabularyId = 7623391 /> <!-- PRO -->
324
325<!-- Se obtiene el id de la estructura del contenido -->
326
327<!------------------------------------->
328<!-- obtener los datos de los campos -->
329<!------------------------------------->
330<#if NombreSite == 'CCE'>
331 <#assign journalRootElementCC = getJournalArticleRootElement(article) />
332 <#assign URLPortal = themeDisplay.getURLPortal() />
333 <#assign URLCurrent = themeDisplay.getURLCurrent() />
334 <#assign URLComplete = URLPortal + URLCurrent />
335 <#assign URLCompleteNoParams = removeUrlParams(URLComplete) />
336 <#assign twitterAccount = "AECID-CC-Argentina" />
337<#else>
338 <#assign journalRootElement = getJournalArticleRootElement(article) />
339</#if>
340
341<#assign contenido = article.getContent() />
342
343
344<#if journalRootElementCC?has_content>
345 <#assign ImagenCC = getXmlTextElement(journalRootElementCC, "image") />
346 <#assign SubtituloCC = getXmlTextElement(journalRootElementCC, "Subtitulo") />
347 <#assign ContenidoCC = getXmlTextElement(journalRootElementCC, "mainText") />
348 <#assign LugarCC = getXmlTextElement(journalRootElementCC, "Lugar") />
349 <#assign CupoCC = getXmlTextElement(journalRootElementCC, "Cupo") />
350 <#assign FechaDesdeCC = getXmlTextElement(journalRootElementCC, "startDate") />
351 <#assign FechaHastaCC = getXmlTextElement(journalRootElementCC, "endDate") />
352 <#assign AdmisionCC = getXmlTextElement(journalRootElementCC, "PublicacionDeAdmision") />
353 <#assign CierreCC = getXmlTextElement(journalRootElementCC, "CierreDeInscripciones") />
354 <#assign HorarioCC = getXmlTextElement(journalRootElementCC, "schedule") />
355 <#assign ColaboradorCC = getXmlTextElement(journalRootElementCC, "Colaborador") />
356 <#assign OrganizadorCC = getXmlTextElement(journalRootElementCC, "Organizador") />
357 <#assign PosterCC = getXmlTextElement(journalRootElementCC, "Poster") />
358 <#assign VideoCC = getXmlTextElement(journalRootElementCC, "VideoMP4") />
359</#if>
360
361
362<#if journalRootElement?has_content>
363 <#assign video = getXmlTextElement(journalRootElement, "video") />
364 <#assign Resumen = getXmlTextElement(journalRootElement, "resumen") />
365 <#assign Imagen = getXmlTextElement(journalRootElement, "image") />
366 <#assign Contenido = getXmlTextElement(journalRootElement, "content") />
367</#if>
368
369<#assign redirectUrl = paramUtil.getString(request, "redirect", "") />
370<a class="back-button" href="${redirectUrl}">
371 <img src="${themeDisplay.getPathThemeImages()}/abajo.svg" alt="">
372 <span>Atrás</span>
373</a>
374
375
376<!-- Si el contenido que se va a visualizar es de un site de Centro Cultural se pintara de la siguiente forma-->
377<#if NombreSite == 'CCE'>
378 <!-------------------------------------------------------------------------->
379 <!--- Se visualiza el contenido con el diseño de los Centros Culturales ---->
380 <!-------------------------------------------------------------------------->
381
382 <div class="container px-3 px-lg-0 detalle-noticia">
383 <div class="col-2-1-d">
384 <div class="col-izq">
385 <h1 class="tit-h3 txt-bold txt-primario mb-4">${article.getTitle(locale)}</h1>
386
387 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
388 <#assign jsonObject = jsonFactory.createJSONObject(ImagenCC)>
389 <#assign urlImagen = jsonObject.getString("url")>
390 <#assign urlImagenAlt = jsonObject.getString("alt")>
391
392 <img class="rounded mb-3" alt="${urlImagenAlt}" src="${urlImagen}" />
393 <#if SubtituloCC??>
394 <h2 class="mt-2 tit-h3">${SubtituloCC}</h2>
395 </#if>
396
397 <#if ContenidoCC??>
398 <div class="col-content">
399 ${ContenidoCC}
400 </div>
401 </#if>
402
403 <!-- Visualiza el vídeo -->
404 <#if PosterCC?? && PosterCC?has_content>
405 <#if VideoCC?? && VideoCC?has_content>
406 <!-- Imagen -->
407 <#assign jsonObject = jsonFactory.createJSONObject(PosterCC)>
408 <#assign urlImagenPoster = jsonObject.getString("url")>
409 <#assign urlImagenAltPoster = jsonObject.getString("alt")>
410 <!-- Vídeo -->
411 <#-- 1. Limpiar barras invertidas dobles -->
412 <#assign VideoCC = VideoCC?replace('\\\\', '') />
413
414 <#-- 2. Extraer groupId -->
415 <#assign VideoGroupID = VideoCC?replace('.*"groupId"\\s*:\\s*"([^"]+)".*', '$1', 'r') />
416
417 <#-- 3. Extraer uuid -->
418 <#assign Videouuid = VideoCC?replace('.*"uuid"\\s*:\\s*"([^"]+)".*', '$1', 'r') />
419
420 <#-- 4. Construir URL del video -->
421 <#assign URLVideo = "/documents/${VideoGroupID}/${Videouuid}" />
422
423 <#-- 6. Reproducir video -->
424 <div class="embed-responsive embed-responsive-16by9 bdr-radius">
425 <video controls="" poster="${urlImagenPoster}">
426 <source src="${URLVideo}" type="video/mp4" />
427 Tu navegador no soporta la etiqueta de vídeo.
428 </video>
429 </div>
430 </#if>
431 </#if>
432
433 </div>
434 <div class="col-der">
435 <dl>
436 <!-- Categoria -->
437
438
439 <#assign categoryIds = assetEntry.getCategoryIds() />
440 <#assign categories = [] />
441 <#list categoryIds as categoryId>
442 <#assign category = assetCategoryLocalService.fetchAssetCategory(categoryId) />
443 <#if category?? && category.getVocabularyId() == vocabularyId>
444 <#assign categories += [category] />
445 </#if>
446 </#list>
447
448 <#if categories?? && categories?has_content>
449 <dt class="tit-h5 txt-uppercase txt-medi mb-2">categoria</dt>
450 <#list categories as category>
451 <#assign categoriaFiltrada = category.getName() />
452 <!--<p>categoria - ${categoriaFiltrada}</p>-->
453
454 <#switch categoriaFiltrada>
455 <#case "Accesibilidad / Inclusión">
456 <dd class="txt-uppercase"><span class="estado Accesibilidad">${categoriaFiltrada}</span></dd>
457 <#break>
458 <#case "Artes Visuales">
459 <dd class="txt-uppercase"><span class="estado Artes">${categoriaFiltrada}</span></dd>
460 <#break>
461 <#case "Ciencia / Tecnología">
462 <dd class="txt-uppercase"><span class="estado Ciencia">${categoriaFiltrada}</span></dd>
463 <#break>
464 <#case "Cine / Audiovisual">
465 <dd class="txt-uppercase"><span class="estado Cine">${categoriaFiltrada}</span></dd>
466 <#break>
467 <#case "Ciudadanía / Comunidad">
468 <dd class="txt-uppercase"><span class="estado Ciudadania">${categoriaFiltrada}</span></dd>
469 <#break>
470 <#case "Cultura para el Desarrollo">
471 <dd class="txt-uppercase"><span class="estado Cultura">${categoriaFiltrada}</span></dd>
472 <#break>
473 <#case "Debate / Pensamiento">
474 <dd class="txt-uppercase"><span class="estado Debate">${categoriaFiltrada}</span></dd>
475 <#break>
476 <#case "Diversidad / Géneros">
477 <dd class="txt-uppercase"><span class="estado Diversidad">${categoriaFiltrada}</span></dd>
478 <#break>
479 <#case "Escénicas">
480 <dd class="txt-uppercase"><span class="estado Escenicas">${categoriaFiltrada}</span></dd>
481 <#break>
482 <#case "Exámenes de español">
483 <dd class="txt-uppercase"><span class="estado Examenes">${categoriaFiltrada}</span></dd>
484 <#break>
485 <#case "Exposiciones">
486 <dd class="txt-uppercase"><span class="estado Exposiciones">${categoriaFiltrada}</span></dd>
487 <#break>
488 <#case "Formación">
489 <dd class="txt-uppercase"><span class="estado Formacion">${categoriaFiltrada}</span></dd>
490 <#break>
491 <#case "Infantil / Juvenil">
492 <dd class="txt-uppercase"><span class="estado Infantil">${categoriaFiltrada}</span></dd>
493 <#break>
494 <#case "Letras">
495 <dd class="txt-uppercase"><span class="estado Letras">${categoriaFiltrada}</span></dd>
496 <#break>
497 <#case "Mediación">
498 <dd class="txt-uppercase"><span class="estado Mediacion">${categoriaFiltrada}</span></dd>
499 <#break>
500 <#case "Medioambiente / Sostenibilidad">
501 <dd class="txt-uppercase"><span class="estado Medioambiente">${categoriaFiltrada}</span></dd>
502 <#break>
503 <#case "Música / Sonido">
504 <dd class="txt-uppercase"><span class="estado Musica">${categoriaFiltrada}</span></dd>
505 <#break>
506 <#case "Patrimonio">
507 <dd class="txt-uppercase"><span class="estado Patrimonio">${categoriaFiltrada}</span></dd>
508 <#break>
509 <#case "Radio / Pódcast">
510 <dd class="txt-uppercase"><span class="estado Radio">${categoriaFiltrada}</span></dd>
511 <#break>
512 <#default>
513 <dd class="txt-uppercase"><span class="estado neutro">${categoriaFiltrada}</span></dd>
514 <#break>
515 </#switch>
516 </#list>
517 </#if>
518
519 <!-- Fecha desde/hasta -->
520 <#assign startDate_Data = getterUtil.getString(FechaDesdeCC)>
521 <#assign endDate_Data = getterUtil.getString(FechaHastaCC)>
522 <#if startDate_Data?? && endDate_Data??>
523 <#assign startDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", startDate_Data, locale)>
524 <#assign endDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", endDate_Data, locale)>
525 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Fecha</dt>
526 <dd class="txt-uppercase">
527 <#if startDate_Data == endDate_Data>
528 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)}
529 <#else>
530 ${dateUtil.getDate(startDate_DateObj, "dd MMMM yyyy", locale)} - ${dateUtil.getDate(endDate_DateObj, "MMMM yyyy", locale)}
531 </#if>
532 </dd>
533 </#if>
534
535 <!-- Campo horario -->
536 <#if (schedule.getData())?? && (schedule.getData())?has_content>
537 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Horario</dt>
538 <dd class="txt-uppercase"><span class="estado-neutro">${schedule.getData()}</span></dd>
539 </#if>
540
541 <!-- Lugar -->
542 <#if LugarCC?? && LugarCC?has_content>
543 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Lugar</dt>
544 <#switch LugarCC>
545 <#case "Opción94049536">
546 <dd class="txt-uppercase"><span class="estado neutro">Presencial</span></dd>
547 <#break>
548 <#case "Opción97760043">
549 <dd class="txt-uppercase"><span class="estado neutro">Online</span></dd>
550 <#break>
551 <#case "Opción36010935">
552 <dd class="txt-uppercase"><span class="estado neutro">Fuera del Centro</span></dd>
553 <#break>
554 </#switch>
555 </#if>
556
557 <!-- Colaborador -->
558 <#if ColaboradorCC?? && ColaboradorCC?has_content>
559 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Colaborador</dt>
560 <dd class="txt-uppercase"><span class="estado-neutro">${ColaboradorCC}</span></dd>
561 </#if>
562
563 <!-- Cupo -->
564 <#if CupoCC?? && CupoCC?has_content>
565 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cupo</dt>
566 <dd class="txt-uppercase">${CupoCC}</dd>
567 </#if>
568
569 <!-- Organizador -->
570 <#if OrganizadorCC?? && OrganizadorCC?has_content>
571 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Organizador</dt>
572 <dd class="txt-uppercase">${OrganizadorCC}</dd>
573 </#if>
574
575 <!-- Cierre de inscripciones -->
576 <#assign CierreDeInscripciones_Data = getterUtil.getString(CierreCC)?trim>
577 <#if CierreDeInscripciones_Data?has_content>
578 <#-- Intenta parsear solo si el valor tiene contenido y está en el formato correcto -->
579 <#assign CierreDeInscripciones_DateObj = dateUtil.parseDate("yyyy-MM-dd", CierreDeInscripciones_Data, locale)>
580 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Cierre de inscripciones</dt>
581 <dd class="txt-uppercase">${dateUtil.getDate(CierreDeInscripciones_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
582 </#if>
583
584 <!-- Publicacion de admision -->
585 <#assign PublicacionDeAdmision_Data = getterUtil.getString(AdmisionCC)>
586 <#if validator.isNotNull(PublicacionDeAdmision_Data)>
587 <#assign PublicacionDeAdmision_DateObj = dateUtil.parseDate("yyyy-MM-dd", PublicacionDeAdmision_Data, locale)>
588 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Publicacion de Admision</dt>
589 <dd class="txt-uppercase">${dateUtil.getDate(PublicacionDeAdmision_DateObj, "dd 'DE' MMMM 'DE' yyyy", locale)}</dd>
590 </#if>
591 </dl>
592 </div>
593 </div>
594 </div>
595
596<#else>
597 <div id="aecid-detalle-noticia" class="container p-0 aecid-detalle mt-5 mb-5">
598 <div class="row aecid-noticia px-3 px-md-0">
599 <!----------------------------------------------------------->
600 <!--- Se visualiza el contenido con el diseño de las OCE ---->
601 <!----------------------------------------------------------->
602 <div class="col-lg-6 col-12 row px-0">
603 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
604 <#assign jsonObject = jsonFactory.createJSONObject(Imagen)>
605 <#assign urlImagen = jsonObject.getString("url")>
606 <#assign urlImagenAlt = jsonObject.getString("alt")>
607
608 <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria">
609 <#if (video?has_content)>
610 <div class="col-12 p-0">
611 <div class="row justify-content-center">
612 <div class="col-12 p-0">
613 <#if video?contains("www.youtube.com/embed/")>
614 <iframe
615 title="Reproductor de vídeo YouTube" src="${video}" frameborder="0"
616 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
617 allowfullscreen>
618 </iframe>
619
620 <#elseif video?contains("www.youtube.com/") && video?split("/")?size gte 2>
621 <iframe title="Reproductor de vídeo YouTube"
622 src="https://www.youtube.com/embed/${video?split("/")[3]}"
623 frameborder="0"
624 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
625 allowfullscreen>
626 </iframe>
627
628 <#elseif video?contains("youtu.be")>
629 <a href="${friendlyURLs[themeDisplay.getLanguageId()]!""}" title="${languageUtil.get(locale, "lleva.a.pagina")} ${article.getTitle(locale)?truncate(100, '...')}">
630 <iframe tabindex="0" height="210px" title="Reproductor de vídeo YouTube"
631 src="https://www.youtube.com/embed/${video?split("/")[3]}?showinfo=0"
632 frameborder="0"
633 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
634 allowfullscreen>
635 </iframe>
636 </a>
637
638 <#elseif video?contains("vimeo") && video?split("/")?size gte 2>
639 <iframe title="Reproductor de vídeo Vimeo"
640 src="https://player.vimeo.com/video/${video?split("/")[3]}?"
641 frameborder="0" allow="autoplay; fullscreen; picture-in-picture"
642 allowfullscreen>
643 </iframe>
644 </#if> <!-- Asegura que este cierre esté presente -->
645 </div>
646 </div>
647 </div>
648 <#else>
649 <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")>
650 <#assign jsonObject = jsonFactory.createJSONObject(Imagen)>
651 <#assign urlImagen = jsonObject.getString("url")>
652 <#assign urlImagenAlt = jsonObject.getString("alt")>
653 <div class="col-12 p-0">
654 <#if urlImagen?has_content>
655 <img alt="${urlImagenAlt}" src="${urlImagen}" class="mainImg w-100" />
656 <p class="pieFoto"><em tabindex="0"><span class="sr-only">${languageUtil.get(locale, "pie.de.foto")}: </span>
657 ${urlImagenAlt}
658 </em></p>
659 <#assign ImagenRedes = jsonObject.getString("url")>
660 <#else>
661 <img alt="Logo de AECID" src="/documents/d/global/noticias-convocatoria" class="mainImg w-100" />
662 <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria">
663 </#if>
664 </div>
665 </#if>
666 </div>
667 <div class="col-lg-6 col-12 pl-lg-5 px-0 flex-column justify-content-center">
668 <div class="p-0">
669 <h2 tabindex="0">${article.getTitle(locale)}</h2>
670 </div>
671 <div class="p-0">
672 <p class="fecha" tabindex="0"><@fechaPublicacionJournal pattern="dd/MM/yyyy - HH:mm" upperCase=false/></p>
673 </div>
674 <div class="p-0">
675 <p tabindex="0"><span class="sr-only">${languageUtil.get(locale, "categorias.de.la.noticia")}</span>
676 <span class="categoria">
677 <#if categories?has_content>
678 <#list categories as category>
679 <#assign
680 numIdCategoria=category.getTreePath()?substring(category.getTreePath()?last_index_of("/")
681 - 5 , category.getTreePath()?length - 1) />
682 <span>${category.getName()}</span>
683 <span class="separador">
684 ${category?has_next?then(' | ', '')}
685 </span>
686 </#list>
687 </#if>
688 </span>
689 </p>
690 </div>
691 <div class="p-0">
692 <p class="resumen" tabindex="0"><span class="sr-only"> ${languageUtil.get(locale, "resumen.de.la.noticia")} </span>
693 <#if Resumen??>
694 ${Resumen}
695 </#if>
696 </p>
697 </div>
698 </div>
699
700 <div class="col-12 p-0">
701 <hr />
702 </div>
703 <div class="col-lg-10 col-12 p-0 ">
704 <div class="contenido" tabindex="0"><span class="sr-only">${languageUtil.get(locale, "contenido.de.la.noticia")} </span>
705 <#if Contenido??>
706 ${Contenido}
707 </#if>
708 </div>
709 </div>
710
711 <div class="col-2 d-lg-block d-none"></div>
712 <@liferay_util["html-top"]
713 outputKey="htmltop">
714 <!-- METAS RRSS -->
715 <meta property="og:url" content="${currentShortURL}" />
716 <meta property="og:site_name" content="SiteName" />
717 <meta property="og:type" content="website" />
718 <meta property="og:locale" content="gl_ES" />
719 <meta property="og:locale:alternate" content="gl_ES" />
720 <meta name="twitter:card" content="summary_large_image" />
721 <meta property="og:title" content="${article.getTitle(locale)}" />
722 <meta name="twitter:title" content="${article.getTitle(locale)}" />
723
724 <#if Resumen != "">
725 <meta property="og:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" />
726 <meta name="twitter:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" />
727 <#else>
728 <meta property="og:description" content="${article.getTitle(locale)}" />
729 <meta name="twitter:description" content="${article.getTitle(locale)}" />
730 </#if>
731
732 <meta property="og:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
733 <meta property="og:image:secure_url" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
734 <meta name="twitter:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" />
735 <meta property="og:image:alt" content="Alt img og" />
736 <meta property="fb:app_id" content="???">
737 <meta property="fb:admins" content="https://www.facebook.com/Aecid.es">
738 <meta name="twitter:domain" content="${currentShortURL}" />
739 <meta name="twitter:site" content="@AECID_es" />
740 </@>
741 <div class="row col-12 p-0">
742 <!-- button visible facebook -->
743 <div class="col-flex mr-2">
744 <button class="fb-xfbml-parse-ignore" onClick="shareFacebook();" target="_blank" class="share-option"
745 index-social-media-list="0">
746 <div class="botonRRSS facebook">
747 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
748 class="bi bi-facebook" viewBox="0 0 16 16">
749 <path
750 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" />
751 </svg>
752 </div>
753 </button>
754 </div>
755 <!-- button visible twitter -->
756 <div class="col-flex mr-2">
757 <a href="https://twitter.com/intent/tweet?text=Mira esta noticia: ${article.getTitle(locale)} ${currentShortURL}"
758 class="twitter-share share-option no-ico" target="_blank" index-social-media-list="1">
759 <div class="botonRRSS twitter">
760 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
761 class="bi bi-twitter" viewBox="0 0 16 16">
762 <path
763 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" />
764 </svg>
765 </div>
766 </a>
767 </div>
768 </div>
769 </div>
770 </div>
771</#if>
772
773<#macro compartirRedesSocialesImprimir url=URLCompleteNoParams text="" twitter=true facebook=true>
774
775 <#local urlEncoded = urlCodec.encodeURL(url) />
776
777 <#local textF= text />
778 <#if text?has_content >
779 <#local textF= htmlParserUtil.extractText(text)?trim />
780 </#if>
781
782 <!-- TWITTER -->
783 <#if twitter>
784 <#local twitterShareURL = "https://x.com/intent/tweet?url=" + urlEncoded />
785 <#if textF?has_content >
786 <#local textTwitter = textF?truncate(280, '...') />
787 <#local textTwitter = urlCodec.encodeURL(textTwitter) />
788 <#local twitterShareURL = twitterShareURL + "&text=" + textTwitter + "%0a%0a" />
789 </#if>
790 <#local twitterShareURL = twitterShareURL + "&via=" + twitterAccount />
791 </#if>
792 <#-- // -->
793
794 <#-- FACEBOOK -->
795 <#if facebook>
796 <#local facebookShareURL = "https://www.facebook.com/sharer/sharer.php?u=" + urlEncoded />
797 <#if textF?has_content >
798 <#local textFacebook = urlCodec.encodeURL(textF) />
799 <#local facebookShareURL = facebookShareURL + ""e=" + textFacebook />
800 </#if>
801 </#if>
802 <#-- // -->
803
804 <dt class="tit-h5 txt-uppercase txt-medi mb-2">Compartir</dt>
805 <dd>
806 <#if facebookShareURL?has_content >
807 <a class="no-ico" href="${facebookShareURL}" target="_blank" title="Compartir en facebook">
808 <img alt="icono facebook" src="/o/aecid-oces-theme/images/ico-facebook.svg" /></a>
809 </#if>
810
811 <#if twitterShareURL?has_content >
812 <a class="ml-2 no-ico" href="${twitterShareURL}" target="_blank" title="Compartir en X">
813 <img alt="icono X" src="/o/aecid-oces-theme/images/ico-x.svg" /></a>
814 </#if>
815 </dd>
816</#macro>