News search results
Thanh Tìm kiếm
Kết quả tìm kiếm
Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
The string doesn't match the expected date/time/date-time format. The string to parse was: "09:48 01-10-2024". The expected format was: "dd/MM/yyyy hh:mm a". The nested reason given follows: Unparseable date: "09:48 01-10-2024" ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.getCreationDateString()?datet... [in template "20099#20135#93644519" at line 176, column 49] ----
1<#-- DDM Template Key: "NEWS-SEARCH-RESULTS-LIST-FTL" -->
2<#assign JOURNAL_ARTICLE_CLASS_NAME = "com.liferay.journal.model.JournalArticle" />
3<#-- assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
4<#assign article = journalArticleLocalService.fetchLatestArticle(entry.getClassPK()) /-->
5
6<#-- ${journalArticleLocalService} -->
7<#-- ${article} -->
8
9
10
11<#-- ----------------------------------------------------------------------- -->
12<#-- Init Logger -->
13<#-- ----------------------------------------------------------------------- -->
14
15<#assign log = objectUtil("com.liferay.portal.kernel.log.LogFactoryUtil").getLog("webcms.portal.template.widget.news-search-result-list") />
16
17
18<#-- Categories -->
19<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") />
20<#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil"] />
21<#assign assetVocabularyLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetVocabularyLocalServiceUtil"] />
22
23<#assign searchResults = [] />
24<#if searchContainer?has_content>
25 <#assign searchResults = searchContainer.getResults()![] />
26 <#if searchResults?has_content>
27 </#if>
28</#if>
29
30<#assign searchResultsDocuments = [] />
31<#if searchResultsPortletDisplayContext?has_content>
32 <#assign searchResultsDocuments = searchResultsPortletDisplayContext.getDocuments()![] />
33 <#if searchResultsDocuments?has_content>
34 <!-- searchResultsDocuments.size : ${searchResultsDocuments?size} -->
35 </#if>
36</#if>
37
38<#assign newsCategoryNames = [] />
39<#assign newsVocabName = "news categories" />
40<#assign newsVocabId = -1 />
41<#assign newsVocab = "" />
42<#assign newsCategories = [] />
43<#assign categories = [] />
44
45<#-- Vars -->
46<#attempt>
47 <#assign newsVocabId = findAssetVocabularyIdByName(newsVocabName, -1) />
48 <#assign newsVocab = assetVocabularyLocalServiceUtil.getAssetVocabulary(newsVocabId) />
49
50 <#if newsVocab?has_content>
51 <#assign newsCategories = newsVocab.getCategories() />
52 </#if>
53
54 <#if newsCategories?has_content>
55 <#if newsCategories?size gt 0>
56 <#list newsCategories as newsCategory>
57 <#assign newsCategoryNames = newsCategoryNames + [newsCategory.name] />
58 </#list>
59 </#if>
60 </#if>
61<#recover>
62</#attempt>
63
64
65<div id="searchFilterContainer">
66 <#-- dynamic placement of search filters on mobile -->
67</div>
68
69<p class="search-total-label text-default">
70 We found <strong>${searchContainer.getTotal()}</strong>
71<#if searchResultsPortletDisplayContext.getKeywords()?trim?length > 0>
72 results for <strong>${htmlUtil.escape(searchResultsPortletDisplayContext.getKeywords())}</strong>.
73<#else>
74 results.
75</#if>
76</p>
77
78<#-- ---------------------------------- -->
79<#-- Render search results news -->
80<#-- ---------------------------------- -->
81
82<div class="display-list lfr-search-container-wrapper">
83 <#if entries?has_content>
84 <#list entries as entry>
85 <#-- if entry?has_content-->
86
87 <#-- DOE CHANGE START -->
88 <#if entry?has_content>
89 ${log.info("entry index : " + entry?index)}
90 ${log.info("entry.title : " + (entry.getTitle())!"")}
91 ${log.info("entry.iconId : " + (entry.getIconId())!"")}
92 ${log.info("entry.className : " + (entry.getClassName())!"")}
93 ${log.info("entry.classPK : " + (entry.getClassPK())!"")}
94 ${log.info("entry.resourceImage : " + (entry.getResourceImage())!"")}
95 </#if>
96
97 <#assign searchDocument = "" />
98 <#if entry?has_content>
99 <#if searchResults?has_content>
100 <#assign entryIndex = entry?index />
101 <#assign searchDocument = searchResults[entryIndex] />
102 <#-- searchDocument ${entryIndex} : ${searchDocument} : entry- ${entry} -->
103 </#if>
104 </#if>
105
106 <#assign categories = getSearchDocumentFieldValue(searchDocument, "assetCategoryTitles", "") />
107 <#assign articleId = getSearchDocumentFieldValue(searchDocument, "articleId", "") />
108 <#assign resourceImage = getSearchDocumentFieldValue(searchDocument, "ddm__.*resourceImage.*", "") />
109 <#assign dateCreated = getSearchDocumentFieldValue(searchDocument, "ceateDate","") />
110
111
112
113 <#if articleId?has_content>
114 ${log.info("articleId : " + articleId)}
115
116 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService" ) />
117
118 ${log.info("journalArticleLocalService : " + journalArticleLocalService)}
119 <#assign articleResourcePK = journalArticleResourceLocalService.getArticleResourcePrimKey(groupId,articleId) />
120
121 <#assign categoryList = assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK) />
122
123 <#-- <#assign article = journalArticleLocalService.getArticle(getterUtil.getLong(groupId), articleId) /> -->
124 </#if>
125
126 <div class="card mb-4 pb-3 w-100 border-top-0 border-left-0 border-right-0 border-bottom rounded-0">
127 <div class="row no-gutters m-0">
128 <#if resourceImage?has_content>
129 <#assign removePadding = "px-sm-3" />
130 <#assign removePaddingTitle = "pl-sm-3" />
131 <div class="col-12 col-sm-3 col-lg-2 p-0">
132 <#-- ${log.info("resourceImage : " + resourceImage)} -->
133 <#assign imageParams = "f_auto" />
134 <#assign imagePath = resourceImage />
135 <#assign imageSrc = buildCloudinaryImageUrl(imageParams, imagePath) />
136 <#-- ${log.debug("imageSrc : " + imageSrc)} -->
137 <#assign escapedImageSrc = htmlUtil.escapeHREF(imageSrc) />
138 <#-- ${log.debug("escapedImageSrc : " + escapedImageSrc)} -->
139 <img class="news-search__image img-fluid" alt="" src="${escapedImageSrc}" />
140 </div>
141
142 <div class="col-12 col-sm-9 col-lg-10 p-0">
143 <#else>
144 <#assign removePadding = "" />
145 <#assign removePaddingTitle = "" />
146 <div class="col-12 p-0">
147 </#if>
148
149 <div class="card-body ${removePaddingTitle} pt-sm-0 pt-2 p-0 d-flex flex-column flex-sm-row justify-content-sm-between align-items-start">
150 <h5 class="card-title mt-2 mt-sm-0 mb-0 order-2 order-sm-1">
151 <a href="${entry.getViewURL()}">
152 ${entry.getHighlightedTitle()}
153 </a>
154 </h5>
155 <#-- Loop through all categories assigned to the news article -->
156 <div class="categories order-1 order-sm-2 text-sm-right flex-shrink-sm-0 ml-sm-4 ml-0">
157 <#list categoryList as categoryListing>
158 <#assign vocabularyId = categoryListing.getVocabularyId() />
159 <#-- Set the ID for the News section vocabulary -->
160 <#-- if vocabularyId == 379886 -->
161 <span class="mb-0 news__category ${categoryListing.getName()?replace(' ','-')?lower_case} news__category-${newsCategoryNames?seq_index_of(categoryListing.getName())}">${categoryListing.getName()}</span>
162 <#--</#if-->
163 </#list>
164 </div>
165 </div>
166
167 <div class="card-body ${removePadding} py-0 px-0 ">
168 <#if entry.isCreationDateVisible() && entry.getCreationDateString()?has_content>
169
170
171 <p class="card-text mb-1">
172 <small class="font-weight-bold">
173 <#setting date_format="dd MMMM yyyy">
174<#setting locale="en_AU">
175
176 ${entry.getCreationDateString()?datetime("dd/MM/yyyy hh:mm a")?date}</small>
177
178 </p>
179 </#if>
180 <p class="card-text">${entry.getContent()}</p>
181 </div>
182
183 </div>
184 </div>
185 </div>
186 </#list>
187 </#if>
188
189</div>
190
191<#-- ----------------------------------------------------------------------- -->
192<#-- Functions -->
193<#-- ----------------------------------------------------------------------- -->
194
195<#--
196-- Returns the first value matching the search results docment field name by regex, otherwise the defaultValue is returned.
197--
198-- The search document must be of type "com.liferay.portal.kernel.search.Document"
199--
200-- @see com.liferay.portal.kernel.search.Document
201-->
202<#function getSearchDocumentFieldValue searchDocument regex defaultValue>
203 ${log.info("getSearchDocumentFieldValue ...")}
204 ${log.info("searchDocument : " + searchDocument)}
205 ${log.info("regex : " + regex)}
206 ${log.info("defaultValue : " + defaultValue)}
207
208 <#assign fieldValueResult = defaultValue />
209 <#attempt>
210 <#if searchDocument?has_content && regex?has_content>
211 <#assign searchDocumentFields = searchDocument.getFields() />
212 <#if searchDocumentFields?has_content>
213 <#list searchDocumentFields as fieldKey, fieldValue>
214 <#if fieldKey?has_content>
215 <#assign fieldName = fieldKey />
216 <#if fieldName?matches(regex)>
217 <#assign fieldValueResult = (searchDocument.get(fieldKey))!defaultValue />
218 <#break>
219 </#if>
220 </#if>
221 </#list>
222 </#if>
223 </#if>
224 <#recover>
225 <#-- NO-OP -->
226 </#attempt>
227
228 ${log.info("getSearchDocumentFieldValue : " + fieldValueResult)}
229 <#return fieldValueResult>
230</#function>
231
232<#function findAssetVocabularyIdByName vocabName defaultVocabId>
233 <#assign assetVocabularyId = defaultVocabId />
234
235 <#attempt>
236 <#assign assetVocabList = assetVocabularyLocalServiceUtil.getAssetVocabularies(0, staticFieldGetter.getFieldValue("java.lang.Integer", "MAX_VALUE")) />
237 <#if assetVocabList?has_content>
238 <#list assetVocabList as assetVocabItem>
239 <#assign assetVocabItemName = assetVocabItem.getName() />
240 <#if assetVocabItemName?lower_case == vocabName?lower_case >
241 <#assign assetVocabularyId = assetVocabItem.getVocabularyId() />
242 </#if>
243 </#list>
244 </#if>
245 <#recover>
246 <#assign assetVocabularyId = defaultVocabId />
247 </#attempt>
248
249 <#return assetVocabularyId>
250</#function>
251
252<#function buildCloudinaryImageUrl imageParams imagePath>
253 <#assign cloudinaryImageUrl = "" />
254 <#attempt>
255 <#if imageParams?has_content && imagePath?has_content>
256 <#assign cloudinaryBaseUrl = webcms.getCloudinaryPath() />
257 <#if !cloudinaryBaseUrl?ends_with("/")>
258 <#assign cloudinaryBaseUrl = cloudinaryBaseUrl + "/" />
259 </#if>
260 <#if !imagePath?starts_with("/")>
261 <#assign imagePath = "/" + imagePath />
262 </#if>
263 <#assign cloudinaryImageUrl = cloudinaryBaseUrl + imageParams + imagePath />
264 </#if>
265 <#recover>
266 <#-- NO-OP -->
267 </#attempt>
268
269 <#return cloudinaryImageUrl>
270</#function>