Portada. Universidad de Navarra
Descubre nuestros campus
Noticias
31|01|2030
IA+Igual y la Universidad impulsan un modelo para certificar el uso ético de la IA en el ámbito laboral
El Libro Blanco presentado hoy propone las bases para un estándar de certificación que evite la discriminación algorítmica en procesos
Leer más
09|10|2025
La Universidad, cuarta mejor universidad de España según el ranking global de Times Higher Education
El centro académico destaca en internacionalidad y conexión con la industria, según el World Rankings 2026
Leer más
10|10|2025
La investigadora Maite Solas recibe la beca Pascual Maragall para estudios innovadores sobre Alzheimer
Su estudio pretende averiguar si intervenir en ciertas rutas metabólicas podría ralentizar la progresión de la enfermedad o incluso rev
Leer más
Eventos
The following has evaluated to null or missing:
==> themeDisplay.getScopeGroup().getExpandoBridge().getAttribute("site_calendar_url") [in template "10136#10174#153676894" at line 1, column 30]
----
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 site_calendar_url = themeDisp... [in template "10136#10174#153676894" at line 1, column 1]
----
1<#assign site_calendar_url = themeDisplay.getScopeGroup().getExpandoBridge().getAttribute("site_calendar_url")>
2<#assign site_calendar_detail_id = themeDisplay.getScopeGroup().getExpandoBridge().getAttribute("site_calendar_detail_id")>
3<#assign MAX_EVENTOS = 4/>
4<#assign URLEncoder = staticUtil["java.net.URLEncoder"] />
5
6<#assign site_calendar_url_default = themeDisplay.getScopeGroup().getExpandoBridge().getAttributeDefault("site_calendar_url")>
7<#assign site_calendar_detail_id_default = themeDisplay.getScopeGroup().getExpandoBridge().getAttributeDefault("site_calendar_detail_id")>
8
9
10<#list site_calendar_detail_id?keys as key>
11 <#if key == locale>
12 <#assign site_calendar_detail_id_value = site_calendar_detail_id?values[key?index]>
13 </#if>
14</#list>
15
16<#list site_calendar_detail_id_default?keys as key>
17 <#if key == locale>
18 <#assign site_calendar_detail_id_default_value = site_calendar_detail_id_default?values[key?index]>
19 </#if>
20</#list>
21
22<#if site_calendar_detail_id_value??>
23<#else>
24 <#if site_calendar_detail_id_default_value??>
25 <#assign site_calendar_detail_id_value = site_calendar_detail_id_default_value>
26 </#if>
27</#if>
28
29<#list site_calendar_url?keys as key>
30 <#if key == locale>
31 <#assign site_calendar_url_value = site_calendar_url?values[key?index]>
32 </#if>
33</#list>
34
35<#list site_calendar_url_default?keys as key>
36 <#if key == locale>
37 <#assign site_calendar_url_default_value = site_calendar_url_default?values[key?index]>
38 </#if>
39</#list>
40
41<#if site_calendar_url_value??>
42<#else>
43 <#if site_calendar_url_default_value??>
44 <#assign site_calendar_url_value = site_calendar_url_default_value>
45 </#if>
46</#if>
47
48
49<style>
50 .evento img {
51 height: 200px !important;
52 max-width: 100%;
53 object-fit: cover;
54 }img
55 h3.titulo{
56 display: block !important;
57 }
58 .eventos .evento .panel-body .fecha {
59 line-height: 2.25rem;
60 }
61 .eventos .evento .panel-body .fecha {
62 font-family: "Roboto Light";
63 font-size: 1.875rem;
64 line-height: 35px;
65 letter-spacing: 0;
66 margin-bottom:0;
67 }
68 .eventos .evento .panel-body .hora {
69 font-family: "Roboto Light";
70 font-size: 1.875rem;
71 line-height: 30px;
72 letter-spacing: 0;
73 margin-bottom:0;
74 }
75 .eventos .evento .panel-body .titulo{
76 margin-top: 1.875rem;
77 }
78
79 @media (max-width: 767px){
80 .eventos .evento .panel.panel-default .evento-img {
81 height: auto;
82 }
83 }
84</style>
85
86<#assign calendarBookingLocalService = serviceLocator.findService("com.liferay.calendar.service.CalendarBookingLocalService")>
87<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
88<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
89<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.asset.link.service.AssetLinkLocalService") />
90<#assign contadorEventos = 0 />
91<#assign eventosOrdenados = [] />
92<#assign eventosOrdenados2 = [] />
93<#assign beanParamUtil = staticUtil["com.liferay.portal.kernel.bean.BeanParamUtil"] />
94
95<#if entries?has_content>
96
97 <div class="container-fluid eventos">
98 <div class="container">
99 <div class="row">
100
101 <#assign events = [] />
102 <#assign images = {"foo":"bar"}/>
103 <#list entries as currentEvent>
104 <#assign defaultLocale = themeDisplay.getSiteDefaultLocale()>
105<#assign assetEnt = assetEntryLocalService.getEntry(currentEvent.getEntryId())>
106<#assign className = assetEnt.getClassName()>
107<#assign classPK = assetEnt.getClassPK()>
108<#assign defaultAssetEntry = assetEntryLocalService.fetchEntry(className, classPK)>
109
110 <#assign assetEntryPrimK = defaultAssetEntry.getClassPK()>
111 <#assign evento = calendarBookingLocalService.getCalendarBooking(assetEntryPrimK)>
112 <#assign instanceIndex = beanParamUtil.getInteger(evento, request, "instanceIndex")>
113 <#assign events = events + [evento]/>
114 <#assign links = assetLinkLocalService.getLinks(defaultAssetEntry.getEntryId())/>
115 <#assign lastLink = ""/>
116 <#list links?reverse as link>
117 <#assign lastLink = link/>
118 </#list>
119 <#if lastLink?? && lastLink != "">
120 <#assign assetImage = assetEntryLocalService.getEntry(lastLink.getEntryId2())!""/>
121 <#if assetImage != "">
122 <#assign images = images + {evento.getCalendarBookingId():assetImage.getClassPK()}/>
123 </#if>
124 </#if>
125 </#list>
126 <#list events as evento>
127 <#if (dateUtil.compareTo(dateUtil.newDate(evento.getStartTime()), dateUtil.newDate()) gte 0 || dateUtil.compareTo(dateUtil.newDate(evento.getEndTime()), dateUtil.newDate()) gt 0 )>
128 <#if (evento.isAllDay())>
129 <#assign eventosOrdenados = eventosOrdenados + [evento] />
130 </#if>
131 </#if>
132
133 </#list>
134 <#list events as evento>
135 <#if (dateUtil.compareTo(dateUtil.newDate(evento.getStartTime()), dateUtil.newDate()) gte 0 || dateUtil.compareTo(dateUtil.newDate(evento.getEndTime()), dateUtil.newDate()) gt 0 )>
136 <#if !(evento.isAllDay())>
137 <#assign eventosOrdenados = eventosOrdenados + [evento] />
138 </#if>
139 </#if>
140 </#list>
141
142
143
144 <#list eventosOrdenados?sort_by(['startTime']) as event>
145 <#assign assetEntryPrimKey = event.getCalendarBookingId()!""/>
146 <#assign eventTitle = event.getTitle(locale, false)!""/>
147 <#if eventTitle != "">
148 <#assign eventStartDate = dateUtil.newDate(event.getStartTime())>
149 <#assign eventEndDate = dateUtil.newDate(event.getEndTime())>
150 <#assign hourFormat = "HH:mm">
151 <#assign hour = "HH">
152 <#assign min = "mm">
153 <#assign dateFormat1 = "dd MMM. yyyy">
154 <#--Nuevo formato de fecha-->
155 <#assign dateFormat2 = "dd MMM.-">
156 <#assign dateFormat3 = "dd-">
157 <#if (locale == "en_GB")>
158 <#assign dateFormat1 = "MMM. dd yyyy">
159 <#assign dateFormat2 = "MMM dd-">
160 </#if>
161 <#assign imagen = "" />
162
163 <#assign contadorEventos = contadorEventos + 1 />
164 <#if (contadorEventos <= MAX_EVENTOS)>
165 <#assign titleFriendly = friendlyUrlDecode(eventTitle)/>
166 <a class="col-xs-12 col-sm-6 col-md-3 text-center evento" id="${assetEntryPrimKey}"
167 href='${site_calendar_url_value}/${dateUtil.getDate(eventStartDate, "dd/MM/yyyy", locale, timeZone)}/${titleFriendly}/${site_calendar_detail_id_value}/${instanceIndex}/${assetEntryPrimKey}' title="${eventTitle}">
168 <div class="col-xs-12 panel panel panel-default">
169 <figure class='col-xs-12 img-responsive evento-img'><img class="${assetEntryPrimKey}" /></figure>
170 <div class="col-xs-12 panel-body">
171 <#assign diaYMes = "dd MMM">
172 <#assign diaYMesInicio = (dateUtil.getDate(eventStartDate, dateFormat2, locale, timeZone))/>
173 <#assign diaYMesFin = (dateUtil.getDate(eventEndDate, dateFormat2, locale, timeZone))/>
174 <#assign mes = "MMM">
175 <#assign mesInicio = (dateUtil.getDate(eventStartDate, mes, locale, timeZone))/>
176 <#assign mesFin = (dateUtil.getDate(eventEndDate, mes, locale, timeZone))/>
177 <#if !(event.isAllDay())>
178 <#if diaYMesInicio == diaYMesFin>
179 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat1, locale, timeZone)} </p>
180 <#elseif mesInicio == mesFin>
181 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat3, locale, timeZone)}${dateUtil.getDate(eventEndDate, dateFormat1, locale, timeZone)} </p>
182 <#else>
183 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat2, locale, timeZone)}${dateUtil.getDate(eventEndDate, dateFormat1, locale, timeZone)} </p>
184 </#if>
185 <#else>
186 <#assign dia = "dd">
187 <#assign diaInicio = (dateUtil.getDate(eventStartDate, dia, locale, timeZone))/>
188 <#assign diaFin = (dateUtil.getDate(eventEndDate, dia, locale, timeZone))/>
189 <#assign lastDayOfMonth = false />
190 <#if (diaFin?number-1) == 0>
191 <#assign fechaLastDayOfMonth = (""+(diaFin?number-1)+"/"+mesFin+"/"+dateUtil.getDate(eventStartDate, "yyyy", locale, timeZone))?date("dd/MMM/yyyy")/>
192 <#assign lastDayOfMonth = (diaInicio == dateUtil.getDate(fechaLastDayOfMonth, dia, locale, timeZone) && mesInicio == dateUtil.getDate(fechaLastDayOfMonth, mes, locale, timeZone))/>
193 </#if>
194 <#if (diaInicio?number == diaFin?number && mesInicio == mesFin) || lastDayOfMonth>
195 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat1, locale, timeZone)} </p>
196 <#elseif mesInicio == mesFin>
197 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat3, locale, timeZone)}${dateUtil.getDate(eventEndDate, dateFormat1, locale, timeZone)} </p>
198 <#else>
199 <p class="fecha">${dateUtil.getDate(eventStartDate, dateFormat2, locale, timeZone)}${dateUtil.getDate(eventEndDate, dateFormat1, locale, timeZone)} </p>
200 </#if>
201 </#if>
202
203 <#if !(event.isAllDay())>
204 <#-- <p class="fecha">${dateUtil.getDate(eventStartDate, hourFormat, locale)}h. </p> -->
205 <#assign hora = (dateUtil.getDate(eventStartDate, hour, locale, timeZone)?number)/>
206 <#assign minutos = dateUtil.getDate(eventStartDate, min, locale, timeZone)/>
207 <#if hora gt 23 >
208 <#assign hora = "00"/>
209 <p class="hora">${hora}:${minutos}h.</p>
210 <#else>
211 <p class="hora">${hora}:${minutos}h.</p>
212 </#if>
213 </#if>
214
215 <h3 class="titulo">
216 <#if (eventTitle?length > 70)>
217 ${eventTitle[0..69]}
218 <#else>
219 ${eventTitle}
220 </#if>
221 </h3>
222 </div>
223
224 <div class="localizacion">
225 ${event.getLocation()}
226 </div>
227 </div>
228 </a>
229 <script id="script-${assetEntryPrimKey}">
230 //$("#${assetEntryPrimKey}").attr("href",data.url);
231 <#list images as k, v>
232 <#if k == assetEntryPrimKey?string>
233 <#assign imagen = v/>
234 </#if>
235 </#list>
236 image = "${imagen}";
237 if(typeof image!=="undefined" && image !== ""){
238 Liferay.Service(
239 '/dlfileentry/get-file-entry',
240 {
241 fileEntryId: image
242 },
243 function(obj) {
244 if(typeof obj.title !== "undefined"){
245 $("img.${assetEntryPrimKey}").attr("src","/documents/"+obj.groupId+"/"+obj.folderId+"/"+obj.title+"/"+obj.uuid);
246 }
247 }
248 );
249 }
250 $("#script-${assetEntryPrimKey}").remove();
251 </script>
252 </#if>
253 </#if>
254 </#list>
255 </div>
256 </div>
257 </div>
258</#if>
259
260<#function friendlyUrlDecode title>
261
262 <#assign titleFriendly = title?replace("[^A-Za-z0-9À-ú ]", "", "r")?lower_case>
263 <#assign titleFriendly = titleFriendly?replace("á", "a", "r")>
264 <#assign titleFriendly = titleFriendly?replace("é", "e", "r")>
265 <#assign titleFriendly = titleFriendly?replace("í", "i", "r")>
266 <#assign titleFriendly = titleFriendly?replace("ó", "o", "r")>
267 <#assign titleFriendly = titleFriendly?replace("ú", "u", "r")>
268 <#assign titleFriendly = titleFriendly?replace("ñ", "n", "r")>
269 <#assign titleFriendly = URLEncoder.encode(titleFriendly)>
270 <#assign titleFriendly = titleFriendly?replace("\\+", "-","r")>
271 <#return titleFriendly>
272</#function>








