The following has evaluated to null or missing:
==> cur_foto.imagen.getAttribute("fileEntryId") [in template "42020#42061#69198" at line 36, column 144]
----
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: ${cur_foto.imagen.getAttribute("fileE... [in template "42020#42061#69198" at line 36, column 142]
----
1<style>
2 #map {
3 height: 100%;
4 position: relative;
5 overflow: visible;
6 }
7</style>
8<#if ! themeDisplay ? has_content>
9 <#assign liferay_theme = PortletJspTagLibs["/META-INF/liferay-theme.tld"] />
10 <@liferay_theme["defineObjects"] />
11</#if>
12<h1 class="title">${themeDisplay.getLayout().getName(locale)}</h1>
13<div class="wrap-content mB30 clearfix">
14 <#assign firstImageNotEmpty = false />
15 <#if galeriaImagenes.foto?has_content>
16 <#if galeriaImagenes.foto.getSiblings()?size == 1>
17 <#assign firstImage = galeriaImagenes.foto.getSiblings()?first>
18 <#if firstImage??>
19 <#if (firstImage.imagen?? && firstImage.imagen.getData()?? && firstImage.imagen.getData() != "")>
20 <#assign firstImageNotEmpty = true />
21 </#if>
22 </#if>
23 <#else>
24 <#assign firstImageNotEmpty = true />
25 </#if>
26 </#if>
27 <#if firstImageNotEmpty || descripcionProyecto.getData()?has_content>
28 <div class="col-magic-slider mB20">
29 <#if firstImageNotEmpty>
30 <div class="pull-right w-50 mL20 mB20">
31 <section class="slider-minOwl">
32 <div id="slider-minOwl" class="owl-carousel owl-theme">
33 <#list galeriaImagenes.foto.getSiblings() as cur_foto>
34 <#if galeriaImagenes.foto.imagen.getData()?? && galeriaImagenes.foto.imagen.getData() != "">
35 <div class="item">
36 <img class="img-responsive w-100 cornerBR" data-fileentryid="${cur_foto.imagen.getAttribute("fileEntryId")}" alt="${cur_foto.imagen.getAttribute("alt")}" src="${cur_foto.imagen.getData()}" />
37 <#if cur_foto.nombre.getData()?has_content>
38 <div class="minwc">
39 <p>${cur_foto.nombre.getData()}</p>
40 </div>
41 </#if>
42 </div>
43 </#if>
44 </#list>
45 </div>
46 </section>
47 </div>
48 </#if>
49 <div>
50 <#if descripcionProyecto.getData()?has_content>
51 ${descripcionProyecto.getData()}
52 </#if>
53 <#if nombreProyecto.getData()?has_content || sociedadAdjudicataria.getData()?has_content || cliente.getData()?has_content || fechaEjecucion.getData()?has_content>
54 <ul>
55 <#if nombreProyecto.getData()?has_content>
56 <li><strong><@liferay.language key="nombreProyectoCol" />: </strong>${nombreProyecto.getData()}</li>
57 </#if>
58 <#if sociedadAdjudicataria.getData()?has_content>
59 <li><strong><@liferay.language key="sociedadCol" />: </strong>${sociedadAdjudicataria.getData()}</li>
60 </#if>
61 <#if cliente.getData()?has_content>
62 <li><strong><@liferay.language key="clienteCol" />: </strong>${cliente.getData()}</li>
63 </#if>
64 <#if fechaEjecucion.getData()?has_content>
65 <li><strong><@liferay.language key="fechaCol" />: </strong>${fechaEjecucion.getData()}</li>
66 </#if>
67 <ul>
68 </#if>
69 </div>
70 </div>
71 </#if>
72</div>
73<#if datosSignificativos.dato?has_content>
74 <#if datosSignificativos.dato.getSiblings()?has_content>
75 <#assign firstDatoNotEmpty = false />
76 <#if datosSignificativos.dato.getSiblings()?size == 1>
77 <#assign firstDato = datosSignificativos.dato.getSiblings()?first>
78 <#if firstDato??>
79 <#if (firstDato.icono?? && firstDato.icono.getData()?? && firstDato.icono.getData() != "") || (firstDato.nombreDato?? && firstDato.nombreDato.getData()?? && firstDato.nombreDato.getData() != "")
80 || (firstDato.subtituloDato.getData()?? && firstDato.subtituloDato.getData() != "")>
81 <#assign firstDatoNotEmpty = true />
82 </#if>
83 </#if>
84 <#else>
85 <#assign firstDatoNotEmpty = true />
86 </#if>
87 <#if firstDatoNotEmpty>
88 <div class="pB35">
89 <div class="flexbox">
90 <#if datosSignificativos.dato.getSiblings()?has_content>
91 <#list datosSignificativos.dato.getSiblings() as cur_dato>
92 <div class="flexColumna blueBox cornerBR">
93 <#if cur_dato.iconoDato.getData()?? && cur_dato.iconoDato.getData() != "">
94 <div class="blueBox-image">
95 <img data-fileentryid="${cur_dato.iconoDato.getAttribute("fileEntryId")}" alt="${cur_dato.iconoDato.getAttribute("alt")}" src="${cur_dato.iconoDato.getData()}" class="img46" />
96 </div>
97 </#if>
98 <div class="blueBox-text">
99 <h4 class="txtAzulOscuro">${cur_dato.nombreDato.getData()}</h4>
100 <p>${cur_dato.subtituloDato.getData()}</p>
101 </div>
102 </div>
103 </#list>
104 </#if>
105 </div>
106 </div>
107 </#if>
108 </#if>
109</#if>
110<#if video.linkVideoExterno.getData()?? || video.linkVideoExterno.getData() != "">
111 <div class="row pB35">
112 <div class="col-12">
113 <h2 class="title mB10">${video.tituloVideo.getData()}</h2>
114 <p>${video.subtituloVideo.getData()}</p>
115 </div>
116 <#if video.linkVideoExterno.getData()?? && video.linkVideoExterno.getData() != "">
117 <div class="col-12 col-md-6">
118 <div class="embed-responsive embed-responsive-16by9">
119 <iframe class="embed-responsive-item" src="${video.linkVideoExterno.getData()}" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"></iframe>
120 </div>
121 </div>
122 </#if>
123 <#if video.linkVideoInterno.getData()?? && video.linkVideoInterno.getData() != "">
124 <div class="col-12 col-md-6">
125 <div class="embed-responsive embed-responsive-16by9">
126 <#if video.imagenVideo??>
127 <#if video.imagenVideo.getData()?? && video.imagenVideo.getData() != "">
128 <video controls poster="${video.imagenVideo.getData()}" preload="metadata">
129 <source src="${video.linkVideoInterno.getData()}" type="video/mp4">
130 <source src="${video.linkVideoInterno.getData()}" type="video/ogg" />
131 <source src="${video.linkVideoInterno.getData()}" type="video/webm" />
132 </video>
133 <#else>
134 <video controls preload="metadata">
135 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/mp4">
136 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/ogg" />
137 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/webm" />
138 </video>
139 </#if>
140 <#else>
141 <video controls preload="metadata">
142 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/mp4">
143 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/ogg" />
144 <source src="${video.linkVideoInterno.getData()}#t=1" type="video/webm" />
145 </video>
146 </#if>
147 </div>
148 </div>
149 </#if>
150 </div>
151</#if>
152<#-- El mapa solo se muestra si Latitud y Longitud están informadas -->
153<#assign latitude = "" />
154<#assign longitude = "" />
155<#assign hasCoordinates = false />
156
157<#if separadorCoordenadas??
158 && separadorCoordenadas.latitud??
159 && separadorCoordenadas.longitud??>
160
161 <#assign latitude =
162 separadorCoordenadas.latitud.getData()?trim
163 />
164
165 <#assign longitude =
166 separadorCoordenadas.longitud.getData()?trim
167 />
168
169 <#if latitude?has_content && longitude?has_content>
170 <#attempt>
171 <#assign latitude =
172 latitude
173 ?replace(",", ".")
174 ?number
175 />
176
177 <#assign longitude =
178 longitude
179 ?replace(",", ".")
180 ?number
181 />
182
183 <#assign hasCoordinates = true />
184 <#recover>
185 <#assign latitude = "" />
186 <#assign longitude = "" />
187 <#assign hasCoordinates = false />
188 </#attempt>
189 </#if>
190</#if>
191
192<#if hasCoordinates>
193 <#assign googleMapsAPIKey =
194 themeDisplay
195 .getScopeGroup()
196 .getTypeSettingsProperties()
197 .getProperty("googleMapsAPIKey", "")
198 />
199
200 <div class="row pB35">
201 <div class="wrap-content mT30 mB60 clearfix col-12">
202 <div
203 id="traza-maps"
204 class="js-maptraza"
205 style="position: relative; overflow: hidden;"
206 >
207 <div
208 class="lfr-map yui3-widget lfrmapgoogle"
209 id="geolocalizacionMap"
210 style="position: relative; overflow: hidden;"
211 ></div>
212 </div>
213 </div>
214 </div>
215
216 <script type="text/javascript">
217 function initMap() {
218 var mapElement =
219 document.getElementById("geolocalizacionMap");
220
221 if (!mapElement) {
222 return;
223 }
224
225 var project = {
226 lat: ${latitude?c},
227 lng: ${longitude?c}
228 };
229
230 var map = new google.maps.Map(
231 mapElement,
232 {
233 zoom: 18,
234 center: project
235 }
236 );
237
238 new google.maps.Marker({
239 position: project,
240 map: map
241 });
242 }
243 </script>
244
245 <script
246 async
247 defer
248 src="https://maps.googleapis.com/maps/api/js?key=${googleMapsAPIKey}&callback=initMap"
249 ></script>
250</#if>
251<#assign back = languageUtil.get(locale, "back-to-top")>
252<button class="volver" onclick="goBack()" style="background-color: #002C58;color: #ffffff;border-radius: 0 0 20px 0;padding: 8px 20px;font-size: 15.5px;color: #fff;background-color: #002C58;border: none;width: auto;height: 42px;float: right;margin-bottom: 1.5em;">< ${back?keep_before(" ")}</button>
253<script>
254 function goBack() {
255 window.history.back();
256 }
257</script>
258<style>
259.pull-right {
260 float: right;
261}
262</style>
