템플렛을 가공하고 있는 동안 과실은 일어났다.
Java method "com.liferay.dynamic.data.mapping.model.impl.DDMFormInstanceImpl.getStructure()" threw an exception when invoked on com.liferay.dynamic.data.mapping.model.impl.DDMFormInstanceImpl object "{\"mvccVersion\": 1, \"ctCollectionId\": 0, \"uuid\": \"07fc358f-a3f4-e64f-1bb5-16f62e4aa7f4\", \"formInstanceId\": 290652025, \"groupId\": 20152, \"companyId\": 20116, \"userId\": 39712, \"userName\": \"Steve Solano\", \"versionUserId\": 39712, \"versionUserName\": \"Steve Solano\", \"createDate\": \"Tue May 23 17:53:47 GMT 2017\", \"modifiedDate\": \"Wed Sep 15 14:24:55 GMT 2021\", \"structureId\": 290652021, \"version\": \"1.1\", \"name\": \"<?xml version='1.0' encoding='UTF-8'?><root available-locales='en_US' default-locale='en_US'><Name language-id='en_US'>Bio Contact Form</Name></root>\", \"description\": \"\", \"settings\": \"{'availableLanguageIds':['en_US'],'defaultLanguageId':'en_US','fieldValues':[{'instanceId':'exvV245f','name':'sendEmailNotification','fieldReference':'sendEmailNotification','value':'false'},{'instanceId':'cIFoduxS','name':'emailFromName','fieldReference':'emailFromName','value':''},{'instanceId':'8Ox9AwXJ','name':'redirectURL','fieldReference':'redirectURL','value':''},{'instanceId':'0nhGge5T','name':'workflowDefinition','fieldReference':'workflowDefinition','value':'[\\'\\']'},{'instanceId':'6r83IgG3','name':'emailFromAddress','fieldReference':'emailFromAddress','value':''},{'instanceId':'sGeOtgYC','name':'emailToAddress','fieldReference':'emailToAddress','value':''},{'instanceId':'zM7JwyoB','name':'storageType','fieldReference':'storageType','value':'[\\'json\\']'},{'instanceId':'7Pn4M6Uj','name':'requireCaptcha','fieldReference':'requireCaptcha','value':'true'},{'instanceId':'CHaHtlDN','name':'published','fieldReference':'published','value':'false'},{'instanceId':'gKn9iPxu','name':'emailSubject','fieldReference':'emailSubject','value':''},{'instanceId':'cmmryJph','name':'autosaveEnabled','fieldReference':'autosaveEnabled','value':'true'},{'instanceId':'1JgbW5Zx','name':'requireAuthentication','fieldReference':'requireAuthentication','value':'false'}]}\", \"lastPublishDate\": null}"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign structure = recordset.getStru... [in template "20116#20152#31814" at line 427, column 9] ----
1<#-- Web content templates are used to lay out the fields defined in a web content structure. Please use the left panel to quickly add commonly used variables. Autocomplete is also available and can be invoked by typing "${". -->
2<#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() />
3<#assign themeDisplay = serviceContext.getThemeDisplay() />
4<#assign preview = false/>
5
6<#if (themeDisplay.getURLCurrent()?contains("preview_article_content.jsp")) || (themeDisplay.getURLCurrent()?contains("preview_article_content_template.jsp"))>
7 <#assign preview = true />
8
9 <script data-senna-track="permanent"
10 src="/o/atk-dot-com-theme/js/react/dist/vendor.bundle.js"></script>
11
12 <script data-senna-track="permanent"
13 src="/o/atk-dot-com-theme/js/react/dist/bundle.js"></script>
14
15 <style data-senna-track="temporary" type="text/css">
16 :root {
17 --container-max-sm: 576px;
18 --h4-font-size: 22px;
19 --font-weight-bold: 700;
20 --rounded-pill: 50rem;
21 --navigation-submenu-item-float: left;
22 --display4-weight: 300;
23 --danger: #da1414;
24 --atk-row: absolute;
25 --display2-size: 5.5rem;
26 --body-bg: #f9f9f9;
27 --display2-weight: 300;
28 --display1-weight: 300;
29 --display3-weight: 300;
30 --box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075);
31 --text-align-hero-text-container: center;
32 --cta-background-color: #F5F5F5;
33 --font-weight-lighter: lighter;
34 --h3-font-size: 36px;
35 --btn-outline-primary-hover-border-color: #0b5fff;
36 --transition-collapse: height .35s ease;
37 --blockquote-small-color: #6b6c7e;
38 --gray-200: #f1f2f5;
39 --btn-secondary-hover-background-color: #f7f8f9;
40 --gray-600: #6b6c7e;
41 --secondary: #6b6c7e;
42 --btn-outline-primary-color: #0b5fff;
43 --btn-link-hover-color: #004ad7;
44 --hr-border-color: rgba(0, 0, 0, .1);
45 --hr-border-margin-y: 1rem;
46 --light: #f1f2f5;
47 --btn-outline-primary-hover-color: #0b5fff;
48 --font-weight-read-more: 400;
49 --btn-secondary-background-color: #fff;
50 --btn-outline-secondary-hover-border-color: transparent;
51 --display3-size: 4.5rem;
52 --primary: #0b5fff;
53 --container-max-md: 768px;
54 --border-radius-sm: 0.1875rem;
55 --display-line-height: 1.2;
56 --font-family-hero-text: 'Graphik Web';
57 --h6-font-size: 0.8125rem;
58 --h2-font-size: 44px;
59 --aspect-ratio-4-to-3: 75%;
60 --font-family-read-more: 'Graphik Web';
61 --spacer-10: 10rem;
62 --font-family-semibold: 'Graphik Web';
63 --font-weight-normal: 400;
64 --dark: #272833;
65 --blockquote-small-font-size: 80%;
66 --h5-font-size: 0.875rem;
67 --blockquote-font-size: 1.25rem;
68 --transition-fade: opacity .15s linear;
69 --display4-size: 3.5rem;
70 --border-radius-lg: 0.375rem;
71 --btn-primary-hover-color: #fff;
72 --display1-size: 6rem;
73 --black: #000;
74 --gray-300: #e7e7ed;
75 --gray-700: #495057;
76 --btn-secondary-border-color: #cdced9;
77 --btn-outline-secondary-hover-color: #272833;
78 --purple: #7823DC;
79 --body-color: #111;
80 --btn-outline-secondary-hover-background-color: rgba(39, 40, 51, 0.03);
81 --font-weight-button-body: 400;
82 --btn-primary-color: #fff;
83 --btn-secondary-color: #6b6c7e;
84 --btn-secondary-hover-border-color: #cdced9;
85 --box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175);
86 --container-max-lg: 992px;
87 --btn-outline-primary-border-color: #0b5fff;
88 --aspect-ratio: 100%;
89 --cta-link-hover-color: #000;
90 --body-container: #fff;
91 --cta-link-color: #7823DC;
92 --aspect-ratio-16-to-9: 56.25%;
93 --box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15);
94 --white: #fff;
95 --portlet-bg-color: #272833;
96 --warning: #b95000;
97 --info: #2e5aac;
98 --hr-border-width: 1px;
99 --btn-link-color: #0b5fff;
100 --gray-400: #cdced9;
101 --font-weight-hero-text-h4: 100;
102 --gray-800: #393a4a;
103 --font-weight-semibold: 600;
104 --btn-outline-primary-hover-background-color: #f0f5ff;
105 --btn-primary-hover-background-color: #0053f0;
106 --btn-primary-background-color: #0b5fff;
107 --font-weight-heading4: 100;
108 --font-weight-hero-text-h1: 600;
109 --font-weight-heading3: 400;
110 --success: #287d3c;
111 --font-family-heading4: 'Graphik Web';
112 --font-family-heading3: 'Graphik Web';
113 --font-weight-heading2: 400;
114 --font-weight-heading1: 600;
115 --font-size-sm: 0.875rem;
116 --font-family-heading2: 'Graphik Web';
117 --btn-primary-border-color: #0b5fff;
118 --font-family-heading1: 'Graphik Web';
119 --font-family-base: 'Arabic', sans-serif;
120 --spacer-0: 0;
121 --font-family-monospace: 'Arabic', sans-serif;
122 --lead-font-size: 1.25rem;
123 --border-radius: 0.25rem;
124 --spacer-9: 9rem;
125 --font-weight-light: 300;
126 --btn-secondary-hover-color: #272833;
127 --spacer-2: 0.5rem;
128 --font-family-button-body: 'Graphik Web';
129 --spacer-1: 0.25rem;
130 --spacer-4: 1.5rem;
131 --spacer-3: 1rem;
132 --spacer-6: 4.5rem;
133 --spacer-5: 3rem;
134 --spacer-8: 7.5rem;
135 --border-radius-circle: 50%;
136 --spacer-7: 6rem;
137 --font-size-lg: 1.125rem;
138 --aspect-ratio-8-to-3: 37.5%;
139 --font-family-sans-serif: 'Arabic', sans-serif;
140 --gray-100: #f7f8f9;
141 --font-weight-bolder: 900;
142 --container-max-xl: 1280px;
143 --btn-outline-secondary-color: #6b6c7e;
144 --custom-black: #1E1E1E;
145 --gray-500: #a7a9bc;
146 --h1-font-size: 66px;
147 --gray-900: #272833;
148 --text-muted: #a7a9bc;
149 --btn-primary-hover-border-color: transparent;
150 --btn-outline-secondary-border-color: #cdced9;
151 --lead-font-weight: 300;
152 --font-size-base: 0.875rem;
153 }
154
155 #leftColumnDiv
156 a{
157 color: var(--purple) !important;
158 text-decoration: underline !important;
159 text-decoration-color: #E6E6E6 !important;
160 }
161
162 #leftColumnDiv
163 a:hover{
164 text-decoration: none !important;
165 }
166
167 a.smallerMobileText
168 {
169 color: var(--purple) !important;
170 text-decoration: underline !important;
171 text-decoration-color: #E6E6E6 !important;
172 }
173
174
175 a.smallerMobileText:hover{
176 text-decoration: none !important;
177 }
178
179 </style>
180
181</#if>
182
183<#assign JournalArticleLocalService = serviceLocator.findService(
184"com.liferay.journal.service.JournalArticleLocalService")>
185<#assign AssetEntryLocalService = serviceLocator.findService(
186"com.liferay.asset.kernel.service.AssetEntryLocalService")>
187<#assign AssetCategoryLocalService = serviceLocator.findService(
188"com.liferay.asset.kernel.service.AssetCategoryLocalService")>
189<#assign AssetVocabularyLocalService = serviceLocator.findService(
190"com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
191<#assign AssetCategoryPropertyLocalService = serviceLocator.findService(
192"com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")/>
193<#assign AssetLinkLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetLinkLocalService")>
194<#assign GroupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")>
195<#assign CurrentJournalArticle = JournalArticleLocalService.getLatestArticle(groupId,.vars['reserved-article-id'].data)>
196<#assign CurrentAssetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle",CurrentJournalArticle.getResourcePrimKey())>
197<#assign AssetLinks = AssetLinkLocalService.getReverseLinks(CurrentAssetEntry.getEntryId(), 0)>
198
199<#assign TemplateCustomService = serviceLocator.findService("template.custom.services.TemplateCustomService") />
200<!-- update name here if change asset library name -->
201<#assign assetLibGroup = GroupLocalService.getGroup(themeDisplay.getCompanyId(), "Kearney Global Asset Library") />
202<#assign DLFolderLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFolderLocalService")/>
203<#assign DLFileEntryLocalService = serviceLocator.findService(
204 "com.liferay.document.library.kernel.service.DLFileEntryLocalService")/>
205<#if assetLibGroup?? >
206 <#assign assetLibGroupId = assetLibGroup.getGroupId() />
207</#if>
208<#assign atkGroupId = company.getGroupId() />
209<#assign layoutUrl = themeDisplay.getLayout().getFriendlyURL()/>
210
211<#-- Macro used to get specific field text from an Asset Entry -->
212<#macro entryNode assetEntry field>
213 <#assign document = saxReaderUtil.read(assetEntry.getContent())>
214 <#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??>
215 "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}"
216 <#else>
217 ""
218 </#if>
219</#macro>
220
221<!-- Adjust portlet topper offset since bio goes to top of page -->
222<style>
223 header.portlet-topper {
224 position: absolute !important;
225 top: 33px !important;
226 width: 100% !important;
227 }
228</style>
229
230<div id="employeeBioDiv"></div>
231<script>
232
233 <#if DisplayHeadshot??>
234 <#assign displayHeadshot = DisplayHeadshot.getData()>
235 <#else>
236 <#assign displayHeadshot = "" >
237 </#if>
238
239 var empInfo = {
240 fullName: "${FullName.getData()?js_string}",
241 preferredName: "${PreferredFirstName.getData()?js_string}",
242 position: "${Position.getData()?js_string}",
243 office: "${Office.getData()?js_string}",
244 title: "${Title.getData()?js_string}",
245 linkedIn: "${LinkedInURL.getData()?js_string}",
246 headshotLocation: "${displayHeadshot}",
247 quote: "${Quote.getData()?js_string}",
248 description: "${Description.getData()?js_string}",
249 urlTitle: "${.vars['reserved-article-url-title'].data?js_string}"
250 };
251
252 <#assign industryVocabulary = AssetVocabularyLocalService.getGroupVocabulary(atkGroupId, "Industries")/>
253 <#assign industryCategories = industryVocabulary.getCategories()/>
254
255 var industryCategories = [];
256 <#list industryCategories as category>
257 <#if category.parentCategoryId == 0>
258 <#attempt>
259 <#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/>
260 industryCategories.push({
261 id: "${category.categoryId}",
262 name: "${category.name}",
263 url: "${categoryUrl.value}",
264 });
265 <#recover>
266 console.log("could not find url property on industry category ${category.name?js_string}");
267 </#attempt>
268 </#if>
269 </#list>
270
271 var industries = [];
272 <#if Industries.getSiblings()?has_content>
273 <#list Industries.getSiblings() as cur_Industries>
274 var defaultChecked = false;
275 <#if getterUtil.getBoolean(cur_Industries.UseDefaultIndustryPage.getData())>
276 defaultChecked = true;
277 </#if>
278 industries.push({
279 title: "${cur_Industries.getData()?js_string}",
280 customURL: "${cur_Industries.CustomIndustryURL.getData()?js_string}",
281 useDefault: defaultChecked
282 });
283 </#list>
284 </#if>
285
286 <#assign expertiseVocabulary = AssetVocabularyLocalService.getGroupVocabulary(atkGroupId, "Capabilities")/>
287 <#assign expertiseCategories = expertiseVocabulary.getCategories()/>
288
289 var expertiseCategories = [];
290 <#list expertiseCategories as category>
291 <#if category.parentCategoryId == 0>
292 <#attempt>
293 <#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/>
294 expertiseCategories.push({
295 id: "${category.categoryId}",
296 name: "${category.name}",
297 url: "${categoryUrl.value}",
298 });
299
300 <#recover>
301 console.log("could not find url property on capability category ${category.name?js_string}");
302 </#attempt>
303 </#if>
304 </#list>
305
306 var expertise = [];
307 <#if Expertise?? && Expertise.getSiblings()?has_content>
308 <#list Expertise.getSiblings() as cur_Expertise>
309 var defaultChecked = false;
310 <#if getterUtil.getBoolean(cur_Expertise.UseDefaultExpertisePage.getData())>
311 defaultChecked = true;
312 </#if>
313 expertise.push({
314 title: "${cur_Expertise.getData()?js_string}",
315 customURL: "${cur_Expertise.CustomExpertiseURL.getData()?js_string}",
316 useDefault: defaultChecked
317 });
318 </#list>
319 </#if>
320
321
322 var clientImpact = [];
323 <#if ClientImpactTitle?? && ClientImpactTitle.getSiblings()?has_content>
324 <#list ClientImpactTitle.getSiblings() as cur_ClientImpactTitle>
325
326 var impactUrlTitle = "";
327 <#assign jArt = "" />
328 <#if cur_ClientImpactTitle.impactUrlTitle?? && cur_ClientImpactTitle.impactUrlTitle.getData()?has_content>
329 <#assign jArt = JournalArticleLocalService.getArticleByUrlTitle(assetLibGroupId, cur_ClientImpactTitle.impactUrlTitle.getData()) />
330 impactUrlTitle = "${cur_ClientImpactTitle.impactUrlTitle.getData()?js_string}";
331 </#if>
332
333 var link = "";
334 <#if cur_ClientImpactTitle.ClientImpactLink?? && cur_ClientImpactTitle.ClientImpactLink.getData()?has_content>
335 link = "${cur_ClientImpactTitle.ClientImpactLink.getData()?js_string}";
336 </#if>
337
338 var title = "";
339 <#if cur_ClientImpactTitle?? && cur_ClientImpactTitle.getData()?has_content>
340 title = "${cur_ClientImpactTitle.getData()?js_string}";
341 <#elseif jArt != "">
342 title = "${jArt.getTitle(locale)?js_string}";
343 </#if>
344
345 var subtitle = "";
346 <#if cur_ClientImpactTitle.ClientImpactText?? && cur_ClientImpactTitle.ClientImpactText.getData()?has_content>
347 subtitle = "${cur_ClientImpactTitle.ClientImpactText.getData()?js_string}";
348 <#elseif jArt != "">
349 subtitle = <@entryNode assetEntry=jArt field="Subtitle"/>;
350 </#if>
351
352 var svgMask = "";
353 <#if TextDecoration.getData()?has_content>
354 svgMask = "${TextDecoration.getData()?js_string}";
355 <#elseif jArt != "">
356 svgMask = <@entryNode assetEntry=jArt field="SvgMask"/>;
357 </#if>
358
359 var articleCategories = [];
360 <#if jArt != "">
361 <#assign jAsset = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", jArt.getResourcePrimKey()) />
362 <#assign assetCategories = AssetCategoryLocalService.getAssetEntryAssetCategories(jAsset.getEntryId()) />
363
364 <#list assetCategories as category>
365 <#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())>
366 <#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/>
367 articleCategories.push({
368 id: "${category.categoryId}",
369 name: "${category.name}",
370 url: "${categoryUrl.value}",
371 vocabularyName: "${categoryVocabulary.getName()?js_string}",
372 });
373 </#list>
374 </#if>
375
376 clientImpact.push({
377 slug: "Client Impact",
378 title: title,
379 description: subtitle,
380 largeDescriptionText: 'false',
381 link: link,
382 urlTitle: impactUrlTitle,
383 categories: articleCategories,
384 displayType: "Bio Feature",
385 svgMaskURL: svgMask
386 });
387 </#list>
388 </#if>
389
390 if (clientImpact.length > 0) {
391 <#if SmallerPrimaryClientImpactTitle??>
392 clientImpact[0].useSmallerTitle = !${getterUtil.getBoolean(SmallerPrimaryClientImpactTitle.getData())?c};
393 <#else>
394 clientImpact[0].useSmallerTitle = false;
395 </#if>
396
397 <#if SmallerPrimaryClientImpactSubtitle??>
398 clientImpact[0].largeDescriptionText = '' + (!${getterUtil.getBoolean(SmallerPrimaryClientImpactSubtitle.getData())?c});
399 <#else>
400 clientImpact[0].largeDescriptionText = 'true';
401 </#if>
402 }
403
404 if (clientImpact[0].useSmallerTitle) {
405 clientImpact[0].titleTextSize = 'heading1';
406 } else {
407 clientImpact[0].titleTextSize = 'heading2';
408 }
409
410 var perspectives = [];
411 <#if PerspectiveTitle?has_content && PerspectiveTitle.getSiblings()?has_content>
412 <#list PerspectiveTitle.getSiblings() as cur_PerspectiveTitle>
413 <#if cur_PerspectiveTitle.getData()?has_content && cur_PerspectiveTitle.PerspectiveLink.getData()?has_content>
414 perspectives.push({
415 title: "${cur_PerspectiveTitle.getData()?js_string}",
416 link: "${cur_PerspectiveTitle.PerspectiveLink.getData()?js_string}",
417 });
418 </#if>
419 </#list>
420 </#if>
421
422
423 var formData = {};
424 <#assign recordset = TemplateCustomService.getBioDDMDdmFormInstance() >
425 <#if recordset??>
426 <#assign recordSetUUID = recordset.getUuid()>
427 <#assign structure = recordset.getStructure() >
428 <#assign JSONFactory = serviceLocator.findService(
429 "com.liferay.portal.kernel.json.JSONFactory")/>
430 <#assign definition = JSONFactory.createJSONObject(structure.getDefinition()) >
431 <#assign description = structure.getDescription("en_US") >
432
433 <#assign name = structure.getName("en_US") >
434
435 formData = {
436 configuration: {formId: '${recordSetUUID}'},
437 definition: ${definition},
438 description: "${description}",
439 name: "${name}"
440 }
441 </#if>
442
443
444
445 ATK.React.App.EmployeeBio('employeeBioDiv', empInfo, industries, industryCategories, expertise, expertiseCategories, clientImpact, perspectives, formData); </script>
446<#compress>
447 <script type="application/ld+json">
448 {
449 "@context": "https://schema.org/",
450 "@type": "ProfilePage",
451 "mainEntity": {
452 "@type": "Person",
453 "name": "<#if (FullName.getData())??>${FullName.getData()}</#if>",
454 "givenName": "<#if (PreferredFirstName.getData())??>${PreferredFirstName.getData()}</#if>",
455 "familyName": "<#if (FullName.getData())??><#if (FullName.getData())?contains(" ")>${FullName.getData()?split(" ")[1]}<#elseif (FullName.getData())?contains("・")>${FullName.getData()?split("・")[1]}<#else>${FullName.getData()}</#if></#if>",
456 "url": "https://www.kearney.com${layoutUrl}",
457 "image": "<#if (DisplayHeadshot.getData())??>${"https://www.kearney.com" + DisplayHeadshot.getData()}</#if>",
458 "jobTitle": "<#if (Title.getData())??>${Title.getData()}</#if>",
459 "worksFor": {
460 "@id": "https://www.kearney.com#organization"
461 },
462 "sameAs": [
463 "<#if (LinkedInURL.getData())??>${LinkedInURL.getData()}</#if>"
464 ]
465 }
466 }
467 </script>
468</#compress>