1<#assign
2projectStructureName = "SACYR_CON_STR_PROYECTO"
3
4journalArticleLocalService = serviceLocator.findService(
5"com.liferay.journal.service.JournalArticleLocalService"
6)
7assetLinkLocalService = serviceLocator.findService(
8"com.liferay.asset.link.service.AssetLinkLocalService"
9)
10assetEntryLocalService = serviceLocator.findService(
11"com.liferay.asset.kernel.service.AssetEntryLocalService"
12)
13assetEntryService = serviceLocator.findService(
14"com.liferay.asset.kernel.service.AssetEntryService"
15)
16
17assetVocabularyLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")
18
19assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")
20
21currentArticle = journalArticleLocalService.getArticle(
22groupId, .vars['reserved-article-id'].data
23)
24currentArticleResourcePrimKey = currentArticle.getResourcePrimKey()
25currentArticleAssetEntry = assetEntryLocalService.getEntry(
26"com.liferay.journal.model.JournalArticle", currentArticleResourcePrimKey
27)
28currentArticleAssetEntryId = currentArticleAssetEntry.getEntryId()
29relatedCountryLink = assetLinkLocalService.getDirectLinks(currentArticleAssetEntryId)[0]
30relatedCountryAsset = assetEntryService.fetchEntry(relatedCountryLink.entryId2)
31relatedCountryPK = relatedCountryAsset.classPK?number
32relatedCountryArticle = journalArticleLocalService.getLatestArticle(relatedCountryPK)
33relatedCountryContent = relatedCountryArticle.getContentByLocale(locale.toString())
34relatedCountryDocument= saxReaderUtil.read(relatedCountryContent)
35relatedCountryName = relatedCountryDocument.selectSingleNode(
36"//dynamic-element[@name='nombre']/dynamic-content"
37).getStringValue()
38relatedCountryURL = relatedCountryAsset.getAssetRenderer().getURLViewInContext(
39renderRequest, renderResponse , ""
40)
41relatedProjects = assetLinkLocalService.getDirectLinks(relatedCountryLink.entryId2)
42
43categoriesData = []
44categoriesValueData = []
45data = []
46projects = []
47
48cabeceraBg = ""
49cabeceraBgHalf = "${themeDisplay.getPathThemeImages()}/fondos/trama-assets.png"
50mask = "${themeDisplay.getPathThemeImages()}/mockup/branding/mask.svg"
51/>
52
53<#assign vocabularies = assetVocabularyLocalServiceUtil.getGroupVocabularies(themeDisplay.getScopeGroupId()) />
54
55<#list vocabularies as voc>
56 <#if voc.getName()?matches("(?i).*SACYR_CON_VOC_TIPO_PROYECTO.*")>
57 <#list voc.getCategories() as cat>
58 <#assign color = "" />
59 <#assign imagen = "" />
60 <#assign listCategoryProperties = assetCategoryPropertyLocalService.getCategoryProperties(cat.getCategoryId()) />
61 <#list listCategoryProperties as categoryProperty>
62 <#if categoryProperty.getKey() == "color" >
63 <#assign color = categoryProperty.getValue() />
64 </#if>
65 <#if categoryProperty.getKey() == "icon" >
66 <#assign imagen = categoryProperty.getValue() />
67 </#if>
68 </#list>
69 <#assign categoriesData = categoriesData + [{'name': cat.getName(), 'color': color , 'text': cat.getTitle(locale), 'imagen': imagen}] />
70 </#list>
71 <#break>
72 </#if>
73</#list>
74
75<#list vocabularies as voc>
76 <#if voc.getName()?matches("(?i).*SACYR_CON_VOC_VALUE_CREATION.*")>
77 <#list voc.getCategories() as cat>
78 <#assign name = "" />
79 <#assign color = "" />
80 <#assign imagen = "" />
81 <#assign listCategoryProperties = assetCategoryPropertyLocalService.getCategoryProperties(cat.getCategoryId()) />
82 <#list listCategoryProperties as categoryProperty>
83 <#if categoryProperty.getKey() == "color" >
84 <#assign color = categoryProperty.getValue() />
85 </#if>
86 <#if categoryProperty.getKey() == "icon" >
87 <#assign imagen = categoryProperty.getValue() />
88 </#if>
89 </#list>
90
91 <#if cat.getName()?contains("Society") >
92 <#assign name = "Society" />
93 <#elseif cat.getName()?contains("Shareholders") >
94 <#assign name = "Shareholders" />
95 <#elseif cat.getName()?contains("People") >
96 <#assign name = "People" />
97 </#if>
98 <#assign categoriesValueData = categoriesValueData + [{'name': name, 'color': color , 'text': cat.getTitle(locale), 'imagen': imagen}] />
99 </#list>
100 <#break>
101 </#if>
102</#list>
103
104
105<#if locale == "en_US">
106 <#assign
107 sharedValue = 'Shared Value'
108 characteristics = 'Characteristics'
109 seeDetail = 'SEE DETAIL'
110 projectsTitle = 'Other projects in ' + relatedCountryName
111 />
112<#elseif locale == "es_ES">
113 <#assign
114 sharedValue = 'Valor Compartido'
115 characteristics = 'Características'
116 seeDetail = 'VER DETALLE'
117 projectsTitle = 'Otros proyectos en ' + relatedCountryName
118 />
119<#else>
120 <h1> Tweak SACYR_CON_TMP_DETALLE_PROYECTO to support this locale! </h1>
121</#if>
122
123
124
125<#list relatedProjects as assetLink>
126 <#if assetLink.entryId2 != currentArticleAssetEntryId>
127 <#assign
128 project = assetEntryService.fetchEntry(assetLink.entryId2)
129 article = journalArticleLocalService.getLatestArticle(
130 project.classPK?number
131 )
132 ddmStructure = article.getDDMStructure()
133 ddmStructureName = ddmStructure.getName(locale)
134 />
135 <#if projectStructureName == ddmStructureName>
136 <#assign projects = projects + [project]>
137 <#list project.getCategories() as projectCategory>
138 <#assign isCategoryInData = false />
139 <#list categoriesData as curCategoryData>
140 <#if projectCategory.getTitle("en_US") == curCategoryData.name>
141 <#assign categoryData = curCategoryData>
142 <#break>
143 </#if>
144 </#list>
145 <#list data as d>
146 <#if d.category == projectCategory>
147 <#assign isCategoryInData = true />
148 <#assign categoryIndex = d?index />
149 </#if>
150 </#list>
151
152 <#if isCategoryInData>
153 <#assign data =
154 data[0..<categoryIndex]
155 + [{
156 "category" : projectCategory,
157 "categoryData" : categoryData,
158 "projects" :
159 data[categoryIndex].projects + [project]
160 }]
161 + data[(categoryIndex+1)..]
162 />
163 <#else>
164 <#assign data =
165 data + [{
166 "category" : projectCategory,
167 "categoryData" : categoryData,
168 "projects" : [project]
169 }]
170 />
171 </#if>
172 </#list>
173 </#if>
174 </#if>
175</#list>
176
177<#assign isSimple = projects?size gt 3 />
178
179<script>
180 $(".h2").hide()
181</script>
182
183<#---------------------------------------------------------------------------->
184<#----------------------------- BREADCRUMBS ---------------------------------->
185<#---------------------------------------------------------------------------->
186<#assign
187layout = themeDisplay.getLayout()
188home = themeDisplay.getScopeGroup()
189assetscrumb = layout.getAncestors()[0]
190breadcrumbs = [{
191"name": home.getName(locale),
192"url": portalUtil.getGroupFriendlyURL(home.getPublicLayoutSet(), themeDisplay, false, false)
193}, {
194"name": assetscrumb.getName(locale),
195"url": portalUtil.getLayoutFriendlyURL(assetscrumb, themeDisplay)
196}, {
197"name": relatedCountryName,
198"url": relatedCountryURL
199}, {
200"name": cabecera.tituloCabecera.getData(),
201"url": themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()
202}]
203test = themeDisplay.getLayout().getGroup()
204test2 = test.getAncestors() + test.getChildren(true)
205/>
206
207<div class="container breadcrumbs-country">
208 <div class="breadcrumbs">
209 <#-- breadcrumb -->
210 <#list breadcrumbs as crumb>
211 <#if crumb?is_last >
212 <span>${crumb.name}</span>
213 <#else>
214 <a href="${crumb.url}">${crumb.name}</a>
215 </#if>
216 </#list>
217 </div>
218</div>
219
220<#---------------------------------------------------------------------------->
221<#---------------------------------------------------------------- CABECERA -->
222<#---------------------------------------------------------------------------->
223
224<#macro textBox>
225 <div class="${sp[0]}"></div>
226 <div class="text-box">
227 <#if cabecera.iconoCabecera.getData()?has_content>
228 <div class="icon-box bg-darkblue">
229 <span class="icon ${cabecera.iconoCabecera.getData()}"></span>
230 </div>
231 </#if>
232 <div class="title text-darkblue">
233 <h1>${cabecera.tituloCabecera.getData()}</h1>
234 </div>
235 <div class="description text-darkblue">
236 ${cabecera.entradillaCabecera.getData()}
237 </div>
238 </div>
239 <div class="${sp[1]}"></div>
240</#macro>
241
242<#assign
243extra = ""
244sp = ["margin", "spacer"]
245/>
246
247<#switch cabecera.variacion.getData()>
248 <#case "centrado">
249 <div class="assets-project-heading"
250 style="background-image: url('${cabeceraBg}')">
251 <@textBox/>
252 </div>
253 <#break>
254 <#case "imagenDerecha">
255 <#assign
256 extra = "assets-project-heading--bg-picture-right"
257 sp = sp?reverse
258 />
259 <#case "imagenIzquierda">
260 <div class="assets-project-heading assets-project-heading--bg-picture ${extra}">
261 <div class="media-box"
262 style="background-image: url('${cabecera.cabeceraFg.getData()}')">
263 </div>
264 <div class="bg-box"
265 style="background-image: url('${cabeceraBgHalf}')">
266 <@textBox/>
267 </div>
268 </div>
269 <#break>
270 <#case "mascaraDerecha"> <#assign extra = "assets-project-heading--bg-picture-right">
271 <#case "mascaraIzquierda">
272 <div class="assets-project-heading ${extra} assets-project-heading--bg-mask">
273 <div class="media-box">
274 <div class="background"
275 style="background-image: url('${cabecera.cabeceraFg.getData()}')">
276 </div>
277 <img src="${mask}" class="mask" />
278 </div>
279 <div class="bg-box">
280 <div class="text-box">
281 <@textBox/>
282 </div>
283 </div>
284 </div>
285</#switch>
286
287
288
289<div style="margin: 60px;"></div>
290
291
292<#---------------------------------------------------------------------------->
293<#------------------------------------------------------------------- CAJAS -->
294<#---------------------------------------------------------------------------->
295<#macro boxes clase="">
296 <div class="assets-highlight-title ${clase}">
297 <div class="container">
298 <div class="title text-darkblue">
299 <p>${sharedValue}</p>
300 </div>
301 <div class="boxes">
302 <#list cajas.caja.getSiblings() as caja>
303
304 <#list categoriesValueData as valueasd>
305 <#if valueasd.name == caja.categoriaCaja.getData() >
306 <#assign colorCategory = valueasd.color />
307 <#assign titleCategory = valueasd.text />
308 </#if>
309 </#list>
310
311 <div class="box"
312 data-aos="fade-up"
313 data-aos-delay="${caja?index * 250}">
314 <#nested
315 caja.categoriaCaja.getData(),
316 caja.cajaBg.getData()
317 >
318 <div class="title text-darkblue">
319 <h3>${titleCategory}</h3>
320 </div>
321 <div class="description text-darkblue">
322 ${caja.cajaTexto.getData()}
323 </div>
324 </div>
325 </#list>
326 </div>
327 </div>
328 </div>
329</#macro>
330
331<#if cajas.caja.getSiblings()?size != 0>
332
333 <#switch cajas.variacionCajas.getData()>
334 <#case "lightblue">
335 <@boxes ; category, picture>
336 <div style="width: 5.375rem; height: 5.375rem; color: #ffffff; background-color: #9fd0da; line-height: 5.375rem; border-bottom-right-radius: 1.5rem; border-top-left-radius: 1.5rem; margin: 1.875rem auto; font-size: 3.75rem; text-align: center;">
337 <span class="icon icon-${category}"></span>
338 </div>
339 </@boxes>
340 <#break>
341 <#case "colores">
342 <@boxes clase="assets-highlight-title--stripe" ; category, picture>
343 <div class="stripe"></div>
344 <div class="icon-box icon-box--${category}">
345 <span class="icon icon-${category}"></span>
346 </div>
347 </@boxes>
348 <#break>
349 <#case "fotos">
350 <@boxes "assets-highlight-title--picture" ; category, picture>
351 <div class="picture"
352 style="background-image: url('${picture}')">
353 </div>
354 </@boxes>
355 <#break>
356 <#case "grafico">
357 <div class="assets-highlight-title assets-highlight-title--hemicycle">
358 <div class="container">
359 <div class="title text-darkblue">
360 <p>${sharedValue}</p>
361 </div>
362 <div class="hemi-boxes">
363 <#list cajas.caja.getSiblings() as caja>
364 <div class="box"
365 data-aos="fade-up"
366 data-aos-delay="${caja?index * 250}">
367 <div class="box-content">
368 <span class="icon icon-${caja.categoriaCaja.getData()}"></span>
369 <div class="title text-white">
370 <h3>${value[caja.categoriaCaja.getData()]}</h3>
371 </div>
372 </div>
373 </div>
374 </#list>
375 <#if cajas.textoGrafico.getData()?has_content>
376 <div class="description text-darkblue">
377 ${cajas.textoGrafico.getData()}
378 </div>
379 </#if>
380 </div>
381 </div>
382 </div>
383 <#break>
384 </#switch>
385</#if>
386
387
388<div style="margin: 60px;"></div>
389
390
391<#---------------------------------------------------------------------------->
392<#----------------------------------------------------------------- DETALLE -->
393<#---------------------------------------------------------------------------->
394<div class="assets-project-detail">
395 <div class="container">
396 <div class="project-box">
397 <div class="text-box">
398 <div class="title text-blue">
399 <h3>${characteristics}</h3>
400 </div>
401 <#list detalle.caracteristica.getSiblings() as item>
402 <div class="detail">
403 <div class="detail-name text-darkblue">
404 <p>${item.nombreCaracteristica.getData()}</p>
405 </div>
406 <div class="detail-value text-grey">
407 <p>${item.valorCaracteristica.getData()}</p>
408 </div>
409 </div>
410 </#list>
411 </div>
412
413 <#if detalle.mapa.imagenMapa.getData()?? && detalle.mapa.imagenMapa.getData() != "">
414 <div class="map-box">
415 <img alt="${detalle.mapa.imagenMapa.getAttribute("alt")}"
416 data-fileentryid="${detalle.mapa.imagenMapa.getAttribute("fileEntryId")}"
417 src="${detalle.mapa.imagenMapa.getData()}"
418 class="map" />
419 <#list detalle.mapa.chincheta.getSiblings() as pin>
420 <#if pin.mapaEnlace.getData()?? && pin.mapaEnlace.getData() != "">
421 <span class="icon icon-location poi"
422 style="left: ${pin.ubicacionX.getData()}%;
423 top: ${pin.ubicacionY.getData()}%;
424 transform: translate(-10px, -12px);"
425 data-toggle="modal" data-target="#pin-${pin?index}"></span>
426 <div class="modal fade videoModal" id="pin-${pin?index}" role="dialog">
427 <div class="modal-dialog modal-lg modal-dialog-centered">
428 <div class="modal-content">
429 <div class="modal-header">
430 <button type="button" class="close"
431 data-dismiss="modal">×</button>
432 </div>
433 <div class="modal-body">
434 <iframe src="${pin.mapaEnlace.getData()}" width="100%" height="480"></iframe>
435 </div>
436 </div>
437 </div>
438 </div>
439 <#else>
440 <span class="icon icon-location poi"
441 style="left: ${pin.ubicacionX.getData()}%;
442 top: ${pin.ubicacionY.getData()}%;
443 transform: translate(-10px, -12px);
444 cursor: default;"></span>
445 </#if>
446 </#list>
447 </div>
448 </#if>
449 <#if detalle.linkDetalle.getData()?has_content>
450 <div class="action-box">
451 <a href="${detalle.linkDetalle.getData()}"
452 target="_blank"
453 class="btn btn-primary btn-xl">
454 ${seeDetail}
455 </a>
456 </div>
457 </#if>
458 </div>
459 <#if detalle.descripcion.textoDescripcion.getData()?has_content>
460 <div class="highlight-box">
461 <#if detalle.descripcion.imagenDescripcion.getData()?has_content>
462 <div class="media-box"
463 style="background-image: url('${detalle.descripcion.imagenDescripcion.getData()}')">
464 </div>
465 </#if>
466 <div class="text-box">
467 <#if detalle.descripcion.antetituloDescripcion.getData()?has_content>
468 <div class="tagline text-purple">
469 <p>${detalle.descripcion.antetituloDescripcion.getData()}</p>
470 </div>
471 </#if>
472 <div class="title text-darkblue">
473 <#if detalle.descripcion.tituloDescripcion.getData()?has_content>
474 <h4>${detalle.descripcion.tituloDescripcion.getData()}</h4>
475 <#else>
476 <h4>${cabecera.tituloCabecera.getData()}<h4>
477 </#if>
478 </div>
479 <div class="description text-grey">
480 ${detalle.descripcion.textoDescripcion.getData()}
481 </div>
482 </div>
483 </div>
484 </#if>
485 </div>
486</div>
487
488
489<#---------------------------------------------------------------------------->
490<#----------------------------------------------------- MÓDULOS ADICIONALES -->
491<#---------------------------------------------------------------------------->
492<div>
493 <#list modulosAdicionales.getSiblings() as modulo>
494 <#attempt>
495 <#assign pHData = modulo.getData()/>
496 <#if pHData?has_content>
497 <div class="my-info-detail-components">
498 <#assign
499 pHEval = pHData?eval
500 pHArticle = journalArticleLocalService.getLatestArticle(pHEval.classPK?number)
501 pHContent = journalArticleLocalService.getArticleContent(pHArticle, pHArticle.getDDMTemplateKey(), "view", locale, null, themeDisplay) />
502 ${pHContent}
503 </div>
504 </#if>
505 <#recover></#recover>
506 </#list>
507</div>
508
509
510<#---------------------------------------------------------------------------->
511<#---------------------------------------------- PROYECTOS EN EL MISMO PAIS -->
512<#---------------------------------------------------------------------------->
513<#if projects?has_content>
514 <div class="valuecr-button-filters">
515 <div class="title text-darkblue">
516 <p>${projectsTitle}</p>
517 </div>
518 <div class="filters-box">
519
520 <#if data?size gt 1>
521 <#if locale == "en_US">
522 <#assign todos = 'All' />
523 <#elseif locale == "es_ES">
524 <#assign todos = 'Todos' />
525 </#if>
526 <div class="entry white aos-init aos-animate selected" data-aos="fade-right" data-aos-delay="0" data-filter="All" onclick="changeCategory('All')">
527 <div class="filter">
528 <span class="icon text-icon">${todos?upper_case}</span>
529 </div>
530 <span class="label">${todos}</span>
531 <span class="selection"></span>
532 </div>
533 </#if>
534 <#list data as d>
535 <#assign
536 categoria = d.categoryData.name
537 imagen = d.categoryData.imagen
538 color = d.categoryData.color
539 label = d.categoryData.text
540 />
541
542 <#assign sel = (d?index == 0)?then("selected","") />
543
544
545 <div class="entry ${color} ${sel} aos-init"
546 data-filter="${categoria}"
547 data-aos="fade-up"
548 data-aos-delay="${(data?size - d?index - 1) * 250}"
549 onclick="changeCategory('${categoria}')"
550 >
551 <div class="filter">
552 ${d.text!}
553 <#if imagen?has_content>
554 <img src="${themeDisplay.getPathThemeImages()}/pictogramas/${imagen}.png">
555 </#if>
556 </div>
557 <span class="label">${label}</span>
558 <span class="selection"></span>
559 </div>
560
561 </#list>
562
563 <script>
564 $( document ).ready(function() {
565 unselectAll();
566
567 });
568
569 </script>
570 </div>
571
572 <#assign
573 simpleClass = isSimple?then("assets-project-list--simple", "")
574 index = 0
575 />
576 <div class="assets-project-list ${simpleClass}">
577 <div class="container">
578 <div class="project-list">
579 <#list data as d>
580 <#assign color = d.categoryData.color>
581 <#list d.projects as project>
582 <#assign
583 index = index+1
584 assetRenderer = project.getAssetRenderer()
585 url = assetRenderer.getURLViewInContext(
586 renderRequest, renderResponse , ""
587 )
588 pk = project.classPK?number
589 article = journalArticleLocalService.getLatestArticle(pk)
590 content = article.getContentByLocale(locale.toString())
591 document= saxReaderUtil.read(content)
592 titulo = document.selectSingleNode(
593 "//dynamic-element[@name='tituloCabecera']/dynamic-content"
594 ).getStringValue()
595 entradilla = document.selectSingleNode(
596 "//dynamic-element[@name='entradillaCabecera']/dynamic-content"
597 ).getStringValue()
598 imagen = document.selectSingleNode(
599 "//dynamic-element[@name='cabeceraFg']/dynamic-content"
600 ).getStringValue()
601
602 isOdd = index % 2 == 1
603 xtra = (isOdd && imagen?has_content)?then("project-card--reverse", "")
604 tagline = d.category.getTitle(locale)
605 />
606 <a href="${url}"
607 class="project-card ${color} ${xtra}"
608 data-filter="${d.categoryData.name}">
609 <#if isSimple>
610 <div class="separator text-${color}">
611 <div class="pill bg-${color}"></div>
612 </div>
613 <div class="text-box">
614 <div class="title text-darkblue">
615 <h3>${titulo}</h3>
616 </div>
617 <div class="description text-grey">
618 <p>${entradilla}</p>
619 </div>
620 <div class="location">
621 <div class="icon-box text-darkblue">
622 <span class="icon icon-location"></span>
623 </div>
624 <div class="location-name text-darkblue">
625 <p>${relatedCountryName}</p>
626 </div>
627 </div>
628 </div>
629 <#else>
630 <#if imagen?has_content>
631 <div class="media-box"
632
633
634 <#assign json = jsonFactoryUtil.createJSONObject(imagen)>
635 <#assign fileUrl = json.getString("url")>
636
637 <#if fileUrl == "">
638 <#assign fileUrl = '/documents/${json.getString("groupId")}/${json.getString("fileEntryId")}/${json.getString("title")}/${json.getString("uuid")}'/>
639 </#if>
640
641 style="background-image: url('${fileUrl}')">
642 </div>
643 </#if>
644 <div class="text-box">
645 <div class="tagline text-darkblue">
646 ${tagline}
647 </div>
648 <div class="title text-darkblue">
649 <h3>${titulo}</h3>
650 </div>
651 <div class="description text-grey">
652 <p>${entradilla}</p>
653 </div>
654 <object type="custom/link"> <#-- IE 9 -->
655 <a href="${relatedCountryURL}" class="location">
656 <div class="icon-box text-darkblue">
657 <span class="icon icon-location"></span>
658 </div>
659 <div class="location-name text-darkblue">
660 ${relatedCountryName}
661 </div>
662 </a>
663 </object>
664 </div>
665 </#if>
666 </a>
667 </#list>
668 </#list>
669 </div>
670 </div>
671 </div>
672 </div>
673
674 <script>
675 var buttons, allProjects;
676 var collapse = true;
677 function unselectAll() {
678 // unselect all buttons
679 buttons.forEach(function (el) {
680 el.classList.remove("selected")
681 })
682 }
683 function changeCategory(category) {
684
685 // unselect all buttons
686 buttons.forEach(function (el) {
687 el.classList.remove("selected")
688 })
689
690 // reset everything = show by default
691 allProjects.forEach(function (el) {
692 el.style.display = "block";
693 })
694
695 // try to find button (with fallback to all) and add the selected class
696 var selectedButton =
697 document.querySelector(".entry[data-filter='" + category + "']")
698 || document.querySelector(".entry[data-filter='All']");
699 selectedButton.classList.add("selected");
700
701 if (category == "All") {
702 return;
703 }
704
705 var toHide = document.querySelectorAll(".project-card:not([data-filter='" + category + "'])");
706 toHide.forEach(function (el) {
707 el.style.display = "none";
708 })
709
710 }
711
712 buttons = document.querySelectorAll(".entry");
713 allProjects = document.querySelectorAll(".project-card");
714 </script>
715</#if>
716
717
718<@liferay_util["html-top"] outputKey="htmltop" >
719<#-- SEO -->
720 <script type="application/ld+json">
721 {
722 "@context": "http://schema.org",
723 "@type": "BreadcrumbList",
724 "itemListElement": [
725 <#list breadcrumbs as crumb>
726 {
727 "@type": "ListItem",
728 "position": ${crumb?index + 1},
729 "item": {
730 "@id": "${crumb.url}",
731 "name": "${crumb.name}"
732 }
733 }<#sep>,
734 </#list>
735 ]
736 }
737 </script>
738</@>