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 + "&quote=" + 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>