Kearney Analytics
By combining world-class analytics capabilities with deep functional and industry expertise, Kearney Analytics helps clients maximize the value from data and analytics for their business model and market. We use the power of our more than 500 analytics consultants, data scientists, data engineers, and software engineers and a strong partner network in industry and academia.
We apply artificial intelligence and machine learning to solve complex business problems. From procurement and supply chain to marketing and growing your business, Kearney Analytics has the diverse experience, skills, and means to deliver tangible solutions. Our team understands that analytics is about aptitude and curiosity. With this crucial combination in mind, we hire and nurture the right talent to help you answer your most pressing questions.
Capabilities
Java method "com.sun.proxy.$Proxy910.getLatestArticle(long)" threw an exception when invoked on com.sun.proxy.$Proxy910 object "com.liferay.journal.service.impl.JournalArticleLocalServiceImpl@391d2602"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign jArt = JournalArticleLocalSer... [in template "20116#20152#510999" at line 105, column 13] ----
1<#--
2Application display templates can be used to modify the look of a
3specific application.
4
5Please use the left panel to quickly add commonly used variables.
6Autocomplete is also available and can be invoked by typing "${".
7-->
8
9<#assign DLFileEntryLocalService = serviceLocator.findService(
10"com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
11<#assign DLFolderLocalService = serviceLocator.findService(
12"com.liferay.document.library.kernel.service.DLFolderLocalService")>
13<#assign JournalArticleLocalService = serviceLocator.findService(
14"com.liferay.journal.service.JournalArticleLocalService")>
15<#assign GroupLocalService = serviceLocator.findService(
16"com.liferay.portal.kernel.service.GroupLocalService")>
17<#assign LayoutSetService = serviceLocator.findService(
18"com.liferay.portal.kernel.service.LayoutSetLocalService")>
19<#assign AssetCategoryLocalService = serviceLocator.findService(
20"com.liferay.asset.kernel.service.AssetCategoryLocalService")>
21<#assign AssetVocabularyLocalService = serviceLocator.findService(
22"com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
23<#assign AssetCategoryPropertyLocalService = serviceLocator.findService(
24"com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")/>
25<#assign PropertyFactoryUtil = serviceLocator.findService(
26"com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil") />
27
28<#assign portletId = themeDisplay.getPortletDisplay().getId()>
29<#assign locale = themeDisplay.getLocale()>
30<#assign PortletPreferencesLocalService = serviceLocator.findService(
31"com.liferay.portal.kernel.service.PortletPreferencesLocalService")/>
32
33<#--
347.4 Upgrade Start - portlet perferences would not be stored as xml, see https://github.com/liferay/liferay-portal/blob/master/readme/BREAKING_CHANGES.markdown#what-changed-11
35
36assign portletPreferencesXML = saxReaderUtil.read((PortletPreferencesLocalService.getPortletPreferences(themeDisplay.getPlid(), portletId)?first).getPreferences())
37-->
38
39<#assign plid = themeDisplay.getPlid()>
40
41<#assign portletPreferences = PortletPreferencesLocalService.getPortletPreferences(plid, portletId)?first />
42
43<#assign preferences = PortletPreferencesLocalService.fetchPreferences(portletPreferences.getCompanyId(), portletPreferences.getOwnerId(), portletPreferences.getOwnerType(), plid, portletId) />
44
45<#--
467.4 Upgrade End
47-->
48
49<#assign TemplateCustomService = serviceLocator.findService("template.custom.services.TemplateCustomService") />
50
51<#-- Macro used to get specific field text from an Asset Entry -->
52<#macro entryNode document field>
53 <#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??>
54 "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}"
55 <#else>
56 ""
57 </#if>
58</#macro>
59
60<#-- Macro used to get specific portlet preference -->
61
62<#-- 7.4 Upgrade question: where do we need this macro? -->
63
64<#macro preference prefKey prefIndex defaultValue>
65 <#if portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value")??>
66 "${portletPreferencesXML.selectSingleNode("/portlet-preferences/preference[name='"+prefKey+"-"+prefIndex+"']/value").getText()?js_string}"<#return>
67 <#else>
68 "${defaultValue?js_string}"<#return>
69 </#if>
70</#macro>
71
72<div id="articleAdtDiv_${portletId}"></div>
73<script>
74 <#if preferences.getValue("useSmallerHeadings", "false")?js_string == "true">
75 <#assign overrideHeadingSize = "heading3 mobile-heading2">
76 </#if>
77
78 <#assign multiArtBehavior = preferences.getValue("multiArticleBehavior", "Vertical Stack")?js_string>
79
80 <#assign fullWidthDisplay = preferences.getValue("fullWidthDisplay", "false")?js_string>
81
82 <#assign featureDisplayType = preferences.getValue("featureDisplayType", "Image Left")?js_string>
83
84 <#assign greyBackground = preferences.getValue("greyBackground", "false")?js_string>
85
86 <#assign extraSpacer = preferences.getValue("extraSpacer", "None")?js_string>
87
88 <#assign autoplay = preferences.getValue("autoPlay", "false")?js_string>
89
90 <#assign seeAllLink = preferences.getValue("seeAllLink", "")?js_string>
91
92 <#assign seeAllLinkText = preferences.getValue("seeAllLinkText", "")?js_string>
93
94 <#assign featureDisplayButtonType = preferences.getValue("featureDisplayButtonType", "Visible")?js_string>
95
96 <#assign featureDisplayButtonText = preferences.getValue("featureDisplayButtonText", "")?js_string>
97
98 <#assign gridTitle = preferences.getValue("gridTitle", "")?js_string>
99
100 var entries = [];
101
102 <#if entries?has_content>
103 <#list entries as curEntry>
104
105 <#assign jArt = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK())>
106 <#assign document = saxReaderUtil.read(jArt.getContentByLocale(themeDisplay.getLocale()))>
107
108 <#assign structureName = jArt.getDDMStructure().getName("en_US")>
109
110
111 var componentType = "FEATURED_ARTICLE";
112 var voiceSearch = "featured-article";
113
114 var title = <@entryNode document=document field="ArticleTitle"/>;
115
116 var subtitle = <@entryNode document=document field="Subtitle"/>;
117
118 var description = <@entryNode document=document field="Description"/>;
119 if (description == ""){
120 description = <@entryNode document=document field="Intro"/>;
121 }
122
123 var slug = <@entryNode document=document field="Slug"/>;
124
125 <#assign articleGroup = GroupLocalService.getGroup(jArt.getGroupId())>
126
127 <#if LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false)??
128 && LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular")?? >
129 <#assign isMicroSite = (LayoutSetService.getLayoutSet(themeDisplay.getScopeGroupId(), false).getThemeSetting("isMicroSite", "regular") == "true")>
130 <#else>
131 <#assign isMicroSite = false>
132 </#if>
133
134 var image = '${TemplateCustomService.getDocumentURL(document,"ThumbnailSquare",themeDisplay)}';
135 if (null == image || "" == image || ${(fullWidthDisplay == "true")?c}) {
136 image = '${TemplateCustomService.getDocumentURL(document,"Thumbnail",themeDisplay)}';
137 }
138 if (null == image) {
139 image = "";
140 }
141
142 var componentData = {
143 locale: "${locale}",
144 structureName: "${structureName}",
145 displayType: "${featureDisplayType}",
146 slug: slug,
147 title: title,
148 subtitle: subtitle,
149 description: description,
150 image: image.trim(),
151 groupFriendlyUrl: '${articleGroup.getFriendlyURL()}',
152 isMicrosite: ${isMicroSite?c},
153 multiArtBehavior: '${multiArtBehavior}',
154 featureDisplayButtonText: '${featureDisplayButtonText}',
155 featureDisplayButtonType: '${featureDisplayButtonType}',
156 componentType: componentType,
157 voiceSearch: voiceSearch
158 };
159
160 <#if structureName == "Video">
161
162 componentData.displayType = "Video";
163 componentData.link = <@entryNode document=document field="LinkURL"/>;
164 componentData.videoUrl = <@entryNode document=document field="VideoURL"/>;
165
166 <#elseif structureName == "Article">
167
168 var linkTargetOverride = <@entryNode document=document field="LinkTargetOverride"/>;
169
170 if (linkTargetOverride !== ""){
171 componentData.link = linkTargetOverride;
172 } else {
173 <#assign assetCategories = AssetCategoryLocalService.getCategories(curEntry.getClassNameId(), curEntry.getClassPK())>
174
175 var articleCategories = [];
176
177 <#list assetCategories as category>
178 <#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())>
179 <#assign categoryUrl = "#">
180
181 <#list AssetCategoryPropertyLocalService.getCategoryProperties(category.categoryId) as categoryProperty>
182
183 <#if categoryProperty.key == "url">
184 <#assign categoryUrl = categoryProperty.value>
185 </#if>
186 </#list>
187
188 articleCategories.push({
189 id: "${category.categoryId}",
190 name: "${category.name}",
191 url: "${categoryUrl}",
192 vocabularyName: "${categoryVocabulary.getTitle(locale)}",
193 });
194
195 </#list>
196
197
198 componentData.categories = articleCategories;
199 componentData.urlTitle = "${jArt.getUrlTitle()?js_string}";
200 }
201
202 var byline = <@entryNode document=document field="Byline"/>;
203 if (byline != null && byline != ""){
204 componentData.byline = [];
205 };
206
207 <#elseif structureName == "External Article">
208
209
210
211 <#-- All External Articles should display at /media-center/article, so populate categories accordingly -->
212 <#-- var articleCategories = [];
213 articleCategories.push({
214 id: "0",
215 name: "Media Center",
216 url: "media-center",
217 vocabularyName: "Topics",
218 });
219 articleCategories.push({
220 id: "1",
221 name: "Article",
222 url: "article",
223 vocabularyName: "Article Type",
224 });
225
226 componentData.categories = articleCategories;
227 componentData.urlTitle = "${jArt.getUrlTitle()?js_string}"; -->
228
229 componentData.link = <@entryNode document=document field="LinkURL"/>;
230 componentData.isExternal = true;
231
232 var bylineSegments = [];
233 var pubName = <@entryNode document=document field="PublicationName"/>;
234
235 if (pubName != null && pubName != ""){
236 bylineSegments.push(pubName);
237 componentData.italicizeFirstByline = true;
238 };
239
240 <#--bylineSegments.push(<@entryNode document=document field="PublicationDate"/>); -->
241 componentData.byline = bylineSegments;
242
243 <#elseif structureName == "Link">
244
245 componentData.link = <@entryNode document=document field="LinkURL"/>;
246 componentData.isExternal = true;
247
248 var bylineSegments = [];
249
250 <#assign linkja = JournalArticleLocalService.getLatestArticle(curEntry.getClassPK()) >
251 <#assign linkdocument = saxReaderUtil.read(linkja.getContent())>
252 <#assign linknodes = document.selectNodes("/root/dynamic-element[@name='BylineSegment']/dynamic-content")>
253
254 <#list linknodes as curN>
255 bylineSegments.push("${curN.getText()?js_string}");
256 </#list>
257
258 componentData.byline = bylineSegments;
259 componentData.italicizeFirstByline = true;
260
261 </#if>
262
263 entries.push(componentData);
264 </#list>
265 </#if>
266
267 <#if multiArtBehavior == "Carousel">
268 var carouselProps = {
269 entries: entries,
270 gridTitle: "${gridTitle}",
271 fullWidthDisplay: ${(fullWidthDisplay == "true")?c},
272 greyBackground: "${greyBackground}",
273 autoplay: ${(autoplay == "true")?c}
274 };
275
276 ATK.React.Component.Carousel("articleAdtDiv_${portletId?js_string}", carouselProps);
277 <#else>
278 var componentVoiceSearch = "featured-article";
279 var extraProps = {
280 multiArtBehavior: "${multiArtBehavior}",
281 gridTitle: "${gridTitle}",
282 fullWidthDisplay: "${fullWidthDisplay}",
283 greyBackground: "${greyBackground}",
284 extraSpacer: "${extraSpacer}",
285 seeAllLink: "${seeAllLink}",
286 seeAllLinkText: "${seeAllLinkText}",
287 componentVoiceSearch: componentVoiceSearch
288 };
289 ATK.React.Component.FeaturedMultiDisplay("articleAdtDiv_${portletId?js_string}", extraProps, entries);
290 </#if>
291
292</script>