Benefits
An error occurred while processing the template.
Java method "com.sun.proxy.$Proxy426.getArticleResourcePrimKey(long, String)" threw an exception when invoked on com.sun.proxy.$Proxy426 object "com.liferay.journal.service.impl.JournalArticleResourceLocalServiceImpl@3cd75977"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: articleResourcePrimaryKey = journalAr... [in template "20096#20121#207707" at line 12, column 5]
----
1<#assign friendlyURLEntryLocalService=serviceLocator.findService("com.liferay.friendly.url.service.FriendlyURLEntryLocalService") />
2<#assign classNameLocalService=serviceLocator.findService("com.liferay.portal.kernel.service.ClassNameLocalService") />
3<#assign assetCategoryClassNameId=classNameLocalService.getClassNameId("com.liferay.asset.kernel.model.AssetCategory") />
4<#assign assetCategoryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
5
6<#assign excludedCategories=["News","Case Study","BREEAM","z_infracasestudiesppc","z_Report_listing","Report_list","Reports","LPCB","BRE Group","Cities","Press releases","Case_Study","Case study","BREEAM_Insights","BREEAM_NEWS","Insights"] />
7
8<#assign
9 journalArticleResourceLocalService=serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")
10 assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
11 journalArticleId=.vars['reserved-article-id'].data
12 articleResourcePrimaryKey=journalArticleResourceLocalService.getArticleResourcePrimKey(themeDisplay.getScopeGroupId(),
13 journalArticleId) assetEntry=assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle",
14 articleResourcePrimaryKey) assetCategories=assetEntry.getCategories() />
15
16<#assign rn=randomNamespace>
17
18<#list assetCategories as category>
19 <#assign categoryName=category.getName() />
20</#list>
21
22<!-- [Start] News Header -->
23<section class="c-news-header" style="background-image: url('${cardImage.getData()}')">
24 <div class="c-news-header__body">
25 <ul class="c-news-header__byline">
26 <#if categoryName?has_content>
27 <li class="c-news-header__category">${categoryName}</li>
28 </#if>
29 <#if getterUtil.getBoolean(autoPopulateDate.getData())>
30 <li class="c-news-header__date">
31 <#assign CardDate=.vars["reserved-article-create-date"].data />
32 <#if validator.isNotNull(CardDate)>
33 <#assign ArticleCardDate_DateObj=dateUtil.parseDate("EEE, d MMM yyyy HH:mm:ss Z", CardDate, locale)>
34 ${dateUtil.getDate(ArticleCardDate_DateObj, "dd MMMMM yyyy", locale)}
35 </#if>
36 </li>
37 </#if>
38
39 <#if getterUtil.getBoolean(autoPopulateAuthor.getData())>
40 <#if (cardAuthor.getData())?has_content>
41 <li class="c-news-header__author">${cardAuthor.getData()}</li>
42 <#else>
43 <li class="c-news-header__author">${.vars["reserved-article-author-name"].data}</li>
44 </#if>
45 </#if>
46 </ul>
47 <#if (cardTitle.getData())??>
48 <h1 class="c-section__title mb-0">
49 ${cardTitle.getData()}
50 </h1>
51 </#if>
52 </div>
53</section>
54<!-- [End] News Header -->
55
56
57<!-- [Start] Page Description -->
58<#if (cardDscription.getData())?has_content>
59 <section class="c-section">
60 <div class="container">
61 <div class="c-small-desc">
62 ${cardDscription.getData()}
63 </div>
64 </div>
65 </section>
66</#if>
67<!-- [End] Page Description -->
68
69
70<!-- [Start] Page Rich Description -->
71<#if (RichCardDscription.getData())?has_content>
72 <section class="c-section">
73 <div class="container">
74 <div class="c-small-desc">
75 ${RichCardDscription.getData()}
76 </div>
77 </div>
78 </section>
79</#if>
80<!-- [End] Page Rich Description -->
81
82
83<!-- [Start] News Details -->
84<section class="c-section c-section--gray-f5 c-casestudy-details c-section--ptb-32">
85 <div class="container">
86 <div class="row justify-content-center">
87 <div class="col-lg-12">
88 <div class="c-article-details">
89
90 <!-- [Start] Overview and About -->
91 <#assign webContentData=jsonFactoryUtil.createJSONObject(overviewAbout.getData()) />
92 <#if webContentData?? && webContentData.title??>
93 <div class="c-overview-about c-section pt-0">
94 <#assign journalArticleLocalService=serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
95 <#assign assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
96 <#assign asset=assetEntryLocalService.getEntry(webContentData.className, getterUtil.getLong(webContentData.classPK)) />
97 <#assign assetRenderer=asset.getAssetRenderer() journalArticle=assetRenderer.getAssetObject() />
98 <@liferay_journal["journal-article"]
99 articleId=journalArticle.getArticleId()
100 ddmTemplateKey=journalArticle.getDDMTemplateKey()
101 groupId=journalArticle.getGroupId()
102 />
103 </div>
104 </#if>
105 <!-- [End] Overview and About -->
106
107
108 <#if caseStudyGroup.getSiblings()?has_content>
109 <#list caseStudyGroup.getSiblings() as cur_caseStudyGroup>
110
111 <!-- [Start] Title -->
112 <#if (cur_caseStudyGroup.title.getData())?has_content>
113 <h2 class="c-article-details__title">
114 ${cur_caseStudyGroup.title.getData()}
115 </h2>
116 </#if>
117 <!-- [End] Title -->
118
119
120 <!-- [Start] Summary -->
121 <#--<#if (cur_caseStudyGroup.summary.getData())?has_content>
122 <div class="c-summary">
123 ${cur_caseStudyGroup.summary.getData()}
124 </div>
125 </#if> -->
126 <!-- [End] Summary -->
127
128
129 <!-- [Start] Slice -->
130 <#if (cur_caseStudyGroup.slice.getData())?has_content>
131 <div class="c-section-text">
132 ${cur_caseStudyGroup.slice.getData()}
133 </div>
134 </#if>
135 <!-- [End] Slice -->
136
137
138 <!-- [Start] Captioned Image -->
139 <#if (cur_caseStudyGroup.captionedImage.getData())?? && cur_caseStudyGroup.captionedImage.getData() != "">
140 <div class="c-captioned-image">
141 <div class="c-captioned-image__image">
142 <img class="img-fluid lazy" loading="lazy" alt="${cur_caseStudyGroup.captionedImage.getAttribute("alt")}" data-fileentryid="${cur_caseStudyGroup.captionedImage.getAttribute("fileEntryId")}" data-src="${cur_caseStudyGroup.captionedImage.getData()}" />
143 </div>
144 <div class="c-captioned-image__body">
145 ${cur_caseStudyGroup.captionedImage.getAttribute("alt")}
146 </div>
147 </div>
148 </#if>
149 <!-- [End] Captioned Image -->
150
151<!-- [Start] Captioned Image Popup -->
152<#if cur_caseStudyGroup.captionedImage.getData()??>
153<div class="c-captioned-image-popup">
154 <div class="container">
155 <div class="c-captioned-image-popup__header">
156 <i class="c-icon c-icon--close c-captioned-image-popup__close"></i>
157 </div>
158 <img src="" alt="" class="c-captioned-image-popup__image" />
159 </div>
160</div>
161<div class="c-captioned-popup__backdrop"></div>
162</#if>
163<!-- [End] Captioned Image Popup -->
164
165
166 <!-- [Start] Image Slider -->
167 <#if cur_caseStudyGroup.carouselImage.getSiblings()?has_content && (cur_caseStudyGroup.carouselImage.getSiblings()?size) gt 1>
168 <div class="c-article-image-slider c-section--carousel-half slick-carousel slick-carousel--one-half-card ${rn}_Carousel">
169 <#list cur_caseStudyGroup.carouselImage.getSiblings() as cur_caseStudyGroup_carouselImage>
170 <#if (cur_caseStudyGroup_carouselImage.getData())?has_content && cur_caseStudyGroup_carouselImage.getData()??>
171 <div>
172 <div class="c-image-placeholder">
173 <img class="img-fluid lazy" loading="lazy" alt="${cur_caseStudyGroup_carouselImage.getAttribute("alt")}" data-fileentryid="${cur_caseStudyGroup_carouselImage.getAttribute("fileEntryId")}" data-src="${cur_caseStudyGroup_carouselImage.getData()}" />
174 </div>
175 </div>
176 </#if>
177 </#list>
178 </div>
179 </#if>
180 <!-- [End] Image Slider -->
181
182
183 <!-- [Start] Video -->
184 <#if (cur_caseStudyGroup.video.getData())?has_content>
185 <div class="c-video">
186 <#if !cur_caseStudyGroup.video.getData()?contains("youtube") && !cur_caseStudyGroup.video.getData()?contains("vimeo")>
187 <div class="c-video__disabled">
188 ${cur_caseStudyGroup.video.getData()}
189 </div>
190 <#else>
191 ${cur_caseStudyGroup.video.getData()}
192 </#if>
193 </div>
194 </#if>
195 <!-- [End] Video -->
196
197
198 <!-- [Start] Slice -->
199 <#if (cur_caseStudyGroup.slice01.getData())?has_content>
200 <div class="c-section-text">
201 ${cur_caseStudyGroup.slice01.getData()}
202 </div>
203 </#if>
204 <!-- [End] Slice -->
205
206
207 <!-- [Start] Quotes -->
208
209 <#assign webContentData=jsonFactoryUtil.createJSONObject(cur_caseStudyGroup.quotes.getData()) />
210
211 <#if webContentData?? && webContentData.title??>
212 <div class="c-quotes">
213 <#assign journalArticleLocalService=serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
214 <#assign assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
215 <#assign asset=assetEntryLocalService.getEntry(webContentData.className, getterUtil.getLong(webContentData.classPK)) />
216 <#assign assetRenderer=asset.getAssetRenderer() journalArticle=assetRenderer.getAssetObject() />
217
218 <@liferay_journal["journal-article"]
219 articleId=journalArticle.getArticleId()
220 ddmTemplateKey=journalArticle.getDDMTemplateKey()
221 groupId=journalArticle.getGroupId()
222 />
223 </div>
224 </#if>
225
226 <!-- [End] Quotes -->
227
228
229 <!-- [Start] Slice -->
230 <#if (cur_caseStudyGroup.slice02.getData())?has_content>
231 <div class="c-section-text">
232 ${cur_caseStudyGroup.slice02.getData()}
233 </div>
234 </#if>
235 <!-- [End] Slice -->
236
237
238 <!-- [Start] Button -->
239 <#if (cur_caseStudyGroup.buttonText.getData())?has_content>
240 <a class="c-button c-button--secondary" data-senna-off="true"
241 href="${cur_caseStudyGroup.buttonLink.getData()}">
242 ${cur_caseStudyGroup.buttonText.getData()}
243 </a>
244 </#if>
245 <!-- [End] Button -->
246
247 </#list>
248 </#if>
249
250 </div>
251 </div>
252 </div>
253 </div>
254</section>
255<!-- [End] News Details -->
256
257<!--[Start] Tag option-->
258<#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
259<#assign plid=themeDisplay.getLayout().getParentPlid() />
260<#assign pageFriendlyURL=themeDisplay.getLayout().getFriendlyURL() />
261<#if plid?exists && plid!=0>
262 <#assign pageFriendlyURL=LayoutLocalService.getLayout(plid).getFriendlyURL()/>
263<#if pageFriendlyURL == "/press-releases-not-in-use" >
264 <#assign pageFriendlyURL="/media-centre" />
265<#elseif pageFriendlyURL=="/reports" >
266 <#assign pageFriendlyURL="/reports-categories" />
267</#if>
268</#if>
269
270<section class="c-section c-section--gray-f5 d-none c-article-related-tags" id="articleRelatedTags">
271 <div class="container">
272 <div class="row justify-content-center">
273 <div class="col-lg-12">
274 <div class="c-share">
275 <h3 class="c-share__title">Related Topics</h3>
276 <#list assetCategories as category>
277
278 <#assign curCategoryName =category.getName() />
279 <#if ! excludedCategories?seq_contains(curCategoryName)>
280 <#assign urlTitle="" />
281 <#assign curCategoryId = category.getCategoryId() />
282 <#assign curTagFriendlyUrl = "" />
283
284 <#assign friendlyURLs = friendlyURLEntryLocalService.getFriendlyURLEntryLocalizations(themeDisplay.getCompanyGroupId(), assetCategoryClassNameId, curCategoryId, localeUtil.toLanguageId(locale), 0, 1, null) />
285 <#if friendlyURLs?size == 1>
286 <#assign curTagFriendlyUrl = friendlyURLs[0].getUrlTitle() />
287 </#if>
288
289 <#assign curTagUrl = themeDisplay.getPortalURL() + pageFriendlyURL + "/tags/" + curTagFriendlyUrl />
290 <a href="${curTagUrl}" class="c-new-small-tag">${curCategoryName}</a>
291 </#if>
292 </#list>
293 </div>
294 </div>
295 </div>
296 </div>
297</section>
298<!--[End] Tag option-->
299
300<style>
301.c-section .c-section { padding: 0; }
302
303.c-article-details a {
304 color: #1e1836;
305}
306
307.c-summary ul li,
308.c-section-text ul li,
309.c-rich-text ul li {
310 display: block;
311 position: relative;
312 padding-left: 25px;
313}
314.c-summary ul li::before,
315.c-section-text ul li::before,
316.c-rich-text ul li::before {
317 position: absolute;
318 left: 0;
319}
320
321.c-captioned-image { cursor: pointer; }
322.c-captioned-image-popup {
323 display: none;
324 overflow-y: auto;
325 position: fixed;
326 top: 0;
327 left: 0;
328 width: 100%;
329 height: 100%;
330 z-index: 1045;
331 padding: 32px 0;
332}
333.c-captioned-image-popup.open {
334 display: block;
335}
336.c-captioned-image-popup__header {
337 display: flex;
338 justify-content: flex-end;
339}
340.c-captioned-image-popup__header .c-icon--close {
341 cursor: pointer;
342}
343.c-captioned-image-popup__image {
344 width: 100%;
345}
346.c-captioned-popup__backdrop {
347 display: none;
348 position: fixed;
349 top: 0;
350 left: 0;
351 z-index: 1040;
352 width: 100vw;
353 height: 100vh;
354 background-color: rgba(0, 0, 0, 0.25);
355}
356.c-overview-about .c-casestudy-overview + .c-casestudy-about{
357 padding-bottom: 16px;
358}
359.c-casestudy-details .c-section-text{
360 padding: 0 0 16px 0;
361}
362
363.c-casestudy-about .c-feature-card__desc,
364.c-casestudy-about .c-feature-card__desc p,
365.c-section-text table tr td {
366 font-size: 18px;
367 line-height: 21px;
368 letter-spacing: 1.5px;
369}
370
371.c-section-text table tr td { padding: 5px; }
372
373.c-article-related-tags .c-new-small-tag {
374 line-height: 1.5rem;
375 border: solid 1px #1E183680;
376 padding: 4px 8px;
377 color: #1E1836;
378 font-size: 14px;
379 cursor: pointer;
380 display: inline-flex;
381 border-radius: 0;
382 margin: 0 4px 8px 0;
383}
384.c-article-related-tags .c-new-small-tag:hover {
385 outline: solid 1px rgba(30, 24, 54, 0.2);
386 text-decoration: none;
387 color: #1E1836;
388}
389
390@media all and (min-width: 1200px) {
391 .c-text-block-head__title { font-size: 42px; }
392
393 .c-news-header .c-news-header__byline,
394 .c-news-header .c-section__title { padding-left: 4rem; }
395
396 .c-news-header .c-section__title::before {
397 width: 3.5rem;
398 height: 3.5rem;
399 background-image: url("/documents/d/bre-group/back-slash-blue-01");
400 }
401}
402</style>
403
404<script>
405 $(document).ready(function () {
406
407let pageRelatedTagsExists = $('#pageRelatedTags').length > 0;
408let pageRelatedTagsExistsLength = $('#pageRelatedTags .c-share').children('a.c-new-small-tag').length > 0;
409let articleRelatedTagsExists = $('#articleRelatedTags .c-share').children('a.c-new-small-tag').length > 0;
410
411if(pageRelatedTagsExists) {
412 if(!pageRelatedTagsExistsLength) {
413 $('#pageRelatedTags').parents('section.c-section.c-section--gray-fb').hide();
414 }
415} else {
416 let articleRelatedSection = document.querySelectorAll("#articleRelatedTags");
417 let relatedTagsBoolean = true;
418
419 articleRelatedSection.forEach(relatedArticles => {
420
421 let relatedTagsCount = relatedArticles.querySelectorAll('a.c-new-small-tag').length;
422
423 if (relatedTagsBoolean && relatedTagsCount != 0) {
424 relatedTagsBoolean = false;
425 $(relatedArticles).insertBefore('#footer').removeClass('d-none');
426 } else {
427 $(relatedArticles).addClass('d-none');
428 }
429 });
430}
431
432 $('.${rn}_Carousel').slick({
433 slidesToShow: 1.5,
434 slidesToScroll: 1,
435 arrows: true,
436 dots: true,
437 infinite: false,
438 accessibility: false,
439 responsive: [
440 {
441 breakpoint: 600,
442 settings: {
443 arrows: false,
444 slidesToShow: 1
445 }
446 }
447 ]
448 });
449
450 // Remove unwanted html for white space
451 let childElement = $('.${rn}_Carousel .slick-track').children();
452 if(childElement.length < 1) {
453 $('.${rn}_Carousel').remove();
454 }
455
456
457 // Captioned Image Popup
458 $('.c-captioned-image-popup').not(':first').remove();
459 $('.c-captioned-popup__backdrop').not(':first').remove();
460
461 const winWidth = $(window).width();
462
463 if(winWidth > 992) {
464 $('body').on('click', '.c-captioned-image', function() {
465 let imgSource = $(this).children('.c-captioned-image__image').find('img').attr('src');
466 //console.log($(this).children('.c-captioned-image__image').find('img').attr('src'));
467 $('body').css('overflow', 'hidden');
468 $('.c-captioned-popup__backdrop').show();
469 $('.c-captioned-image-popup').addClass('open');
470 $('.c-captioned-image-popup__image').attr('src', imgSource);
471 });
472
473 $('.c-captioned-image-popup__close').click(function(){
474 $('body').attr('style', '');
475 $('.c-captioned-popup__backdrop').hide();
476 $('.c-captioned-image-popup').removeClass('open');
477 $('.c-captioned-image-popup__image').attr('src', '');
478 });
479 }
480
481 });
482</script>