1<#-- Template: Articulos Relacionados 3 Columnas Optimizado con DynamicQuery -->
2
3<#-- Servicios -->
4<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
5<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
6<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
7<#assign assetDisplayPageFriendlyURLProvider = serviceLocator.findService("com.liferay.asset.display.page.portlet.AssetDisplayPageFriendlyURLProvider") />
8
9<#-- Clases y utilidades necesarias -->
10<#assign WorkflowConstants = staticUtil["com.liferay.portal.kernel.workflow.WorkflowConstants"] />
11<#assign RestrictionsFactoryUtil = staticUtil["com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil"] />
12<#assign OrderFactoryUtil = staticUtil["com.liferay.portal.kernel.dao.orm.OrderFactoryUtil"] />
13
14<#-- Datos del artículo actual -->
15<#assign groupId = themeDisplay.getScopeGroupId() />
16<#assign journalArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) />
17<#assign resourcePrimKey = journalArticle.getResourcePrimKey() />
18<#assign ddmStructureId = journalArticle.getDDMStructureId() />
19<#assign locale = themeDisplay.getLocale() />
20
21<#-- Crear DynamicQuery para artículos relacionados -->
22<#assign dq = journalArticleLocalService.dynamicQuery() />
23${dq.add(RestrictionsFactoryUtil.eq("groupId", groupId))}
24${dq.add(RestrictionsFactoryUtil.eq("ddmStructureId", ddmStructureId))}
25${dq.add(RestrictionsFactoryUtil.eq("status", WorkflowConstants.STATUS_APPROVED))}
26<#assign today = .now?datetime />
27${dq.add(RestrictionsFactoryUtil.le("displayDate", today))}
28${dq.addOrder(OrderFactoryUtil.desc("displayDate"))}
29
30<#-- Ejecutar DynamicQuery y limitar a 3 artículos -->
31<#assign relatedArticles = journalArticleLocalService.dynamicQuery(dq, 0, 3) />
32
33<div class="container">
34 <div class="row">
35 <#list relatedArticles as curArticle>
36 <#if curArticle.getResourcePrimKey() != resourcePrimKey>
37 <div class="col-md border-left <#if curArticle?index == 2> border-right</#if>">
38 <article class="article article-small">
39 <figure class="media">
40 <picture>
41 <#assign featuredImage = curArticle.getArticleImageURL(themeDisplay)!""/>
42 <#if featuredImage?has_content>
43 <img src="${featuredImage}" />
44 <#else>
45 <#-- Imagen alternativa -->
46 <#assign aArticleXML = saxReaderUtil.read(curArticle.getContentByLocale(locale)) />
47 <#assign imagenArticulo = aArticleXML.valueOf("//dynamic-element[@name='imagen']/dynamic-content/text()") />
48 <#if imagenArticulo?? && imagenArticulo?has_content>
49 <#attempt>
50 <#assign jsonObject = imagenArticulo?eval />
51 <#assign entryUuid = jsonObject.uuid />
52 <#assign entryGroupId = getterUtil.getLong(jsonObject.groupId) />
53 <#assign entryAlt = jsonObject.alt />
54 <#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") />
55 <#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
56 <#assign dlFileEntry = dlFileEntryLocalService.getDLFileEntryByUuidAndGroupId(entryUuid, entryGroupId) />
57 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.document.library.kernel.model.DLFileEntry", dlFileEntry.fileEntryId) />
58 <#assign assetRenderer = assetEntry.assetRenderer />
59 <#assign imagen = assetRenderer.getURLDownload(themeDisplay) />
60 <img alt="${entryAlt}" data-fileentryid="${dlFileEntry.fileEntryId}" src="${imagen}" />
61 <#recover></#attempt>
62 </#if>
63 </#if>
64 </picture>
65 </figure>
66
67 <#-- Categorías -->
68 <#assign categoriesList = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", curArticle.getResourcePrimKey())/>
69 <p class="kicker">
70 <#list categoriesList as category>
71 <#assign categoryVocabulary = assetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId()) />
72 <a title="${category.getTitle(locale)}">${category.getTitle(locale)}</a>
73 </#list>
74 </p>
75
76 <h2 class="title title-standard">
77 <a href="${curArticle.getUrlTitle()?has_content?then(curArticle.getUrlTitle(), "/")}" title="${curArticle.getTitle(locale)}">${curArticle.getTitle(locale)}</a>
78 </h2>
79
80 <p class="meta">
81 <#assign fecha = dateUtil.getDate(curArticle.getDisplayDate(), "d 'de' MMMM 'de' yyyy", locale) />
82 <#if fecha?has_content>
83 <span>${fecha}</span>
84 </#if>
85 </p>
86
87 <p class="author">
88 <#assign aArticleXML = saxReaderUtil.read(curArticle.getContentByLocale(locale)) />
89 <#assign autores = aArticleXML.selectNodes("//dynamic-element[@name='autor']/dynamic-content") />
90 <#if autores?has_content>
91 <#list autores as autor>
92 <#assign aArticleXMLAutores = saxReaderUtil.read(autor.getParent().asXML()) />
93 <#assign autorJournalArticle = aArticleXMLAutores.valueOf("//dynamic-element[@name='autor']/dynamic-content") />
94 <#attempt>
95 <#assign jsonObject = autorJournalArticle?eval />
96 <#assign articleClassPK = jsonObject.classPK />
97 <#assign articleGroupId = getterUtil.getLong(jsonObject.groupId) />
98 <#assign articleAutor = journalArticleLocalService.fetchLatestArticle(articleClassPK?number) />
99 <#assign aArticleXMLAutor = saxReaderUtil.read(articleAutor.getContentByLocale(locale)) />
100 <#assign nombre = aArticleXMLAutor.valueOf("//dynamic-element[@name='nombre']/dynamic-content/text()") />
101 <#assign apellidos = aArticleXMLAutor.valueOf("//dynamic-element[@name='apellidos']/dynamic-content/text()") />
102 <a title="${nombre} ${apellidos}">${nombre} ${apellidos}</a>
103 <#recover></#attempt>
104 </#list>
105 </#if>
106 </p>
107 </article>
108 </div>
109 </#if>
110 </#list>
111 </div>
112</div>
113
114<style>
115.nuestro-tiempo .article.article-small .media img{
116 object-fit: contain;
117 height: 200px;
118}
119</style>