1<#-- Template: Articulos Relacionados 3 Columnas -->
2<#-- Obtener los servicios necesarios -->
3<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
4<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
5<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
6<#assign assetDisplayPageFriendlyURLProvider = serviceLocator.findService("com.liferay.asset.display.page.portlet.AssetDisplayPageFriendlyURLProvider") />
7
8<#-- Obtener el artículo actual -->
9<#assign journalArticle = journalArticleLocalService.getArticle(getterUtil.getLong(groupId), .vars['reserved-article-id'].data) />
10<#assign groupId = themeDisplay.getScopeGroupId() />
11<#assign resourcePrimKey = journalArticle.getResourcePrimKey() />
12<#assign structureKey = journalArticle.getDDMStructureKey() />
13<#assign authorId = journalArticle.getUserId() />
14
15<#-- Buscar y mostrar artículos relacionados -->
16<#assign relatedArticles = journalArticleLocalService.getArticlesByStructureId(groupId, structureKey, 0, 1000, null) />
17
18 <#-- Ordenar los art�culos por fecha de modificaci�n y seleccionar los m�s recientes -->
19 <#assign relatedArticles = relatedArticles?sort_by("displayDate")?reverse />
20 <#-- Limitar a 3 si hay suficientes -->
21 <#if relatedArticles?size gt 3>
22 <#assign relatedArticles = relatedArticles[0..2] />
23 </#if>
24
25<div class="container">
26 <div class="row">
27 <#list relatedArticles as curArticle>
28 <#if curArticle.getResourcePrimKey() != resourcePrimKey>
29 <#assign viewURL = assetDisplayPageFriendlyURLProvider.getFriendlyURL("com.liferay.journal.model.JournalArticle", curArticle.getResourcePrimKey(), themeDisplay) />
30 <#if !viewURL?has_content>
31 <#assign viewURL = "/" />
32 </#if>
33 <#assign aArticleXML = saxReaderUtil.read(curArticle.getContentByLocale(locale)) />
34 <#assign autores = aArticleXML.selectNodes("//dynamic-element[@name='autor']/dynamic-content") />
35 <#assign imagenArticulo = aArticleXML.valueOf("//dynamic-element[@name='imagen']/dynamic-content/text()") />
36 <#assign detalle = aArticleXML.valueOf("//dynamic-element[@name='detalle']/dynamic-content") />
37
38 <#assign categoriesList = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", curArticle.getResourcePrimKey())/>
39 <#assign vocabularyTemaName = "Tema" />
40 <#assign vocabularyNRevistaName = "Nº de revista" />
41 <#assign vocabularyTopicName = "Topic" />
42 <#assign avoidTopic = "PRINCIPAL" />
43
44 <#-- Featured Image of the Article -->
45 <#assign featuredImage = curArticle.getArticleImageURL(themeDisplay)!""/>
46
47 <#if curArticle?index < 3>
48 <div class="col-md border-left <#if curArticle?index == 2> border-right</#if>">
49 <article class="article article-small">
50 <figure class="media">
51 <picture>
52 <#if featuredImage?has_content>
53 <img src="${featuredImage}" />
54 <#else>
55 <#if imagenArticulo?? && imagenArticulo?has_content>
56 <#attempt>
57 <#assign jsonObject = imagenArticulo?eval/>
58 <#assign entryUuid = jsonObject.uuid />
59 <#assign entryGroupId = getterUtil.getLong(jsonObject.groupId) />
60 <#assign entryAlt = jsonObject.alt />
61 <#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") />
62 <#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
63 <#assign dlFileEntry = dlFileEntryLocalService.getDLFileEntryByUuidAndGroupId(entryUuid, entryGroupId) />
64 <#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.document.library.kernel.model.DLFileEntry", dlFileEntry.fileEntryId) />
65 <#assign assetRenderer = assetEntry.assetRenderer />
66 <#assign imagen = assetRenderer.getURLDownload(themeDisplay) />
67 <img alt="${entryAlt}" data-fileentryid="${dlFileEntry.fileEntryId}" src="${imagen}" />
68 <#recover>
69 </#attempt>
70 </#if>
71 </#if>
72 </picture>
73 </figure>
74
75 <#if categoriesList?has_content>
76 <#list categoriesList as category>
77 <#assign categoryVocabulary = assetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId()) />
78 <#if categoryVocabulary.getName() == vocabularyNRevistaName>
79 <#assign revista_number = category.getTitle(locale)/>
80 </#if>
81 </#list>
82 </#if>
83 <p class="kicker">
84 <#if categoriesList?has_content>
85 <#list categoriesList as category>
86 <#assign categoryVocabulary = assetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId()) />
87 <#if categoryVocabulary.getName() == vocabularyTemaName>
88 <a title="${category.getTitle(locale)}">${category.getTitle(locale)}</a>
89 </#if>
90 </#list>
91 <a title="${revista_number}">${revista_number}</a>
92 <#list categoriesList as category>
93 <#assign categoryVocabulary = assetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId()) />
94 <#if categoryVocabulary.getName() == vocabularyTopicName && category.getTitle(locale) != avoidTopic>
95 <a title="${category.getTitle(locale)}">${category.getTitle(locale)}</a>
96 </#if>
97 </#list>
98 </#if>
99 </p>
100
101 <#assign title = curArticle.getTitle(locale) />
102 <h2 class="title title-standard">
103 <a href="${viewURL}" title="${title}">${title}</a>
104 </h2>
105
106 <p class="meta">
107 <#assign fecha = dateUtil.getDate(curArticle.getDisplayDate(), "d 'de' MMMM 'de' yyyy", locale) />
108 <#if fecha?has_content>
109 <span>${fecha}</span>
110 </#if>
111
112 <#assign tiempo = "" />
113 <#if detalle?has_content>
114 <#assign content = detalle?trim />
115 <#if content != "">
116 <#assign contentCount = content?replace("<[^>]+>", "", "r")?word_list?size />
117 <#if contentCount gt 0>
118 <#assign minutesValue = (contentCount/200)?round />
119 <#if minutesValue == 0>
120 <#assign tiempo = "Unos segundos" />
121 <#elseif minutesValue == 1>
122 <#assign tiempo = minutesValue + " minuto" />
123 <#else>
124 <#assign tiempo = minutesValue + " minutos" />
125 </#if>
126 </#if>
127 </#if>
128 </#if>
129 <#if tiempo?? && tiempo != "">
130 <span><i class="fa fa-regular fa-clock"></i> ${tiempo}</span>
131 </#if>
132 </p>
133
134 <p class="author">
135 <#if autores?has_content>
136 <#list autores as autor>
137 <#assign aArticleXMLAutores = saxReaderUtil.read(autor.getParent().asXML()) />
138 <#assign autorJournalArticle = aArticleXMLAutores.valueOf("//dynamic-element[@name='autor']/dynamic-content") />
139 <#attempt>
140 <#assign jsonObject = autorJournalArticle?eval/>
141 <#assign articleClassPK = jsonObject.classPK />
142 <#assign articleGroupId = getterUtil.getLong(jsonObject.groupId) />
143 <#assign articleAutor = journalArticleLocalService.fetchLatestArticle(articleClassPK?number)>
144 <#assign aArticleXMLAutor = saxReaderUtil.read(articleAutor.getContentByLocale(locale)) />
145 <#assign nombre = aArticleXMLAutor.valueOf("//dynamic-element[@name='nombre']/dynamic-content/text()") />
146 <#assign apellidos = aArticleXMLAutor.valueOf("//dynamic-element[@name='apellidos']/dynamic-content/text()") />
147 <a title="${nombre} ${apellidos}">${nombre} ${apellidos}</a>
148 <#recover>
149 </#attempt>
150 </#list>
151 </#if>
152 </p>
153 </article>
154 </div>
155 </#if>
156 </#if>
157 </#list>
158 </div>
159</div>
160
161<style>
162/* default image size */
163.nuestro-tiempo .article.article-small .media img{
164 object-fit: contain;
165 height: 200px;
166}
167/* alternative
168.nuestro-tiempo .article.article-small .media img{
169 object-fit: cover;
170 height: 100%;
171}
172*/
173</style>