Se ha producido un error al procesar la plantilla.	
	
		
				
	
		
		
	
			
			
		
	
	
	
	
					
				
			
		
	
	
	The following has evaluated to null or missing:
==> request.getParameter("articulo")  [in template "20096#20122#7614223" at line 109, 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#7614223" at line 109, column 1]
----
	1<style> 
				2    .aecid-detalle a { 
				3        color: var(--brand-color-1); 
				4    } 
				5     
				6    .aecid-detalle a:hover, 
				7    .aecid-detalle .share-option:hover { 
				8        opacity: .5; 
				9    } 
				10     
				11    .aecid-detalle h2 { 
				12        color: var(--brand-color-1); 
				13        margin-bottom: 20px; 
				14        font-size: 24px; 
				15    } 
				16     
				17    .separador { 
				18        color: #000; 
				19    } 
				20     
				21    .fecha { 
				22        font-weight: bold; 
				23    } 
				24     
				25    .categoria { 
				26        color: #6f6f6f; 
				27        font-size: 0.85em; 
				28        text-transform: uppercase; 
				29    } 
				30     
				31    .resumen { 
				32        color: #6f6f6f; 
				33        font-size: 0.9em; 
				34    } 
				35     
				36    .aecid-detalle iframe { 
				37        width: 100%; 
				38        height: 30em; 
				39    } 
				40     
				41    .contenido { 
				42        font-family: Barlow; 
				43    } 
				44     
				45    .contenido img { 
				46        margin-left: 0 !important; 
				47        max-width: 100% !important; 
				48        height: auto; 
				49    } 
				50     
				51    .pieFoto { 
				52        font-size: 14px; 
				53    } 
				54     
				55    .botonRRSS { 
				56        display: inline-block; 
				57        color: #fff; 
				58        vertical-align: middle; 
				59        cursor: pointer; 
				60        -webkit-user-select: none; 
				61        -moz-user-select: none; 
				62        user-select: none; 
				63        background-color: transparent; 
				64        border: 1px solid transparent; 
				65        padding: 0.375rem 0.75rem; 
				66        border-radius: 0.25rem; 
				67        transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out; 
				68    } 
				69     
				70    .share-option { 
				71        background-color: transparent; 
				72        border: none; 
				73        padding: 0; 
				74    } 
				75     
				76    .facebook { 
				77        background-color: #3B5998; 
				78    } 
				79     
				80    .fb-xfbml-parse-ignore { 
				81        background-color: transparent; 
				82        border: none; 
				83    } 
				84     
				85    .fb-xfbml-parse-ignore:hover { 
				86        opacity: .5; 
				87    } 
				88     
				89    .twitter { 
				90        background-color: #1D9BF0; 
				91    } 
				92     
				93    .mainImg { 
				94        max-height: 21rem; 
				95        object-fit: cover; 
				96        width: auto; 
				97        max-width: 100%; 
				98    } 
				99     
				100    @media screen and (max-width: 576px) { 
				101        .aecid-noticia { 
				102            padding-left: 10px; 
				103            padding-right: 10px; 
				104        } 
				105    } 
				106</style> 
				107 
				108 
				109<#assign myParamValue = request.getParameter("articulo")> 
				110<#assign grupostr = request.getParameter("sitio")> 
				111<#assign grupolong = grupostr?number > 
				112 
				113<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
				114<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") /> 
				115<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
				116<#assign articleId = request.getParameter("articulo")> 
				117<#assign article = journalArticleLocalService.getArticle(grupolong, articleId)> 
				118<#assign articleResource = journalArticleResourceLocalService.getArticleResource(article.getResourcePrimKey())> 
				119<#assign articleResourcePK = articleResource.getPrimaryKey()> 
				120<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 
				121<#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")> 
				122<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", articleResourcePK) /> 
				123<#assign assetEntryId = assetEntry.getEntryId() /> 
				124 
				125<!-- Funciones --> 
				126<#function getJournalArticleRootElement journal> 
				127	<#attempt> 
				128		<#if journal?has_content> 
				129			<#local journalLocaleContent = journal.getContentByLocale(locale.toString()) />		 
				130			<#local journalContentXml = saxReaderUtil.read(journalLocaleContent) />		 
				131			<#local rootElementContent = journalContentXml.getRootElement() /> 
				132			<#if rootElementContent?? && rootElementContent?has_content>					 
				133				<#return rootElementContent />				 
				134			</#if> 
				135		</#if>			 
				136	<#recover > 
				137	</#attempt>	 
				138	<#return "" /> 
				139</#function> 
				140 
				141<#function getXmlTextElement rootElementContent fieldReference> 
				142	<#attempt> 
				143		<#local xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='" + fieldReference + "']") /> 
				144		<#local element = xPathSelector.selectSingleNode(rootElementContent) /> 
				145		<#return element.getStringValue()?trim /> 
				146	<#recover > 
				147	</#attempt>	 
				148	<#return "" /> 
				149</#function> 
				150 
				151<#function getXmlTextElement rootElementContent fieldReference> 
				152	<#attempt> 
				153		<#local xPathSelector = saxReaderUtil.createXPath("dynamic-element[@field-reference='" + fieldReference + "']") /> 
				154		<#local element = xPathSelector.selectSingleNode(rootElementContent) /> 
				155		<#return element.getStringValue()?trim /> 
				156	<#recover > 
				157	</#attempt>	 
				158	<#return "" /> 
				159</#function> 
				160 
				161<#function getJournalArticle resourcePrimKey> 
				162	<#attempt> 
				163		<#local journal = journalArticleLocalService.getLatestArticle(resourcePrimKey, 0) /> 
				164		<#return journal />			 
				165	<#recover > 
				166	</#attempt>	 
				167	<#return "" /> 
				168</#function> 
				169 
				170<#function getJournalArticleByJsonElement elementJson> 
				171	<#attempt> 
				172		<#local resourcePrimKey = elementJson.classPK?number /> 
				173		<#local journal = getJournalArticle(resourcePrimKey) />                 
				174		<#return journal /> 
				175	<#recover > 
				176	</#attempt>	 
				177	<#return "" /> 
				178</#function> 
				179 
				180<#function obtenerCamposRepetidos documentRoot fieldReference > 
				181	<#return documentRoot.selectNodes("dynamic-element[@field-reference='" + fieldReference + "']")/> 
				182</#function> 
				183 
				184<#function getFriendlyUrlJournal journal>	 
				185	<#return "/-/" + journal.getUrlTitle() />	 
				186</#function> 
				187 
				188<#function removeUrlParams url> 
				189	<#if url?contains("?") > 
				190		<#return url?substring(0, url?index_of("?")) />		 
				191	</#if> 
				192	<#return  url/> 
				193</#function> 
				194 
				195<#macro fechaPublicacionJournal pattern="MMMM '|' dd '|' yyyy" upperCase=true> 
				196	<#local date = getJournalArticleDisplayDate(article) /> 
				197	<#if date?has_content> 
				198		<#local dateFormat = formatDate(date, pattern) /> 
				199    ${upperCase?then(dateFormat?upper_case, dateFormat)} 
				200  </#if> 
				201</#macro> 
				202 
				203<#function getJournalArticleDisplayDate articulo> 
				204	<#local journalArticleDisplayDateF = ""> 
				205	<#attempt> 
				206		<#local journalArticleDisplayDate = articulo.getDisplayDate() /> 
				207		<#if journalArticleDisplayDate?has_content>			 
				208			<#local journalArticleDisplayDateF = journalArticleDisplayDate />			 
				209			<#local date = dateUtil.parseDate("EEE, dd MMM yyyy HH:mm:ss Z", journalArticleDisplayDate, localeUtil.getDefault()) /> 
				210			<#local journalArticleDisplayDateF = date />		 
				211		</#if> 
				212	<#recover> 
				213	</#attempt> 
				214	<#return journalArticleDisplayDateF /> 
				215</#function> 
				216 
				217<#function formatDate date datePattern="EEEE, dd MMMM yyyy HH:mm"> 
				218	<#attempt> 
				219	<#local timeZoneMadrid = timeZoneUtil.getTimeZone("Europe/Madrid") /> 
				220	<#local dateFormat = dateUtil.getDate(date, datePattern, locale, timeZoneMadrid) /> 
				221	<#return dateFormat /> 
				222	<#recover> 
				223	</#attempt> 
				224	<#return "" /> 
				225</#function> 
				226 
				227<#-- Construir la URL actual --> 
				228<#assign currentURL = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
				229<#-- Comprobar si existe el servicio de shortener --> 
				230<#if (serviceLocator.findService("es.aecid.shorturl.service.AecidShortUrlService"))??> 
				231    <#assign shortUrlService = serviceLocator.findService("es.aecid.shorturl.service.AecidShortUrlService") /> 
				232    <#assign currentShortURL = themeDisplay.getPortalURL() + "/" + shortUrlService.getShortUrl(currentURL, companyId, groupId, themeDisplay.getUserId()) /> 
				233<#else> 
				234    <#-- Escapamos la URL para HTML (incluye reemplazo de &) --> 
				235    <#assign currentShortURL = currentURL?replace("&", "%26") /> 
				236    <#assign currentShortURL = currentShortURL?html /> 
				237</#if> 
				238 
				239<!-- obtener los datos de los campos --> 
				240<#assign journalRootElement = getJournalArticleRootElement(article) /> 
				241<#assign contenido = article.getContent() /> 
				242 
				243<#if journalRootElement?has_content> 
				244    <#assign video = getXmlTextElement(journalRootElement, "video") />   
				245    <#assign Resumen = getXmlTextElement(journalRootElement, "resumen") /> 
				246    <#assign Imagen = getXmlTextElement(journalRootElement, "image") />  
				247    <#assign Contenido = getXmlTextElement(journalRootElement, "content") />  
				248</#if> 
				249 
				250<#assign redirectUrl = paramUtil.getString(request, "redirect", "") /> 
				251<a class="back-button" href="${redirectUrl}"> 
				252	<img src="${themeDisplay.getPathThemeImages()}/abajo.svg" alt=""> 
				253	<span>Atrás</span> 
				254</a> 
				255 
				256<div id="aecid-detalle-noticia" class="container p-0 aecid-detalle mt-5 mb-5"> 
				257    <div class="row aecid-noticia px-3 px-md-0"> 
				258        <div class="col-lg-6 col-12 row px-0"> 
				259            <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")> 
				260            <#assign jsonObject = jsonFactory.createJSONObject(Imagen)> 
				261            <#assign urlImagen = jsonObject.getString("url")> 
				262            <#assign urlImagenAlt = jsonObject.getString("alt")> 
				263          
				264            <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria"> 
				265            <#if (video?has_content)> 
				266                <div class="col-12 p-0"> 
				267                    <div class="row justify-content-center"> 
				268                        <div class="col-12 p-0"> 
				269                            <#if video?contains("www.youtube.com/embed/")>  
				270                                <iframe 
				271                                    title="Reproductor de vídeo YouTube" src="${video}" frameborder="0" 
				272                                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
				273                                    allowfullscreen> 
				274                                </iframe> 
				275 
				276                            <#elseif video?contains("www.youtube.com/") && video?split("/")?size gte 2> 
				277																<#assign enlaceIframe = "" > 
				278																<#if video?contains("watch")> 
				279																	<#assign enlaceIframe = video?split("/")[3]?split("watch?v=")[1] > 
				280																<#else> 
				281																	<#assign enlaceIframe = video?split("/")[3]> 
				282																</#if> 
				283                                <iframe title="Reproductor de vídeo YouTube" 
				284                                    src="https://www.youtube.com/embed/${enlaceIframe}" 
				285                                    frameborder="0" 
				286                                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 
				287                                    allowfullscreen> 
				288                                </iframe> 
				289 
				290                            <#elseif video?contains("youtu.be")> 
				291                                <a href="${friendlyURLs[themeDisplay.getLanguageId()]!""}" title="${languageUtil.get(locale, "lleva.a.pagina")} ${article.getTitle(locale)?truncate(100, '...')}"> 
				292                                    <iframe tabindex="0" height="210px" title="Reproductor de vídeo YouTube"  
				293                                        src="https://www.youtube.com/embed/${video?split("/")[3]}?showinfo=0"  
				294                                        frameborder="0"  
				295                                        allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"  
				296                                        allowfullscreen> 
				297                                    </iframe> 
				298                                </a> 
				299 
				300                                <#elseif video?contains("vimeo") && video?split("/")?size gte 2> 
				301                                <iframe title="Reproductor de vídeo Vimeo" 
				302                                    src="https://player.vimeo.com/video/${video?split("/")[3]}?" 
				303                                    frameborder="0" allow="autoplay; fullscreen; picture-in-picture" 
				304                                    allowfullscreen> 
				305                                </iframe> 
				306                            </#if>  <!-- Asegura que este cierre esté presente --> 
				307                       </div> 
				308                    </div> 
				309                </div> 
				310            <#else> 
				311                <#assign jsonFactory = serviceLocator.findService("com.liferay.portal.kernel.json.JSONFactory")> 
				312                <#assign jsonObject = jsonFactory.createJSONObject(Imagen)> 
				313                <#assign urlImagen = jsonObject.getString("url")> 
				314                <#assign urlImagenAlt = jsonObject.getString("alt")> 
				315                <div class="col-12 p-0"> 
				316                    <#if urlImagen?has_content> 
				317                        <img alt="${urlImagenAlt}" src="${urlImagen}" class="mainImg w-100" /> 
				318                        <p class="pieFoto"><em tabindex="0"><span class="sr-only">${languageUtil.get(locale, "pie.de.foto")}: </span> 
				319                            ${urlImagenAlt} 
				320                        </em></p> 
				321                        <#assign ImagenRedes = jsonObject.getString("url")> 
				322                    <#else> 
				323                        <img alt="Logo de AECID" src="/documents/d/global/noticias-convocatoria" class="mainImg w-100" /> 
				324                        <#assign ImagenRedes = "/documents/d/global/noticias-convocatoria"> 
				325                    </#if> 
				326                </div> 
				327            </#if> 
				328        </div>     
				329        <div class="col-lg-6 col-12 pl-lg-5 px-0 flex-column justify-content-center"> 
				330            <div class="p-0"> 
				331                <h2 tabindex="0">${article.getTitle(locale)}</h2> 
				332            </div> 
				333            <div class="p-0"> 
				334                <p class="fecha" tabindex="0"><@fechaPublicacionJournal pattern="dd/MM/yyyy - HH:mm" upperCase=false/></p> 
				335            </div>     
				336            <div class="p-0"> 
				337                <p tabindex="0"><span class="sr-only">${languageUtil.get(locale, "categorias.de.la.noticia")}</span> 
				338                    <span class="categoria"> 
				339                        <#if categories?has_content> 
				340                            <#list categories as category> 
				341                                <#assign 
				342                                    numIdCategoria=category.getTreePath()?substring(category.getTreePath()?last_index_of("/") 
				343                                    - 5 , category.getTreePath()?length - 1) /> 
				344                                <span>${category.getName()}</span> 
				345                                <span class="separador"> 
				346                                    ${category?has_next?then(' | ', '')} 
				347                                </span> 
				348                            </#list> 
				349                        </#if> 
				350                    </span> 
				351                </p> 
				352            </div> 
				353            <div class="p-0"> 
				354                <p class="resumen" tabindex="0"><span class="sr-only"> ${languageUtil.get(locale, "resumen.de.la.noticia")} </span> 
				355                    <#if Resumen??> 
				356                        ${Resumen} 
				357                    </#if> 
				358                </p> 
				359            </div>             
				360        </div> 
				361        <div class="col-12 p-0"> 
				362            <hr /> 
				363        </div>             
				364        <div class="col-lg-10 col-12 p-0 "> 
				365            <div class="contenido" tabindex="0"><span class="sr-only">${languageUtil.get(locale, "contenido.de.la.noticia")} </span> 
				366                <#if Contenido??> 
				367                    ${Contenido} 
				368                </#if> 
				369            </div> 
				370        </div> 
				371        <div class="col-2 d-lg-block d-none"></div> 
				372        <@liferay_util["html-top"] 
				373            outputKey="htmltop"> 
				374            <!-- METAS RRSS --> 
				375					  <meta property="og:url" content="${currentShortURL?html}" /> 
				376            <meta property="og:site_name" content="SiteName" /> 
				377            <meta property="og:type" content="website" /> 
				378            <meta property="og:locale" content="gl_ES" /> 
				379            <meta property="og:locale:alternate" content="gl_ES" /> 
				380            <meta name="twitter:card" content="summary_large_image" /> 
				381            <meta property="og:title" content="${article.getTitle(locale)}" /> 
				382            <meta name="twitter:title" content="${article.getTitle(locale)}" /> 
				383     
				384            <#if Resumen != ""> 
				385                <meta property="og:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" /> 
				386                <meta name="twitter:description" content="${htmlUtil.stripHtml(Resumen)?replace("\"", "'" )}" /> 
				387            <#else> 
				388                <meta property="og:description" content="${article.getTitle(locale)}" /> 
				389                <meta name="twitter:description" content="${article.getTitle(locale)}" /> 
				390            </#if> 
				391             
				392            <meta property="og:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" /> 
				393            <meta property="og:image:secure_url" content="${themeDisplay.getPortalURL()+ImagenRedes}" /> 
				394            <meta name="twitter:image" content="${themeDisplay.getPortalURL()+ImagenRedes}" /> 
				395            <meta property="og:image:alt" content="Alt img og" /> 
				396            <meta property="fb:app_id" content="???"> 
				397            <meta property="fb:admins" content="https://www.facebook.com/Aecid.es"> 
				398            <meta name="twitter:domain" content="${currentShortURL}" /> 
				399						<meta name="twitter:url" content="${currentShortURL}" /> 
				400            <meta name="twitter:site" content="@AECID_es" /> 
				401            </@> 
				402            <div class="row col-12 p-0"> 
				403                <!-- button visible facebook --> 
				404                <div class="col-flex mr-2"> 
				405                    <button class="fb-xfbml-parse-ignore" onClick="shareFacebook();" target="_blank" class="share-option" 
				406                        index-social-media-list="0"> 
				407                        <div class="botonRRSS facebook"> 
				408                            <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" 
				409                                class="bi bi-facebook" viewBox="0 0 16 16"> 
				410                                <path 
				411                                    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" /> 
				412                            </svg> 
				413                        </div> 
				414                    </button> 
				415                </div> 
				416                <!-- button visible twitter --> 
				417                <div class="col-flex mr-2"> 
				418                    <a href="https://twitter.com/intent/tweet?text=Mira esta noticia: ${article.getTitle(locale)} ${currentShortURL}" 
				419                        class="twitter-share share-option no-ico" target="_blank" index-social-media-list="1"> 
				420                        <div class="botonRRSS twitter"> 
				421                            <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" 
				422                                class="bi bi-twitter" viewBox="0 0 16 16"> 
				423                                <path 
				424                                    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" /> 
				425                            </svg> 
				426                        </div> 
				427                    </a> 
				428                </div> 
				429            </div> 
				430    </div> 
				431</div> 
				432 
				433 
				434<script> 
				435    function shareFacebook() { 
				436        let urlShare = 'http://www.facebook.com/sharer.php?s=100&p[title] = ' + encodeURI('${article.getTitle(locale)} ') + '&p[summary] = Resumen & p[url] = ${currentShortURL} '; 
				437        let a = document.createElement('a'); 
				438        a.target = '_blank'; 
				439        a.href = urlShare; 
				440        a.click(); 
				441    } 
				442</script> 
		

