Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing:
==> dlTool.getDLFileEntryByPath(Descargas.Archivo.data) [in template "37703#37743#1558463" at line 242, column 104]
----
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 dlFileEntry = dlTool.getDLFil... [in template "37703#37743#1558463" at line 242, column 81]
----
1<#-- Services -->
2<#assign assetEntryLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")/>
3<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetLinkLocalService")/>
4<#assign journalArticleResourceServiceUtil = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")/>
5<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
6<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
7
8<#-- Reserved vbles -->
9<#assign title = .vars['reserved-article-title'].data>
10<#assign articleId=.vars["reserved-article-id"].data />
11<#assign description=.vars["reserved-article-description"].data />
12<#assign smallImageUrl=.vars["reserved-article-small-image-url"].data />
13<#assign date=.vars["reserved-article-display-date"].data />
14<#assign request = .vars['request']>
15
16<#-- Init -->
17<#assign assetEntry = journalTool.getAssetEntryByArticleId(groupId, articleId)>
18<#assign journalArticle = journalTool.getJournalArticleByAssetEntry(assetEntry)>
19<#assign articleURL = themeDisplay.getURLPortal()+themeDisplay.getURLCurrent()>
20<#assign articleSocialBookmarks = themeDisplay.getThemeSetting("article-social-bookmarks")!>
21<#assign layoutSetBannerPath = layoutTool.getLayoutSetBannerPath(groupId, themeDisplay.getLayout().isPrivateLayout())!>
22<#assign articleMainImageThumbnail3 = dlTool.getThumbnail(smallImageUrl, "3", layoutSetBannerPath)! />
23<#assign articleMainImageThumbnail1 = dlTool.getThumbnail(smallImageUrl, "1")! />
24
25<#assign ddmStructureNameNormalize = "template-${friendlyURLNormalizerTool.normalize(journalArticle.getDDMStructure().getName(localeUtil.getDefault()))}" />
26
27<#function sanitizeURL url>
28 <#if !url?has_content>
29 <#return "" />
30 </#if>
31 <#assign urlTrimmed = url?trim />
32 <#if urlTrimmed?starts_with("javascript:") || urlTrimmed?starts_with("data:") || urlTrimmed?starts_with("vbscript:")>
33 <#return "" />
34 </#if>
35 <#return htmlUtil.escapeHREF(urlTrimmed) />
36</#function>
37
38<#function isExternalURL url>
39 <#if !url?has_content>
40 <#return false />
41 </#if>
42 <#assign portalURLlc = themeDisplay.getPortalURL()?lower_case />
43 <#assign urlLC = url?lower_case />
44 <#assign isHttp = urlLC?starts_with("http://") || urlLC?starts_with("https://") />
45 <#assign isInternal = (url?starts_with("/")) || (isHttp && urlLC?starts_with(portalURLlc)) />
46 <#return isHttp && !isInternal />
47</#function>
48
49<#-- Build -->
50<#if Nombre.data?has_content>
51 <#assign title = Nombre.data>
52</#if>
53<#assign altImgDestacada = title />
54<#if AltImagenDestacada ??>
55 <#if validator.isNotNull(AltImagenDestacada.getData())>
56 <#assign altImgDestacada = AltImagenDestacada.getData() />
57 </#if>
58</#if>
59<#assign articleMainImageThumbnail3Safe = sanitizeURL(articleMainImageThumbnail3) />
60<#assign articleMainImageThumbnail1Safe = sanitizeURL(articleMainImageThumbnail1) />
61
62<#-- Validaciones de TAB -->
63<#assign limitacionPeso = (AsturiasMascotas.LimitacionPeso.data)!"" />
64<#assign NumeroMaximoPersona = (AsturiasMascotas.NumeroMaximoPersona.data)!"" />
65<#assign NumeroMaximoInterior = (AsturiasMascotas.NumeroMaximoInterior.data)!"" />
66<#assign AccesoInterior = (AsturiasMascotas.AccesoInterior.data)!"" />
67<#assign admitePPP = (AsturiasMascotas.AdmitePPP.data)!"" />
68<#assign AccesoTerraza = (AsturiasMascotas.AccesoTerraza.data)!"" />
69<#assign otrasMascotas = (AsturiasMascotas.OtrasMascotas.data)!"" />
70<#assign otrosAnimales = (AsturiasMascotas.OtrosAnimales.data)!"" />
71<#assign detalleNormas = (AsturiasMascotas.DetalleNormas.data)!"" />
72
73<#assign hasIconos = limitacionPeso?has_content || NumeroMaximoPersona?has_content || NumeroMaximoInterior?has_content || AccesoInterior?has_content />
74<#assign hasNormas = admitePPP?has_content || AccesoTerraza?has_content || otrasMascotas?has_content || detalleNormas?has_content />
75
76<article class="template ${ddmStructureNameNormalize}" role="article">
77 <header class="article-header-wrapper row no-gutters">
78 <div class="article-header-container article-header-container-static">
79 <div class="container">
80 <div class="row no-gutters">
81 <div class="col-md-6">
82 <div class="article-image" style="background-image: url('${sanitizeURL(articleMainImageThumbnail3Safe)}')" role="img" aria-label="${altImgDestacada}">
83 <img class="hide-accessible" src="${sanitizeURL(articleMainImageThumbnail3Safe)}" alt=""/>
84 </div>
85 </div>
86 <div class="article-info-wrapper col-md-6">
87 <div class="article-info">
88 <h2 class="article-title" >${title}</h2>
89 <div class="article-list-wrapper">
90 <ul class="article-list list-unstyled article-list-info">
91 <li class="article-list-item mb-4">
92 <span class="fas fa-map-marker-alt" aria-hidden="true"></span>
93 <span class="hide-accessible">${languageUtil.get(request,"location")}</span>
94 <span class="field-wrapper">
95 <#if Contacto.Concejo?? && Contacto.Concejo.data?has_content>
96 <span class="important">${Contacto.Concejo.data}</span>
97 </#if>
98 <#if Contacto.Zona?? && Contacto.Zona.data?has_content>
99 <span class="text d-block">${Contacto.Zona.data}</span>
100 </#if>
101 </span>
102 </li>
103 <#if Contacto.Direccion?? && Contacto.Direccion.data?has_content || Contacto.CP?? && Contacto.CP.data?has_content || Contacto.Localidad?? && Contacto.Localidad.data?has_content>
104 <li class="article-list-item">
105 <span class="far fa-address-card" aria-hidden="true"></span>
106 <span class="hide-accessible">${languageUtil.get(request,"address")}</span>
107 <span class="field-wrapper">
108 <span class="field">${languageUtil.get(request, "address")}:</span>
109 <span class="text">${(Contacto.Direccion.data)!}</span><span aria-hidden="true"> ■ </span>
110 <span class="text">${(Contacto.CP.data)!} - ${(Contacto.Localidad.data)!}</span>
111 </span>
112 </li>
113 </#if>
114
115 <#if Contacto.Telefono?? && Contacto.Telefono.data?has_content>
116 <li class="article-list-item">
117 <span class="fas fa-phone-alt" aria-hidden="true"></span>
118 <span class="hide-accessible">${languageUtil.get(request, "phone")}</span>
119 <span class="field-wrapper">
120 <span class="field">${languageUtil.get(request, "phone")}:</span>
121 <#list Contacto.Telefono.getSiblings() as telephone>
122 <#if telephone.data?has_content>
123 <#assign rawTelefono = telephone.data?trim />
124 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
125 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
126 <#assign numberLength = numberTelefono?length />
127 <#if numberLength == 9>
128 <#assign hrefNumber = "+34${numberTelefono}" />
129 <#else>
130 <#assign hrefNumber = numberTelefono />
131 </#if>
132 <span class="text">
133 <a href="tel:${htmlUtil.escapeHREF(hrefNumber)}" aria-label="${languageUtil.format(request, 'call', rawTelefono)}">
134 ${rawTelefono}
135 </a>
136 <#if !telephone?is_last><span aria-hidden="true"> | </span></#if>
137 </span>
138 </#if>
139 </#list>
140 </span>
141 </li>
142 </#if>
143
144 <#if Contacto.Email?? && Contacto.Email.data?has_content>
145 <li class="article-list-item">
146 <span class="far fa-envelope" aria-hidden="true"></span>
147 <span class="hide-accessible">${languageUtil.get(request,"email")}</span>
148 <span class="field-wrapper">
149 <span class="field">${languageUtil.get(request, "email")}:</span>
150 <span class="text">
151 <#list Contacto.Email.getSiblings() as Item>
152 <#if Item.data?trim?has_content>
153 <#assign emailAddress = Item.data?trim />
154 <a href="mailto:${htmlUtil.escapeHREF(emailAddress)}" aria-label="${languageUtil.format(request,'email-to', emailAddress)}">
155 ${emailAddress}
156 </a>
157 <#if Item_has_next>, </#if>
158 </#if>
159 </#list>
160 </span>
161 </span>
162 </li>
163 </#if>
164
165 <#if Contacto.Web?? && Contacto.Web.getSiblings()?has_content>
166 <#assign hasValidURL = false />
167 <#list Contacto.Web.getSiblings() as web>
168 <#if web.data?trim?has_content>
169 <#assign linkURL = web.data?trim />
170 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
171 <#assign hasValidURL = true />
172 <#break>
173 </#if>
174 </#if>
175 </#list>
176 <#if hasValidURL>
177 <li class="article-list-item web">
178 <span class="fas fa-link" aria-hidden="true"></span>
179 <span class="field-wrapper d-inline-flex flex-wrap align-items-center gap-2">
180 <span class="field mr-1">${languageUtil.get(request, "site")}:</span>
181 <#assign webCount = 0 />
182 <#list Contacto.Web.getSiblings() as web>
183 <#if web.data?trim?has_content>
184 <#assign linkURL = web.data?trim />
185 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
186 <#assign webCount = webCount + 1 />
187 </#if>
188 </#if>
189 </#list>
190 <#assign validIndex = 0 />
191 <#list Contacto.Web.getSiblings() as web>
192 <#if web.data?trim?has_content>
193 <#assign linkURL = web.data?trim />
194 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
195 <#if !stringUtil.startsWith(linkURL, "http://") && !stringUtil.startsWith(linkURL, "https://")>
196 <#assign linkURL = "https://${linkURL}" />
197 </#if>
198 <#assign validIndex = validIndex + 1 />
199 <#assign linkNumber = validIndex />
200 <a href="${htmlUtil.escapeHREF(linkURL)}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.get(request, 'site')} ${linkNumber} - ${htmlUtil.escape(title)} (${languageUtil.get(request, 'opens-new-window')})" class="text d-inline-flex align-items-center gap-1 text-nowrap">
201 <#if webCount gt 1>
202 ${languageUtil.get(request, "visit")} ${linkNumber}
203 <#else>
204 ${languageUtil.get(request, "visit")}
205 </#if>
206 <span class="fas fa-external-link-alt ml-1 font-size-08" aria-hidden="true"></span>
207 </a>
208 <#if validIndex lt webCount>
209 <span class="mx-2 text-muted">|</span>
210 </#if>
211 </#if>
212 </#if>
213 </#list>
214 </span>
215 </li>
216 </#if>
217 </#if>
218
219 <#if Informacion.Horario?? && Informacion.Horario.data?has_content || Informacion.Tarifas?? && Informacion.Tarifas.data?has_content>
220 <li class="article-list-item web">
221 <span class="fas fa-clock" aria-hidden="true"></span>
222 <span class="field-wrapper">
223 <span class="field">${languageUtil.get(request, "infoasturias-horarios-y-tarifas")}:</span>
224 <span class="text">
225 <a href="#tabContent2" class="internal-tab-link" data-tab-heading="tabHeading2" data-tab-content="tabContent2" aria-label="${languageUtil.get(request, 'infoasturias-horarios-y-tarifas')}">
226 ${languageUtil.get(request, "view")}
227 <span class="fas fa-caret-right ml-1 font-size-08" aria-hidden="true"></span>
228 </a>
229 </span>
230 </span>
231 </li>
232 </#if>
233 <#if Informacion.Visit?? && Informacion.Visit.data?has_content>
234 <li class="article-list-item web">
235 <span class="fas fa-door-open" aria-hidden="true"></span>
236 <span class="field-wrapper">
237 <span class="field">${Informacion.Visit.data}</span>
238 </span>
239 </li>
240 </#if>
241 <#if Descargas?? || Descargas.Archivo?? && Descargas.Archivo.data?has_content>
242 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Descargas.Archivo.data) />
243 <#if (dlFileEntry)!?has_content>
244 <#assign ext = dlFileEntry.getExtension()! />
245 <li class="article-list-item document document-${htmlUtil.escape(ext)}">
246 <span class="fas fa-file" aria-hidden="true"></span>
247 <span class="hide-accessible">${languageUtil.get(request,"related-documents")}</span>
248 <span class="field-wrapper">
249 <span class="field">${languageUtil.get(request, "related-documents")}:</span>
250 <span class="text">
251 <#list Descargas.Archivo.getSiblings() as Item>
252 <#if Item.data?has_content>
253 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Item.data) />
254 <#if validator.isNotNull(dlFileEntry)>
255 <#assign downloadURL = sanitizeURL("/documents/${groupId}/${dlFileEntry.getUuid()}") />
256 <#assign fileSize = dlFileEntry.getSize() />
257 <#assign fileSizeKB = (fileSize / 1024)?round />
258 <#assign fileExt = dlFileEntry.getExtension()?upper_case />
259 <#if Item.ArchivoTitulo.data?has_content>
260 <#assign fileName = Item.ArchivoTitulo.data />
261 <#else>
262 <#assign fileName = dlFileEntry.getTitle() />
263 </#if>
264 <#assign downloadLabel = languageUtil.get(request, 'download') />
265 <#assign formatLabel = languageUtil.get(request, 'format') />
266 <#assign sizeLabel = languageUtil.get(request, 'size') />
267 <#assign kbLabel = languageUtil.get(request, 'kb') />
268 <#assign ariaLabelText = "${downloadLabel} ${fileName}, ${formatLabel} ${fileExt}, ${sizeLabel} ${fileSizeKB} ${kbLabel}" />
269 <a href="${downloadURL}" download aria-label="${ariaLabelText}">
270 ${fileName}
271 <span class="file-info" aria-hidden="true">
272 (${fileExt}, ${fileSizeKB} KB)
273 </span>
274 <span class="fas fa-download ml-1" aria-hidden="true"></span>
275 </a>
276 <#if Item_has_next>, </#if>
277 </#if>
278 </#if>
279 </#list>
280 </span>
281 </span>
282 </li>
283 </#if>
284 </#if>
285 </ul>
286 </div>
287 <#if (RedesSociales.Facebook.data)!?has_content || (RedesSociales.Twitter.data)!?has_content || (RedesSociales.Instagram.data)!?has_content || (RedesSociales.Youtube.data)!?has_content || (RedesSociales.TikTok.data)!?has_content || (RedesSociales.Pinterest.data)!?has_content || (RedesSociales.Rss.data)!?has_content || (RedesSociales.OtrosCanales.NombreCanal.data)!?has_content>
288 <div class="article-socials-wrapper mt-4">
289 <div class="socials-wrapper">
290 <div class="socials">
291 <ul class="list-inline items socials">
292 <#if RedesSociales.Facebook.data?has_content>
293 <#assign linkURLRaw = RedesSociales.Facebook.data?trim />
294 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
295 <#assign linkURLRaw = "https://${linkURLRaw}" />
296 </#if>
297 <#assign linkURL = sanitizeURL(linkURLRaw) />
298 <#if linkURL?has_content>
299 <li class="list-inline-item item facebook">
300 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Facebook')} ${languageUtil.get(request,'opens-new-window')}">
301 <span class="fab fa-facebook-f" aria-hidden="true"></span>
302 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Facebook')}</span>
303 </a>
304 </li>
305 </#if>
306 </#if>
307 <#if RedesSociales.Twitter.data?has_content>
308 <#assign linkURLRaw = RedesSociales.Twitter.data?trim />
309 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
310 <#assign linkURLRaw = "https://${linkURLRaw}" />
311 </#if>
312 <#assign linkURL = sanitizeURL(linkURLRaw) />
313 <#if linkURL?has_content>
314 <li class="list-inline-item item twitter">
315 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','X (Twitter)')} ${languageUtil.get(request,'opens-new-window')}">
316 <span class="fa-brands fa-x-twitter" aria-hidden="true"></span>
317 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','X (Twitter)')}</span>
318 </a>
319 </li>
320 </#if>
321 </#if>
322 <#if RedesSociales.Instagram.data?has_content>
323 <#assign linkURLRaw = RedesSociales.Instagram.data?trim />
324 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
325 <#assign linkURLRaw = "https://${linkURLRaw}" />
326 </#if>
327 <#assign linkURL = sanitizeURL(linkURLRaw) />
328 <#if linkURL?has_content>
329 <li class="list-inline-item item instagram">
330 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Instagram')} ${languageUtil.get(request,'opens-new-window')}">
331 <span class="fab fa-instagram" aria-hidden="true"></span>
332 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Instagram')}</span>
333 </a>
334 </li>
335 </#if>
336 </#if>
337 <#if RedesSociales.Youtube.data?has_content>
338 <#assign linkURLRaw = RedesSociales.Youtube.data?trim />
339 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
340 <#assign linkURLRaw = "https://${linkURLRaw}" />
341 </#if>
342 <#assign linkURL = sanitizeURL(linkURLRaw) />
343 <#if linkURL?has_content>
344 <li class="list-inline-item item youtube">
345 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','YouTube')} ${languageUtil.get(request,'opens-new-window')}">
346 <span class="fab fa-youtube" aria-hidden="true"></span>
347 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','YouTube')}</span>
348 </a>
349 </li>
350 </#if>
351 </#if>
352 <#if (RedesSociales.Tiktok.data)!?has_content>
353 <#assign linkURLRaw = RedesSociales.Tiktok.data?trim />
354 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
355 <#assign linkURLRaw = "https://${linkURLRaw}" />
356 </#if>
357 <#assign linkURL = sanitizeURL(linkURLRaw) />
358 <#if linkURL?has_content>
359 <li class="list-inline-item item tiktok">
360 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','TikTok')} ${languageUtil.get(request,'opens-new-window')}">
361 <span class="fab fa-tiktok" aria-hidden="true"></span>
362 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','TikTok')}</span>
363 </a>
364 </li>
365 </#if>
366 </#if>
367 <#if RedesSociales.Pinterest.data?has_content>
368 <#assign linkURLRaw = RedesSociales.Pinterest.data?trim />
369 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
370 <#assign linkURLRaw = "https://${linkURLRaw}" />
371 </#if>
372 <#assign linkURL = sanitizeURL(linkURLRaw) />
373 <#if linkURL?has_content>
374 <li class="list-inline-item item pinterest">
375 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Pinterest')} ${languageUtil.get(request,'opens-new-window')}">
376 <span class="fab fa-pinterest-p" aria-hidden="true"></span>
377 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Pinterest')}</span>
378 </a>
379 </li>
380 </#if>
381 </#if>
382 <#if RedesSociales.Rss.data?has_content>
383 <#assign linkURLRaw = RedesSociales.Rss.data?trim />
384 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
385 <#assign linkURLRaw = "https://${linkURLRaw}" />
386 </#if>
387 <#assign linkURL = sanitizeURL(linkURLRaw) />
388 <#if linkURL?has_content>
389 <li class="list-inline-item item rss">
390 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','RSS')} ${languageUtil.get(request,'opens-new-window')}">
391 <span class="fas fa-rss" aria-hidden="true"></span>
392 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','RSS')}</span>
393 </a>
394 </li>
395 </#if>
396 </#if>
397 <#if RedesSociales.OtrosCanales.NombreCanal??>
398 <#list RedesSociales.OtrosCanales.NombreCanal.getSiblings() as Canal>
399 <#if Canal.CanalUrl.data?trim?has_content && Canal.data?trim?has_content>
400 <#assign linkURLRaw = Canal.CanalUrl.data?trim />
401 <#assign canalName = Canal.data?trim />
402 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
403 <#assign linkURLRaw = "https://${linkURLRaw}" />
404 </#if>
405 <#assign linkURL = sanitizeURL(linkURLRaw) />
406 <#if linkURL?has_content>
407 <li class="list-inline-item item other-channel">
408 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x', canalName)} ${languageUtil.get(request,'opens-new-window')}">
409 <span class="fas fa-share-alt" aria-hidden="true"></span>
410 <span class="hide-accessible">${languageUtil.format(request,'go-to-x', canalName)}</span>
411 </a>
412 </li>
413 </#if>
414 </#if>
415 </#list>
416 </#if>
417 </ul>
418 </div>
419 </div>
420 </div>
421 </#if>
422 </div>
423 </div>
424 </div>
425 </div>
426 </div>
427 </header>
428
429 <div class="sheet sheet-lg">
430 <div class="article-section">
431 <#if (Informacion.Titulo.data)!?has_content>
432 <div class="article-great">
433 ${Informacion.Titulo.data}
434 </div>
435 </#if>
436 <#if Contenido?? && Contenido.getSiblings()?has_content>
437 <#list Contenido.getSiblings() as Item>
438 <#-- Extraer datos con protección -->
439 <#assign tituloData = (Item.ContenidoTitulo.data)!"" />
440 <#assign textoData = (Item.ContenidoTexto.data)!"" />
441 <#assign imagenData = (Item.ContenidoTexto.ContentImagen.data)!"" />
442 <#if tituloData?has_content || textoData?has_content || imagenData?has_content>
443 <#assign tipoHeading = (Item.ContenidoTitulo.headingTipo.data)!"" />
444 <#assign cIndex = Item?index + 1 />
445 <section class="article-section-content" aria-label="${languageUtil.get(request, 'content-section')} ${cIndex}">
446 <#if themeDisplay.isSignedIn()>
447 <aside class="portlet-msg-info infoparrafo" role="note" aria-label="${languageUtil.get(request, 'only-administrators-can-use-this-portlet')}">
448 <p class="text-center mb-0">
449 <span class="fas fa-file-signature font-size-10 mr-2" aria-hidden="true"></span>
450 <#assign cIndex = Item?index + 1 />
451 <strong class="important mr-5">Contenido<#if Item?index gt 0> ${cIndex}</#if></strong>
452 <span class="d-inline font-size-09 mt-2">
453 <span class="fas fa-info-circle mr-1" aria-hidden="true"></span>
454 Información visible únicamente para usuarios logueados
455 </span>
456 </p>
457 </aside>
458 </#if>
459 <#if tituloData?has_content>
460 <#if tipoHeading == "h2">
461 <h2 class="h3 text-center mt-6 mb-5">
462 ${tituloData}
463 </h2>
464 <#elseif tipoHeading == "h3">
465 <h3 class="h3 font-weight-semi-bold mt-6 mb-4">
466 ${tituloData}
467 </h3>
468 <#elseif tipoHeading == "h4">
469 <h4 class="h4 font-weight-semi-bold mt-6 mb-4">
470 ${tituloData}
471 </h4>
472 <#else>
473 <div class="h4 font-weight-normal mt-6 mb-4">
474 ${tituloData}
475 </div>
476 </#if>
477 </#if>
478 <div class="article-section-info">
479 <#if Item.ContenidoTexto?? && Item.ContenidoTexto.getSiblings()?has_content>
480 <#list Item.ContenidoTexto.getSiblings() as secc>
481 <#assign seccionTexto = (secc.data)!"" />
482 <#if seccionTexto?has_content>
483 ${seccionTexto}
484 </#if>
485 <#assign imagenPath = (secc.ContentImagen.data)!"" />
486 <#if imagenPath?has_content>
487 <#assign imagenURL = sanitizeURL(dlTool.getThumbnail(imagenPath, '3')) />
488 <#if imagenURL?has_content>
489 <#assign imgAlt = (secc.ContentImagen.AltImage.data)!"" />
490 <#assign imgTitle = (secc.ContentImagen.TitleImage.data)!"" />
491 <#assign imgPie = (secc.ContentImagen.PieImage.data)!"" />
492 <#assign altText = imgAlt />
493 <#if !altText?has_content && imgTitle?has_content>
494 <#assign altText = imgTitle />
495 </#if>
496 <#if !altText?has_content && imgPie?has_content>
497 <#assign altText = htmlUtil.extractText(imgPie)?trim />
498 </#if>
499 <#if !altText?has_content>
500 <#assign altText = "${languageUtil.get(request, 'image')} ${cIndex}" />
501 </#if>
502 <div class="article-section-image-wrapper">
503 <div class="article-section-image">
504 <img src="${imagenURL}" class="rounded" alt="${htmlUtil.escape(altText)}" <#if imgTitle?has_content>title="${htmlUtil.escape(imgTitle)}"</#if> loading="lazy" />
505 <#if imgPie?has_content>
506 <div class="article-section-image-footer">
507 ${imgPie}
508 </div>
509 </#if>
510 </div>
511 </div>
512 </#if>
513 </#if>
514 </#list>
515 </#if>
516 </div>
517 </section>
518 </#if>
519 </#list>
520 </#if>
521 </div>
522
523 <#assign hasTab1 = (Informacion.Texto?? && Informacion.Texto.data?has_content) />
524 <#assign hasTab2 = (Informacion.Horario?? && Informacion.Horario.data?has_content) || (Informacion.Tarifas?? && Informacion.Tarifas.data?has_content) />
525 <#assign hasTab3 = Reservas?? && ((Reservas.CompraEntradas?? && Reservas.CompraEntradas.data?has_content) || (Reservas.ReservasPhone?? && Reservas.ReservasPhone.data?has_content) || (Reservas.ReservasEmail?? && Reservas.ReservasEmail.data?has_content) || (Reservas.ReservasWhatsapp?? && Reservas.ReservasWhatsapp.data?has_content)) />
526 <#assign hasTab4 = (AsturiasMascotas?? && AsturiasMascotas.LimitacionPeso?? && AsturiasMascotas.LimitacionPeso.data?has_content) />
527 <#assign hasTab5 = Geolocalizacion.Coordenadas.data?has_content>
528 <#assign showFirstTab = true>
529 <div class="article-accordion accordion">
530 <#if Visualizador.Slide.getData()?has_content>
531 <h3 class="h3">${languageUtil.get(locale,"model.resource.com.liferay.portlet.imagegallery")}</h3>
532 <div class="slick article-slick article-section <#if Visualizador.Slide.getSiblings()?size==1>hide</#if>">
533 <#list Visualizador.Slide.getSiblings() as Slide>
534 <#if validator.isNotNull(Slide.getData()) || validator.isNotNull(Slide.SlideUrl.getData())>
535 <#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! />
536 <#assign slideThumbnail2Raw = dlTool.getThumbnailByJSON(Slide.data, "2")! />
537 <#assign slidePathRaw = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
538 <#assign slideUrlRaw = Slide.SlideUrl.data />
539 <#if slideUrlRaw?has_content>
540 <#assign slideTitleRaw = "${languageUtil.get(request, 'video')} ${Slide?index}" />
541 <#if Slide.SlideTitulo.data?has_content>
542 <#assign slideTitleRaw = Slide.SlideTitulo.data />
543 </#if>
544 <#assign slideUrl = stringUtil.replace(slideUrlRaw, 'watch?v=', 'embed/') />
545 <#assign slideThumbnail2Raw = stringUtil.replace(slideUrl, 'www', 'img') />
546 <#assign slideThumbnail2Raw = stringUtil.replace(slideThumbnail2Raw, 'embed', 'vi') />
547 <#assign slideThumbnail2Raw = '${slideThumbnail2Raw}/mqdefault.jpg' />
548 <#if slideUrl?contains("vimeo")>
549 <#assign slideUrl = stringUtil.replace(slideUrl, 'http://vimeo.com/', 'https://player.vimeo.com/video/') />
550 <#assign slideVimeoId = stringUtil.extractLast(slideUrl, 'https://player.vimeo.com/video/') />
551 <#if slideVimeoId?has_content>
552 <#assign slideVimeoJsonPath = 'http://vimeo.com/api/v2/video/${slideVimeoId}.json' />
553 <#assign slideVimeoJsonContent = getUrlContent.getContent(slideVimeoJsonPath)! />
554 <#if slideVimeoJsonContent?has_content>
555 <#assign slideVimeoJsonArray = jsonFactoryUtil.createJSONArray(slideVimeoJsonContent) />
556 <#assign slideVimeoJsonItem = slideVimeoJsonArray.get(0) />
557 <#assign slideThumbnail2Raw = slideVimeoJsonItem.thumbnail_medium />
558 </#if>
559 </#if>
560 </#if>
561 <#assign slideUrlSafe = sanitizeURL(slideUrl) />
562 <#assign slideThumbnail2Safe = sanitizeURL(slideThumbnail2Raw) />
563 <#assign slideTitle = htmlUtil.escape(slideTitleRaw) />
564 <#if slideUrlSafe?has_content && slideThumbnail2Safe?has_content>
565 <div id="slide-${Slide?index}" class="slide">
566 <a class="card card-simple card-video" href="#" role="button" tabindex="0" onclick="event.preventDefault(); showDialogIframe('${slideUrlSafe}', '${slideTitle}', 800, 600, 'videoPopup', 'videoPopupIframe'); return false;" aria-label="${languageUtil.format(request, 'open-video-x', slideTitle)}">
567 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2Safe}')" role="img" aria-label="${slideTitle}">
568 <img class="hide-accessible" src="${slideThumbnail2Safe}" alt="" />
569 </span>
570 </a>
571 </div>
572 </#if>
573 <#else>
574 <#assign slideTitleRaw = "${languageUtil.get(request, 'image')} ${Slide?index}" />
575 <#if Slide.SlideTitulo.data?has_content>
576 <#assign slideTitleRaw = Slide.SlideTitulo.data />
577 </#if>
578
579 <#assign slideAltRaw = slideTitleRaw />
580 <#if Slide.ImagenAlt??>
581 <#if Slide.ImagenAlt.data?has_content>
582 <#assign slideAltRaw = Slide.ImagenAlt.data />
583 </#if>
584 </#if>
585 <#assign slidePath = sanitizeURL(slidePathRaw) />
586 <#assign slideThumbnail2Safe = sanitizeURL(slideThumbnail2Raw) />
587 <#assign slideTitle = htmlUtil.escape(slideTitleRaw) />
588 <#assign slideAlt = htmlUtil.escape(slideAltRaw) />
589 <#if slidePath?has_content && slideThumbnail2Safe?has_content>
590 <div class="slide">
591 <a class="card card-simple lightbox" href="${slidePath}" title="${slideTitle}" aria-label="${languageUtil.format(request, 'view-image-x', slideTitle)}">
592 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2Safe}')" role="img" aria-label="${slideAlt}">
593 <img class="hide-accessible" src="${slideThumbnail2Safe}" alt="" />
594 </span>
595 </a>
596 </div>
597 </#if>
598 </#if>
599 </#if>
600 </#list>
601 </div>
602 </#if>
603
604 <#if hasTab1>
605 <div id="tab1" class="article-section accordion-item">
606 <a href="#tabContent1" id="tabHeading1" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent1" data-toggle="liferay-collapse">
607 <h3 class="h3 accordion-header">${languageUtil.get(request,'info')}</h3>
608 </a>
609 <div id="tabContent1" class="article-section-content article-section-info accordion-collapse collapse <#if showFirstTab>show</#if>" role="region" aria-labelledby="tabHeading1">
610 <#if (Informacion.Texto.data)!?has_content>
611 ${Informacion.Texto.data}
612 </#if>
613 <#if (Informacion.FechaDeConstruccion.data)!?has_content>
614 <span class="field">${languageUtil.get(request, "infoasturias-fecha-de-construccion")}:</span>
615 <span class="text">${Informacion.FechaDeConstruccion.data}</span>
616 </#if>
617 </div>
618 </div>
619 <#assign showFirstTab = false>
620 </#if>
621
622 <#if hasTab2>
623 <div id="tab2" class="article-section accordion-item">
624 <a href="#tabContent2" id="tabHeading2" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent2" data-toggle="liferay-collapse">
625 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-horarios-y-tarifas')}</h3>
626 </a>
627 <div id="tabContent2" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" role="region" aria-labelledby="tabHeading2">
628 <#if Informacion.Horario.data?has_content>
629 <div class="mb-1 font-weight-semi-bold text-success"><span class="far fa-clock mr-2 text-success"></span>${languageUtil.get(request,'infoasturias-horario')}:</div>
630 <div class="mb-4">${Informacion.Horario.data}</div>
631 </#if>
632 <#if Informacion.Tarifas.data?has_content>
633 <div class="mb-1 font-weight-semi-bold text-success"><span class="fas fa-coins mr-2 text-success"></span>${languageUtil.get(request,'infoasturias-tarifas')}:</div>
634 <div>${Informacion.Tarifas.data}</div>
635 </#if>
636 <#if Informacion.Horario.data?has_content || Informacion.Tarifas.data?has_content>
637 <#assign hasWeb = Contacto.Web.data?trim?has_content />
638 <#assign hasTelefono = Contacto.Telefono.data?trim?has_content />
639 <#if hasWeb || hasTelefono>
640 <div class="mt-4 font-size-09 font-italic">
641 <#if hasWeb>
642 ${languageUtil.get(request, 'infoasturias-horarios-web')}
643 <#assign siteURLRaw = Contacto.Web.data?trim />
644 <#if !siteURLRaw?starts_with("http://") && !siteURLRaw?starts_with("https://")>
645 <#assign siteURLRaw = "https://${siteURLRaw}" />
646 </#if>
647 <#assign siteURL = sanitizeURL(siteURLRaw) />
648 <#if siteURL?has_content>
649 <#assign isExternal = isExternalURL(siteURL) />
650 <a href="${siteURL}" <#if isExternal>target="_blank" rel="noopener noreferrer"</#if> aria-label="${languageUtil.get(request, 'site')} - ${title} <#if isExternal>${languageUtil.get(request, 'opens-new-window')}</#if>">
651 ${languageUtil.get(request,'visit')}
652 <#if isExternal>
653 <span class="fas fa-external-link-alt ml-1 font-size-08" aria-hidden="true"></span>
654 </#if>
655 </a>
656 </#if>
657 <#elseif hasTelefono>
658 ${languageUtil.get(request, 'infoasturias-horarios-telefono')}
659 <#list Contacto.Telefono.getSiblings() as telephone>
660 <#assign rawTelefono = telephone.data />
661 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
662 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
663 <#assign numberLength = numberTelefono?length />
664 <#if numberLength == 9>
665 <#assign hrefNumber = "+34${numberTelefono}" />
666 <#else>
667 <#assign hrefNumber = numberTelefono />
668 </#if>
669 <span class="text">
670 <a href="tel:${hrefNumber}">${rawTelefono}</a>
671 <#if !telephone?is_last>|</#if>
672 </span>
673 </#list>
674 </#if>
675 </div>
676 </#if>
677 </#if>
678 </div>
679 </div>
680 <#assign showFirstTab = false>
681 </#if>
682
683 <#if hasTab3>
684 <#if (Reservas.CompraEntradas?? && Reservas.CompraEntradas.data?has_content) || (Reservas.ReservasPhone?? && Reservas.ReservasPhone.data?has_content) || (Reservas.ReservasEmail?? && Reservas.ReservasEmail.data?has_content) || (Reservas.ReservasWhatsapp?? && Reservas.ReservasWhatsapp.data?has_content)>
685 <div id="tab3" class="article-section accordion-item">
686 <a href="#tabContent3" id="tabHeading3" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent3" data-toggle="liferay-collapse">
687 <h3 class="h3 accordion-header">${languageUtil.get(request,'booking-action')}</h3>
688 </a>
689 <div id="tabContent3" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading3" role="region">
690 <#if Reservas.CompraEntradas.data?has_content>
691 <#assign compraURL = sanitizeURL(Reservas.CompraEntradas.data?trim) />
692 <#if compraURL?has_content>
693 <div class="text-center">
694 <a class="btn btn-primary mb-3" href="${compraURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.get(request,'infoasturias-compra-entradas')} ${languageUtil.get(request,'opens-new-window')}">
695 <span class="fas fa-ticket-alt mr-2" aria-hidden="true"></span>
696 ${languageUtil.get(request,'infoasturias-compra-entradas')}
697 </a>
698 </div>
699 </#if>
700 </#if>
701 <#if Reservas.ReservasPhone.data?has_content>
702 <#assign rawTelefono = Reservas.ReservasPhone.data?trim />
703 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
704 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
705 <#assign numberLength = numberTelefono?length />
706 <#if numberLength == 9>
707 <#assign hrefNumber = "+34${numberTelefono}" />
708 <#else>
709 <#assign hrefNumber = numberTelefono />
710 </#if>
711 <div class="text-center">
712 <a class="btn btn-primary mb-3" href="tel:${htmlUtil.escapeHREF(hrefNumber)}" aria-label="${languageUtil.format(request,'call', rawTelefono)}">
713 <span class="fas fa-phone-alt mr-2" aria-hidden="true"></span>
714 ${languageUtil.get(request,'infoasturias-telefono')}
715 </a>
716 </div>
717 </#if>
718 <#if Reservas.ReservasEmail.data?has_content>
719 <#assign emailAddress = Reservas.ReservasEmail.data?trim />
720 <div class="text-center">
721 <a class="btn btn-primary mb-3" href="mailto:${htmlUtil.escapeHREF(emailAddress)}" aria-label="${languageUtil.format(request,'email-to', emailAddress)}">
722 <span class="fas fa-envelope mr-2" aria-hidden="true"></span>
723 ${languageUtil.get(request,'infoasturias-email')}
724 </a>
725 </div>
726 </#if>
727 <#if Reservas.ReservasWhatsapp.data?has_content>
728 <#assign rawWhatsapp = Reservas.ReservasWhatsapp.data?trim />
729 <#assign cleanWhatsapp = rawWhatsapp?replace("[^0-9]", "", "r") />
730 <#if cleanWhatsapp?has_content>
731 <#assign whatsappURL = "https://wa.me/34${cleanWhatsapp}" />
732 <#assign whatsappURLSafe = sanitizeURL(whatsappURL) />
733 <#if whatsappURLSafe?has_content>
734 <div class="text-center">
735 <a class="btn btn-primary mb-3" href="${whatsappURLSafe}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x', rawWhatsapp)} ${languageUtil.get(request,'opens-new-window')}">
736 <span class="fab fa-whatsapp mr-2" aria-hidden="true"></span>
737 Whatsapp
738 </a>
739 </div>
740 </#if>
741 </#if>
742 </#if>
743 </div>
744 </div>
745 </#if>
746 <#assign showFirstTab = false />
747 </#if>
748
749 <#if hasTab4>
750 <div id="tab4" class="article-section accordion-item">
751 <a href="#tabContent4" id="tabHeading4" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent4" data-toggle="liferay-collapse">
752 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-info-mascotas')}</h3>
753 </a>
754 <div id="tabContent4" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading4" role="region">
755 <#if hasIconos>
756 <div class="list-iconos mb-3 d-flex flex-wrap justify-content-center">
757 <#if limitacionPeso?has_content>
758 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
759 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Limitación de tamaño") />
760 <#if imgArray?has_content && imgArray[0]?has_content>
761 <div>
762 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-peso')}" loading="lazy">
763 <span class="value">${limitacionPeso}</span>
764 </div>
765 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-peso')}</span>
766 </#if>
767 </div>
768 </#if>
769 <#if NumeroMaximoPersona?has_content>
770 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
771 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Número máximo de perros por persona") />
772 <#if imgArray?has_content && imgArray[0]?has_content>
773 <div>
774 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}" loading="lazy">
775 <span class="value-icono">${NumeroMaximoPersona}</span>
776 </div>
777 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}</span>
778 </#if>
779 </div>
780 </#if>
781 <#if NumeroMaximoPersona?has_content>
782 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
783 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Cupo máximo de perros en el interior") />
784 <#if imgArray?has_content && imgArray[0]?has_content>
785 <div>
786 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}" loading="lazy">
787 <span class="value-icono">${NumeroMaximoPersona}</span>
788 </div>
789 <span class="text-value">${languageUtil.get(request,'infoasturias-maximo-interior')}</span>
790 </#if>
791 </div>
792 </#if>
793 <#if AccesoInterior?has_content>
794 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
795 <#if AccesoInterior == "Si">
796 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Accesso al interior") />
797 <#if imgArray?has_content && imgArray[0]?has_content>
798 <div><img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-material')}" loading="lazy"></div>
799 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-interior')}</span>
800 </#if>
801 <#else>
802 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Sin acceso interior") />
803 <#if imgArray?has_content && imgArray[0]?has_content>
804 <div><img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-no-material')}" loading="lazy"></div>
805 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-no-interior')}</span>
806 </#if>
807 </#if>
808 </div>
809 </#if>
810 </div>
811 </#if>
812 <#if hasNormas>
813 <div class="article-info-table mb-2">
814 <div class="normas-mascotas">
815 <h4 class="mb-4 text-success text-center article-info-border">
816 ${languageUtil.get(request,'infoasturias-normas-mascotas')}
817 </h4>
818 <ul class="list-unstyled" role="list">
819 <#if admitePPP?has_content>
820 <li class="d-flex align-items-start mb-2">
821 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
822 <span class="text-rule">
823 <#if admitePPP == "Si">
824 ${languageUtil.get(request,'infoasturias-mascotas-ppp')}.
825 <#else>
826 ${languageUtil.get(request,'infoasturias-mascotas-no-ppp')}.
827 </#if>
828 </span>
829 </li>
830 </#if>
831 <#if AccesoTerraza?has_content>
832 <li class="d-flex align-items-start mb-2">
833 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
834 <span class="text-rule">
835 <#if AccesoTerraza == "Si">
836 ${languageUtil.get(request,'infoasturias-mascotas-terraza')}.
837 <#else>
838 ${languageUtil.get(request,'infoasturias-mascotas-no-terraza')}.
839 </#if>
840 </span>
841 </li>
842 </#if>
843 <#if otrasMascotas?has_content>
844 <li class="d-flex align-items-start mb-2">
845 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
846 <span class="text-rule">
847 <#if otrasMascotas == "Si">
848 ${languageUtil.get(request,'infoasturias-otras-mascotas')}:
849 <#if otrosAnimales?has_content>
850 <strong>${otrosAnimales}</strong>
851 </#if>
852 <#else>
853 ${languageUtil.get(request,'infoasturias-no-otras-mascotas')}.
854 </#if>
855 </span>
856 </li>
857 </#if>
858 <#if detalleNormas?has_content>
859 <#assign normasParagraphs = detalleNormas?split('</p>') />
860 <#list normasParagraphs as parrafo>
861 <#if parrafo?trim?has_content>
862 <#assign cleanParrafo = parrafo?replace('<p>', '')?replace('<p[^>]*>', '', 'r')?trim />
863 <#if cleanParrafo?has_content>
864 <li class="d-flex align-items-start mb-2">
865 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
866 <span class="text-rule">${cleanParrafo}</span>
867 </li>
868 </#if>
869 </#if>
870 </#list>
871 </#if>
872 </ul>
873 </div>
874 </div>
875 </#if>
876 </div>
877 <#assign showFirstTab = false>
878 </div>
879 </#if>
880 <#if hasTab5>
881 <#assign coordenadas=stringUtil.split(Geolocalizacion.Coordenadas.data) />
882 <div id="tab5" class="article-section article-section-map accordion-item">
883 <a href="#tabContent5" id="tabHeading5" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent5" data-toggle="liferay-collapse">
884 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-how-to-get')}</h3>
885 </a>
886 <div id="tabContent5" class="article-section-content accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading5" role="region">
887 <div id="article-map-wrapper-${articleId}" class="article-map-wrapper">
888 <div id="article-map-content-${articleId}" style="width: 100%; height: 500px; z-index:1" role="application" aria-label="${languageUtil.format(request,'infoasturias-mapa-de', title)}"><!-- MAP --></div>
889 <div class="hide-accessible" aria-live="polite">
890 <p>${languageUtil.get(request,'first-name')}: ${title}</p>
891 <p>GPS: ${Geolocalizacion.Coordenadas.data}</p>
892 <#if (Contacto.Direccion.data)?has_content || ((Contacto.CP.data)?has_content) || ((Contacto.Localidad.data)?has_content)>
893 <p>${languageUtil.get(request,'address')}: ${((Contacto.Direccion.data)!)?js_string} ■ ${((Contacto.CP.data)!)} - ${((Contacto.Localidad.data)!)?js_string}</p>
894 </#if>
895 </div>
896 <div class="article-map-form">
897 <div class="name important">${title}</div>
898 <div class="gps"><span class="label">GPS:</span> <span class="value important">${Geolocalizacion.Coordenadas.data}</span></div>
899 <form action="https://maps.google.es/maps" method="get" target="_blank">
900 <input type="hidden" name="daddr" value="${coordenadas[0]},${coordenadas[1]}">
901 <label for="saddrText"><span class="label hide-accessible">${languageUtil.get(request,'infoasturias-insert-from')}: </span></label>
902 <label for="saddr"><span class="label">${languageUtil.get(request,'infoasturias-from')}: </span></label>
903 <input class="form-control" type="text" maxlength="40" name="saddrText" id="saddrText" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
904 <input class="form-control" type="hidden" name="saddr" id="saddr" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
905 <button class="btn btn-text" type="submit">${languageUtil.get(request,'infoasturias-como-llegar')} »</button>
906 </form>
907 </div>
908 </div>
909 <script src="/o/turismo-asturias-theme/js/leaflet/leaflet.js"></script>
910 <script type="text/javascript">
911 AUI().ready('aui-base', function(A){
912 var lat = ${coordenadas[0]},
913 lng = ${coordenadas[1]},
914 zoom = 16;
915 mapContent = new L.map('article-map-content-${articleId}', {center: [lat, lng], zoom: 16});
916
917 //Marker
918 var defaultIconTheme = '/o/turismo-asturias-theme/css/images/icons/mark-box.png';
919 var defaultIcon = L.icon({
920 iconUrl: defaultIconTheme,
921 iconSize: [36, 53],
922 iconAnchor: [18, 53],
923 iconShadow: [0,0],
924 popupAnchor: [0, -30]
925 });
926 var marker = L.marker([lat, lng], {icon: defaultIcon}).addTo(mapContent);
927
928 var contentString = '<div class="row">';
929 contentString += '<div class="col-12">';
930 contentString += '<div class="h4">${htmlUtil.escape(title)}</div>';
931 contentString += '</div>';
932 contentString += '</div>';
933
934 contentString += '<div class="row">';
935 contentString += '<div class="col-12">';
936 <#if validator.isNotNull(articleMainImageThumbnail1Safe)>
937 contentString += '<img class="pull-right mb-2 ml-2" src="${articleMainImageThumbnail1Safe}" alt="$title"/>';
938 </#if>
939 contentString += '<dl class="mb-0">';
940 <#if (Contacto.Direccion.data)?has_content || ((Contacto.CP.data)?has_content) || ((Contacto.Localidad.data)?has_content)>
941 contentString += '<dt class="important">${languageUtil.get(request,"address")}</dt>';
942 contentString += '<dd>${((Contacto.Direccion.data)!)?js_string}<br>${((Contacto.CP.data)!)} - ${((Contacto.Localidad.data)!)?js_string}</dd>';
943 </#if>
944 <#if Contacto.Telefono.data?has_content>
945 contentString += '<dt class="important">${languageUtil.get(request,'phone')}</dt>';
946 contentString += '<dd>${Contacto.Telefono.data}</dd>';
947 </#if>
948 <#if Contacto.Email.getData()?has_content>
949 contentString += '<dt class="important">${languageUtil.get(request,'email')}</dt>';
950 <#list Contacto.Email.getSiblings() as Item>
951 contentString += '<dd><a href="mailto:${Item.data}" title="${languageUtil.format(request,'go-to-x', 'email')}">${Item.data}</a></dd>';
952 </#list>
953 </#if>
954 <#if Contacto.Web.data?has_content>
955 <#assign linkURL = Contacto.Web.data/>
956 <#if !stringUtil.startsWith(linkURL, "http")>
957 <#assign linkURL = "https://${Contacto.Web.data}"/>
958 </#if>
959 contentString += '<dt class="important">${languageUtil.get(request,'site')}</dt>';
960 contentString += '<dd><a href="${linkURL}" title="${languageUtil.format(request,'go-to-x', 'site')}">${Contacto.Web.data}</a></dd>';
961 </#if>
962 contentString += '</dl>';
963 contentString += '</div>';
964 contentString += '</div>';
965 <#if validator.isNotNull(description)>
966 contentString += '<div class="row"><div class="col-12">${description}</div></div>';
967 </#if>
968 marker.bindPopup(contentString);
969
970 //Contributor
971 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
972 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors.'
973 }).addTo(mapContent);
974
975 }); //AUI.ready
976 </script>
977 </div>
978 </div>
979 <#assign showFirstTab = false>
980 </#if>
981 </div>
982 <#if (Informacion.Observaciones.data)!?has_content || (Contacto.MasInformacion.data)!?has_content>
983 <div class="article-border">
984 <#if (Informacion.Observaciones.data)!?has_content>
985 <div class="observations mb-3">
986 ${Informacion.Observaciones.data}
987 </div>
988 </#if>
989 <#if (Contacto.MasInformacion.data)!?has_content>
990 <div class="more-info">
991 <#list Contacto.MasInformacion.getSiblings() as Item>
992 <#if Item.data?trim?has_content>
993 <#assign itemData = Item.data?trim />
994 <#if itemData?matches("^https?://.*") || itemData?starts_with("//")>
995 <#assign itemURL = itemData />
996 <#if itemURL?starts_with("//")>
997 <#assign itemURL = "https:${itemURL}" />
998 </#if>
999 <#assign itemURLSafe = sanitizeURL(itemURL) />
1000 <#if itemURLSafe?has_content>
1001 <#assign isExternal = isExternalURL(itemURLSafe) />
1002 <div class="mb-2">
1003 <a class="link" href="${itemURLSafe}" <#if isExternal>target="_blank" rel="noopener noreferrer"</#if> aria-label="${languageUtil.format(request,'visit-link-x', itemData)} <#if isExternal>${languageUtil.get(request,'opens-new-window')}</#if>">
1004 ${itemData}
1005 <#if isExternal>
1006 <span class="fas fa-external-link-alt ml-1" aria-hidden="true"></span>
1007 </#if>
1008 </a>
1009 </div>
1010 </#if>
1011 <#else>
1012 <div class="mb-2">
1013 <span>${itemData}</span>
1014 </div>
1015 </#if>
1016 </#if>
1017 </#list>
1018 </div>
1019 </#if>
1020 </div>
1021 </#if>
1022 </div>
1023
1024 <#-- Related Articles -->
1025 <#assign relatedJournalArticles = assetTool.getRelatedJournalArticlesApproved(assetEntry) />
1026 <#if validator.isNotNull(relatedJournalArticles) && relatedJournalArticles?size gt 0>
1027 <div class="article-related portlet-background-grey-container">
1028 <div class="container">
1029 <h3 class="title-section">${languageUtil.get(request,'related-assets')}</h3>
1030 <div class="slick article-related-slick">
1031 <#list relatedJournalArticles as currentJournalArticle>
1032 <#assign viewURLRaw = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true) />
1033 <#assign viewURL = sanitizeURL(viewURLRaw) />
1034 <#assign articleTitle = currentJournalArticle.getTitle(locale) />
1035 <#assign smallImageURLRaw = currentJournalArticle.getSmallImageURL() />
1036 <#assign smallImageURL = sanitizeURL(smallImageURLRaw) />
1037 <#if viewURL?has_content && smallImageURL?has_content && articleTitle?has_content>
1038 <div class="slide">
1039 <a class="card background card-background-9-14" href="${viewURL}" aria-label="${languageUtil.format(request, 'go-to-x', articleTitle)}">
1040 <span class="d-block image-wrapper aspect-ratio-bg-cover" style="background-image: url('${smallImageURL}')" role="img" aria-label="${articleTitle}">
1041 <img class="hide-accessible" src="${smallImageURL}" alt="" />
1042 <span class="card-body">
1043 <span class="card-title">${articleTitle}</span>
1044 </span>
1045 </span>
1046 </a>
1047 </div>
1048 </#if>
1049 </#list>
1050 </div>
1051 </div>
1052 </div>
1053 </#if>
1054
1055 <#-- Nearby Articles -->
1056 <#assign classTypeIds = [] />
1057 <#assign assetsNearJournalArticles = assetNearTool.getNearJournalArticles(themeDisplay.getScopeGroupId(), assetEntry.getEntryId(), 50.0, classTypeIds, 25)! />
1058 <#if validator.isNotNull(assetsNearJournalArticles) && assetsNearJournalArticles?size gt 0>
1059 <div class="article-nearby portlet-container-margin">
1060 <div class="container">
1061 <div class="article-nearby-container">
1062 <h3 class="title-section">${languageUtil.get(request,'infoasturias-near-here')}</h3>
1063 <div class="slick article-nearby-slick">
1064 <#list assetsNearJournalArticles as currentJournalArticle>
1065 <#assign viewURLRaw = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true) />
1066 <#assign viewURL = sanitizeURL(viewURLRaw) />
1067 <#assign articleTitle = currentJournalArticle.getTitle(locale) />
1068 <#assign articleDescription = currentJournalArticle.getDescription(locale) />
1069 <#assign smallImageURLRaw = currentJournalArticle.getSmallImageURL() />
1070 <#assign smallImageURL = sanitizeURL(smallImageURLRaw) />
1071 <#assign distanceKm = currentJournalArticle.getVersion() />
1072 <#assign categoriesNamesRaw = journalTool.getCategoriesNames(groupId, currentJournalArticle.getArticleId(), locale, ["Concejos"]) />
1073 <#assign categoriesNames = htmlUtil.escape(categoriesNamesRaw) />
1074
1075 <#if viewURL?has_content && smallImageURL?has_content && articleTitle?has_content>
1076 <div class="slide">
1077 <a class="card" href="${viewURL}" aria-label="${languageUtil.format(request, 'go-to-x', articleTitle)}">
1078 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${smallImageURL}')" role="img" aria-label="${articleTitle}">
1079 <img class="hide-accessible" src="${smallImageURL}" alt="" />
1080 <#if articleDescription?has_content>
1081 <span class="card-hover">
1082 <span class="card-text">${articleDescription}</span>
1083 </span>
1084 </#if>
1085 </span>
1086 <span class="card-body">
1087 <span class="card-title">${articleTitle}</span>
1088 <span class="card-subtitle">
1089 <span class="d-block">
1090 <span class="sr-only">${languageUtil.get(request, 'distance')}: </span>
1091 ${distanceKm} ${languageUtil.get(request, 'km')}
1092 </span>
1093 <#if categoriesNames?has_content>
1094 <span class="d-block">${categoriesNames}</span>
1095 </#if>
1096 </span>
1097 </span>
1098 </a>
1099 </div>
1100 </#if>
1101 </#list>
1102 </div>
1103 </div>
1104 </div>
1105 </div>
1106 </#if>
1107</article>
1108<#assign vocabCultura = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cultura")! />
1109<#assign schemaTypes = ["CivicStructure", "TouristAttraction"] />
1110<#if vocabCultura?has_content>
1111 <#assign categoriasCultura = assetCategoryLocalService.getVocabularyCategories(vocabCultura.getVocabularyId(), -1, -1, null) />
1112 <#assign categoriaPadre = "" />
1113 <#list categoriasCultura as cat>
1114 <#if cat.getName() == "Museos y espacios culturales">
1115 <#assign categoriaPadre = cat />
1116 <#break>
1117 </#if>
1118 </#list>
1119 <#if categoriaPadre?has_content>
1120 <#assign categoriasArticulo = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", journalArticle.resourcePrimKey ) />
1121 <#list categoriasArticulo as cat>
1122 <#if cat.getVocabularyId() == vocabCultura.getVocabularyId() && cat.getParentCategoryId() == categoriaPadre.getCategoryId()>
1123 <#assign nombreCategoria = cat.getName() />
1124 <#if nombreCategoria == "Museos" || nombreCategoria == "Colecciones Museográficas">
1125 <#assign schemaTypes = ["Museum", "LocalBusiness", "TouristAttraction"] />
1126 <#break>
1127 <#elseif nombreCategoria == "Castros y espacios arqueológicos">
1128 <#assign schemaTypes = ["ArchaeologicalSite", "LocalBusiness", "TouristAttraction"] />
1129 <#break>
1130 <#elseif nombreCategoria == "Conjuntos etnográficos">
1131 <#assign schemaTypes = ["LandmarksOrHistoricalBuildings", "LocalBusiness", "TouristAttraction"] />
1132 <#break>
1133 <#elseif nombreCategoria == "Centros de interpretación">
1134 <#assign schemaTypes = ["VisitorCenter", "LocalBusiness", "TouristAttraction"] />
1135 <#break>
1136 <#elseif nombreCategoria == "Otros espacios culturales">
1137 <#assign schemaTypes = ["CivicStructure", "LocalBusiness", "TouristAttraction"] />
1138 <#break>
1139 </#if>
1140 </#if>
1141 </#list>
1142 </#if>
1143</#if>
1144<script type="application/ld+json">
1145{
1146 "@context": "https://schema.org",
1147 "@type": [
1148 <#list schemaTypes as t>"${t}"<#if t_has_next>,</#if></#list>
1149 ],
1150 "@id": "${articleURL}",
1151 "name": "${title}",
1152 "url": "${articleURL}"
1153 <#if articleMainImageThumbnail3Safe?has_content>
1154 ,"image": [
1155 "${themeDisplay.getPortalURL()}${articleMainImageThumbnail3Safe}"
1156 <#if Visualizador.Slide.getData()?has_content>
1157 <#list Visualizador.Slide.getSiblings() as Slide>
1158 <#if validator.isNotNull(Slide.getData()) && !Slide.SlideUrl.getData()?has_content>
1159 <#assign slidePathRaw = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
1160 <#assign slidePath = sanitizeURL(slidePathRaw) />
1161 <#if slidePath?has_content>
1162 ,"${themeDisplay.getPortalURL()}${slidePath}"
1163 </#if>
1164 </#if>
1165 </#list>
1166 </#if>
1167 ]
1168 </#if>
1169 <#if (Informacion.Texto.data)!?has_content>
1170 <#assign cleanDesc = htmlUtil.extractText(Informacion.Texto.data)?trim />
1171 <#if cleanDesc?has_content>
1172 ,"description": "${cleanDesc}"
1173 </#if>
1174 </#if>
1175 <#if (Contacto.Direccion.data)!?has_content || (Contacto.CP.data)!?has_content>
1176 ,"address": {
1177 "@type": "PostalAddress"
1178 <#if (Contacto.Direccion.data)!?has_content>
1179 ,"streetAddress": "${(Contacto.Direccion.data)!}"
1180 </#if>
1181 <#if (Contacto.CP.data)!?has_content>
1182 ,"postalCode": "${(Contacto.CP.data)!}"
1183 </#if>
1184 <#if (Contacto.Localidad.data)!?has_content>
1185 ,"addressLocality": "${(Contacto.Localidad.data)!}"
1186 </#if>
1187 <#if (Contacto.Concejo.data)!?has_content>
1188 ,"addressRegion": "${(Contacto.Concejo.data)!}"
1189 </#if>
1190 ,"addressCountry": "ES"
1191 }
1192 </#if>
1193 <#if (Geolocalizacion.Coordenadas.data)!?has_content>
1194 <#assign coordenadas = stringUtil.split(Geolocalizacion.Coordenadas.data) />
1195 ,"geo": {
1196 "@type": "GeoCoordinates",
1197 "latitude": "${coordenadas[0]}",
1198 "longitude": "${coordenadas[1]}"
1199 }
1200 </#if>
1201 <#if (Contacto.Telefono.data)!?has_content>
1202 ,"telephone": [
1203 <#assign phoneList = [] />
1204 <#list Contacto.Telefono.getSiblings() as telephone>
1205 <#if telephone.data?has_content>
1206 <#assign rawTelefono = telephone.data?trim />
1207 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
1208 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
1209 <#if numberTelefono?length == 9>
1210 <#assign phoneList = phoneList + ["+34${numberTelefono}"] />
1211 <#elseif numberTelefono?has_content>
1212 <#assign phoneList = phoneList + [numberTelefono] />
1213 </#if>
1214 </#if>
1215 </#list>
1216 <#if phoneList?has_content>
1217 <#list phoneList as phone>
1218 "${phone}"<#if phone_has_next>,</#if>
1219 </#list>
1220 </#if>
1221 ]
1222 </#if>
1223 <#if (Contacto.Email.getData())!?has_content>
1224 ,"email": [
1225 <#assign emailList = [] />
1226 <#list Contacto.Email.getSiblings() as Item>
1227 <#if Item.data?trim?has_content>
1228 <#assign emailList = emailList + [Item.data?trim] />
1229 </#if>
1230 </#list>
1231 <#if emailList?has_content>
1232 <#list emailList as email>
1233 "${email}"<#if email_has_next>,</#if>
1234 </#list>
1235 </#if>
1236 ]
1237 </#if>
1238 <#if (Informacion.Horario.data)!?has_content>
1239 <#assign cleanHorario = htmlUtil.extractText(Informacion.Horario.data)?trim />
1240 <#if cleanHorario?has_content>
1241 ,"openingHoursSpecification": {
1242 "@type": "OpeningHoursSpecification",
1243 "description": "${cleanHorario}"
1244 }
1245 </#if>
1246 </#if>
1247}
1248</script>
1249<script type="text/javascript">
1250 (function() {
1251 'use strict';
1252 setTimeout(function() {
1253 var links = document.querySelectorAll('.internal-tab-link');
1254 links.forEach(function(link) {
1255 link.addEventListener('click', function(e) {
1256 e.preventDefault();
1257
1258 var tabHeadingId = this.getAttribute('data-tab-heading');
1259 var tabContentId = this.getAttribute('data-tab-content');
1260 var tabControl = document.getElementById(tabHeadingId);
1261 var tabContent = document.getElementById(tabContentId);
1262
1263 if (!tabControl || !tabContent) return;
1264
1265 var isExpanded = tabControl.getAttribute('aria-expanded') === 'true';
1266 if (!isExpanded) {
1267 tabControl.click();
1268 setTimeout(function() {
1269 scrollToElement(tabControl);
1270 }, 350);
1271 } else {
1272 scrollToElement(tabControl);
1273 }
1274 });
1275 });
1276 }, 500);
1277
1278 function scrollToElement(element) {
1279 var elementPosition = element.getBoundingClientRect().top;
1280 var offsetPosition = elementPosition + window.pageYOffset - 140;
1281 window.scrollTo({
1282 top: offsetPosition,
1283 behavior: 'smooth'
1284 });
1285 setTimeout(function() {
1286 element.focus();
1287 }, 400);
1288 }
1289 })();
1290</script>