An error occurred while processing the template.
The following has evaluated to null or missing: ==> serviceLocator.findService("com.eversis.esa.eomall.eopages.core.util.ServiceArticleUtils") [in template "903221#903260#907371" at line 8, column 27] ---- Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: serviceArticleUtils = serviceLocator... [in template "903221#903260#907371" at line 8, column 5] - Reached through: #assign-container [in template "903221#903260#907371" at line 1, column 1] ----
1<#assign
2 defaultImage = themeDisplay.getPathThemeImages() + '/default_image.png'
3 journalArticleId = .vars['reserved-article-id'].data
4 groupId = themeDisplay.getLayout().getGroupId()
5 journalArticleUtil = serviceLocator.findService("com.eversis.esa.eomall.eopages.core.util.JournalArticleUtils")
6 journalArticle = journalArticleUtil.getJournalArticleByArticleId(journalArticleId)
7 journalArticleTitle = .vars['reserved-article-title'].data
8 serviceArticleUtils = serviceLocator.findService("com.eversis.esa.eomall.eopages.core.util.ServiceArticleUtils")
9 taxonomyList = serviceArticleUtils.getServiceArticleMarketSectorCategories(journalArticle)
10 navigationPageService = serviceLocator.findService("com.eversis.esa.eomall.eopages.core.service.NavigationPageService")
11 organizationUtils = serviceLocator.findService("com.eversis.esa.eomall.eopages.core.util.OrganizationUtils")
12 organizationId = organizationUtils.getOrganizationIdByGroupId(journalArticle.getGroupId())
13 organizationLogo = ''
14 organizationURL = ''
15 organizationPhoneNumber = ''
16 organizationFaxNumber = ''
17 organizationEmailAddress = ''
18 organizationCountry = ''
19 organizationAddress = ''
20 organizationName = ''
21 organizationArticleUrl = ''
22 portalBaseURL = themeDisplay.getPortalURL()
23 currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent()
24/>
25
26<#if organizationId != 0>
27 <#assign
28 organization = organizationUtils.getOrganizationById(organizationId)
29 organizationLogo = organizationUtils.getOrganizationLogoImageURL(organizationId)
30 organizationPhoneNumber = organizationUtils.getOrganizationPrimaryPhoneNumber(organizationId)
31 organizationFaxNumber = organizationUtils.getOrganizationFaxNumber(organizationId)
32 organizationEmailAddress = organizationUtils.getOrganizationPrimaryEmailAddress(organizationId)
33 organizationURL = organizationUtils.getOrganizationPrimaryWebsiteURL(organizationId)
34 organizationName = organization.getName()
35 organizationCountry = organization.getAddress().getCountry().getName()
36 organizationAddress = organization.getAddress().getStreet1() + ', ' + organization.getAddress().getZip() + ' ' + organization.getAddress().getCity()
37 organizationAddress = organizationAddress?trim
38 organizationArticleUrl = navigationPageService.getFriendlyUrlForOrganizationArticle(journalArticle.getGroupId())
39 />
40
41 <script type="application/ld+json">
42 {
43 "@context": "https://schema.org",
44 "@type": "Service",
45 "name": "${journalArticleTitle}",
46 "description": "${Description.getData()}",
47 "logo": {
48 "@type": "ImageObject",
49 "url": "${themeDisplay.getPortalURL()}${organizationLogo}"
50 },
51 "image": <#if MainImage??>"${themeDisplay.getPortalURL()}${MainImage.getData()}"</#if>,
52 "url": "${currentUrl}",
53 "areaServed": [
54 <#if MainImage?? && MainImage.MainImageSubtitle?has_content && MainImage.MainImageSubtitle.getData() != ''>
55 "${MainImage.MainImageSubtitle.getData()}"
56 </#if>
57 ],
58 <#if organizationId != 0>
59 "brand": {
60 "@type": "Organization",
61 "legalName": "${organizationName}",
62 "logo": {
63 "@type": "ImageObject",
64 "url": "${themeDisplay.getPortalURL()}${organizationLogo}"
65 },
66 "telephone": "${organizationPhoneNumber}",
67 "faxNumber": "${organizationFaxNumber}",
68 "email": "${organizationEmailAddress}",
69 "url": "${organizationURL}"
70 },
71 </#if>
72 <#if organizationId != 0>
73 "provider": {
74 "@type": "Organization",
75 "legalName": "${organizationName}",
76 "logo": {
77 "@type": "ImageObject",
78 "url": "${themeDisplay.getPortalURL()}${organizationLogo}"
79 },
80 "telephone": "${organizationPhoneNumber}",
81 "faxNumber": "${organizationFaxNumber}",
82 "email": "${organizationEmailAddress}",
83 "url": "${organizationURL}"
84 },
85 </#if>
86 "serviceType": [
87
88 <#if taxonomyList?has_content>
89 <#list taxonomyList as taxonomyValue>
90 "${taxonomyValue.getName()}"<#if taxonomyValue?has_next>,</#if>
91 </#list>
92 </#if>
93 ]
94 }
95 </script>
96</#if>
97
98<#compress>
99 <div class="row">
100 <div class="col-12 service article service-${journalArticleId}" id="service" data-service-id="${journalArticleId}">
101 <div class="col-12 col-lg-8 offset-lg-2 page__section">
102 <div class="margin-top-30 row">
103 <p class="h5 col-sm-12 text-center font-bold margin-bottom-0 text-uppercase"><@liferay.language key="Service.Service" /></p>
104 <h1 class="col-12 text-center margin-bottom-30 section__name service__name" data-property="serviceName" data-information-type="main">${journalArticleTitle}</h1>
105 <#if taxonomyList?has_content>
106 <div class="col-12 line-clamp-animation">
107 <p class="text-center text-uppercase margin-bottom-15 font-bold lines-em-3" data-property="taxonomiesList" data-list="true">
108 <#list taxonomyList as taxonomyValue>
109 <span data-property-items="taxonomiesList">${taxonomyValue.getName()}</span><#if taxonomyValue?has_next>, </#if>
110 </#list>
111 </p>
112 </div>
113 </#if>
114 <div class="d-flex justify-space-between col-12">
115 <div class="col-3"></div>
116 <p class="col-6 margin-bottom-30 text-center service__by" data-property="organizationName" data-information-type="main">
117 <@liferay.language key="Service.by" /> <a href="${organizationArticleUrl}" title="${organizationName}" >${organizationName}</a>
118 </p>
119 <div class="col-3 d-flex extra-options" style="justify-content: flex-end;">
120 <button class="generate-pdf margin-right-15">
121 <i class="icon eo-icon-pdf"></i>
122 </button>
123 <div class="product__share_trigger relative">
124 <i class="icon eo-icon-share"></i>
125 <div class="product__share">
126 <span data-link="#share-facebook" data-title="${journalArticleTitle}" data-description="${Description.getData()}" class="padding-right-15"><i class="eo-icon-facebook"></i></span>
127 <span data-link="#share-linkedin" data-title="${journalArticleTitle}" data-description="${Description.getData()}" class="padding-right-15"><i class="eo-icon-linkedin"></i></span>
128 <span data-link="#share-twitter" data-title="${journalArticleTitle}" data-description="${Description.getData()}"><i class="eo-icon-twitter"></i></span>
129 </div>
130 </div>
131 </div>
132 </div>
133 <#if Description?has_content && Description.getData() != ''>
134 <p class="col-12 text-center margin-bottom-30 section__description service__description" data-property="productDescription" data-information-type="main">${Description.getData()}</p>
135 </#if>
136 </div>
137 <div class="links links--service">
138 <div class="w-100 margin-bottom-30">
139 <h4 class="margin-bottom-0">
140 <#if MainImage?? && MainImage.MainImageTitle?has_content && MainImage.MainImageTitle.getData() != ''>
141 ${MainImage.MainImageTitle.getData()}
142 </#if>
143 </h4>
144 <#if MainImage?? && MainImage.MainImageSubtitle?has_content && MainImage.MainImageSubtitle.getData() != ''>
145 <div>${MainImage.MainImageSubtitle.getData()}</div>
146 </#if>
147 </div>
148 </div>
149 <#if MainImage?has_content && MainImage.getData()?? && MainImage.getData() !="">
150 <div class="section__main_image service__main_image">
151 <div class="w-100">
152 <div class="ratio-box ratio-box--16-9">
153 <img alt="${MainImage.getAttribute("alt")}" data-fileentryid="${MainImage.getAttribute("fileEntryId")}" src="${MainImage.getData()}" onerror='this.src="${defaultImage}"' />
154 </div>
155 </div>
156 </div>
157 </#if>
158 <!-- FAVORITE -->
159 <button class="button button--favourite button--save-product d-none float-right margin-top-30">
160 <i class="icon eo-icon-star"></i>
161 <span class="button__text"><@liferay.language key="Service.Save-to-list" /></span>
162 </button>
163 </div>
164 </div>
165 </div>
166</#compress>