Une erreur s'est produite lors du traitement du gabarit.
Java method "com.ch5finland.genelec.cms.service.impl.CMSContentFormatterServiceImpl.getMarkdown(String)" threw an exception when invoked on com.ch5finland.genelec.cms.service.impl.CMSContentFormatterServiceImpl object "com.ch5finland.genelec.cms.service.impl.CMSContentFormatterServiceImpl@61e9ea58"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign summary = cmsContentFormatter... [in template "20116#20152#253374" at line 29, column 5]
----
1<#--
2 Discontinued Main Image
3-->
4
5<#if cmsEntity?has_content>
6<#include "${templatesPath}/227222" /> <@sectionHeader title="${title}" menuTitle="${menuTitle}" cssClasses="bg-white" id="discontinued-section-main"/>
7<#assign ns = themeDisplay.portletDisplay.getId() >
8<#assign siteDefaultLocale = portalUtil.getSiteDefaultLocale(groupId)?string?replace("_","-") >
9
10<#assign iconSetPath ="/o/genelec-site-theme/images/icons/symbol-defs.svg">
11<#if cmsEntity.getField(profile, "/entity/relationships/variants")?has_content>
12 <#assign variants = cmsEntity.getField(profile, "/entity/relationships/variants") >
13</#if>
14<#if cmsEntity.getField(profile, "/entity/fields")?has_content>
15 <#assign fields = cmsEntity.getField(profile, "/entity/fields") >
16</#if>
17<#if cmsEntity.getLocalizedField(profile, "/entity/fields/title")?has_content>
18 <#assign productTitle = cmsEntity.getLocalizedField(profile, "/entity/fields/title")>
19</#if>
20<#if cmsEntity.getField(profile, "/entity/relationships/awards")?has_content>
21 <#assign awards = cmsEntity.getField(profile, "/entity/relationships/awards") >
22</#if>
23
24
25<#if cmsEntity.getLocalizedField(profile, "/entity/fields/content")?has_content >
26 <#assign content = cmsContentFormatterService.getMarkdown(cmsEntity.getLocalizedField(profile, "/entity/fields/content"))>
27</#if>
28<#if cmsEntity.getField(profile, "/entity/fields/summary")?has_content >
29 <#assign summary = cmsContentFormatterService.getMarkdown(cmsEntity.getLocalizedField(profile, "/entity/fields/summary"))>
30</#if>
31
32<#assign portalUrl = themeDisplay.getPortalURL() >
33<#assign currentURL = portalUrl + themeDisplay.getURLCurrent() >
34<@appendHTMLMetas currentURL cmsEntity "product" />
35
36 <div class="row">
37 <div class="col-lg-6">
38 <div class="product-page-heading">
39 <h1>${productTitle}</h1>
40 <#if cmsEntity.getLocalizedField(profile, "/entity/fields/subtitle")?has_content>
41 <h1 class="subtitle">${cmsEntity.getLocalizedField(profile, "/entity/fields/subtitle")}</h1>
42 </#if>
43 </div>
44 <div class="row justify-content-between">
45 <div class="col-lg-12 article-content">
46 <div class="product-page-intro">
47 <#if cmsEntity.getField(profile, "/entity/relationships/discontinuedProductReplacedBy")?has_content>
48 <#assign replacedBys = cmsEntity.getField(profile, "/entity/relationships/discontinuedProductReplacedBy")>
49 <#list replacedBys.iterator() as replacedBy>
50 <#assign replacedByName = localizeField(replacedBy.properties.title, profile.getCMSLangCode())>
51 <#if replacedBy?index == 0 && replacedBy?is_last>
52 <@liferay.language key="replaced-by"/> ${replacedByName}
53 <#elseif replacedBy?index == 0 && replacedBy?is_first>
54 <@liferay.language key="replaced-byMulti"/> ${replacedByName}<#sep>,
55 <#else>
56 ${replacedByName}<#sep>,
57 </#if>
58 </#list>
59 </#if>
60 </div>
61 </div>
62 </div>
63 <div class="row">
64 <div class="col-lg-12">
65 <p>
66 <#if awards?has_content>
67 <#list awards.iterator() as award>
68 <#assign awardIndex = award?index>
69 <#if !award.assets.isNull("image")>
70 <#assign awardImage = award.assets.image.url >
71 <a href="#/" onClick="openPopup(9)">
72 <@imageThumbnail src="${awardImage}" id="" cssClasses="award-img" thumbnail="awardImg" alt="${localizeField(award.properties.title, profile.getCMSLangCode())}"/>
73 </a>
74 </#if>
75 </#list>
76 <#if awardIndex gt -1>
77 <i class="award-icon default-icon icon-plus-sign" onClick="openPopup(9)" title="<@liferay.language key="more-info"/>"></i>
78 </#if>
79 </#if>
80 <p>
81 <hr>
82 </div>
83 </div>
84 <div class="row">
85 <div class="col-lg-12">
86 <#if summary?has_content>
87 <div class="product-page-intro">${summary}</div>
88 </#if>
89 <#if content?has_content>
90 <p>${content}</p>
91 </#if>
92 </div>
93 </div>
94 </div>
95 <#if variants?has_content>
96 <div class="col-lg-6">
97 <#list variants.iterator() as variant>
98 <#assign vImages = variantImages(variant,siteDefaultLocale) >
99
100 <#if vImages?has_content>
101 <#if variant?index = 0>
102 <@imageZoom
103 id=variant.id
104 cssClasses="zoom-gallery-slide active"
105 images=vImages
106 carouselCss="discontinued-carousel owl-carousel owl-theme image-carousel-container"
107 zoomCss="MagicZoom discontinued-page-product-image"
108 videoCss="discontinued-section-video"
109 />
110 <#else>
111 <@imageZoom
112 id=variant.id
113 variantCss="variant-gallery"
114 cssClasses="zoom-gallery-slide active"
115 images=vImages
116 carouselCss="discontinued-carousel owl-carousel owl-theme image-carousel-container"
117 zoomCss="MagicZoom discontinued-page-product-image"
118 videoCss="discontinued-section-video"
119 />
120 </#if>
121 </#if>
122 </#list>
123 <#list variants.iterator() as variant>
124 <#if !variant.properties.isNull("colorCode")>
125 <#if variant?index == 0>
126 <div class="text-bold"><@liferay.language key="color-options"/></div>
127 </#if>
128 <#assign color = "${variant.properties.colorCode}">
129 <#if !variant.properties.isNull("sku")>
130 <#assign sku = variant.properties.sku>
131 <#else>
132 <#assign sku = "">
133 </#if>
134 <#if variant?index = 0>
135 <@variantChange id=variant.id checked="checked" color=color sku=sku/>
136 <#else>
137 <@variantChange id=variant.id color=color sku=sku/>
138 </#if>
139 </#if>
140 </#list>
141 </div>
142 </#if>
143 </div>
144 <@sectionFooter/>
145
146<#-- Popup -->
147<div id="theme-popup9" class="popup product-page-media">
148 <div class="close-button-container">
149 <span class="close" onClick="closePopup(9)"></span>
150 </div>
151 <div class="panel popup-content" id="popupContentAwards">
152 <div class="panel-body">
153
154 <h3 class="section-heading text-bolder">
155 ${productTitle}<br>
156 Awards
157 </h3>
158
159 <#if awards?has_content>
160 <div class="row">
161 <#list awards.iterator() as award>
162 <div class="col-12 col-md-6 col-xl-3 award-card">
163 <#if !award.assets.isNull("image")>
164 <#assign awardImage = award.assets.image.url >
165 <div class="aspect-ratio aspect-ratio-4-to-3">
166 <@imageThumbnail data="${awardImage}" id="" cssClasses="aspect-ratio-item-fluid aspect-ratio-item-center-middle lazy" thumbnail="awardImgPopup" alt="${localizeField(award.properties.title, profile.getCMSLangCode())}"/>
167 </div>
168 <#else>
169 <div class="aspect-ratio aspect-ratio-4-to-3">
170 </div>
171 </#if>
172 <p>
173 <span class="text-medium text-bolder">${localizeField(award.properties.title, profile.getCMSLangCode())}</span><br>
174 </p>
175 <p>
176 <span class="small">
177 <#if !award.properties.isNull("content")>
178 <#assign awardContent = cmsContentFormatterService.getMarkdown(localizeField(award.properties.content, profile.getCMSLangCode()))>
179 ${awardContent}
180 </#if>
181 </span>
182 </p>
183 </div>
184 </#list>
185 </div>
186 </#if>
187 </div>
188 </div>
189</div>
190
191<style>
192
193 .product-page-product-title {
194 font-weight: 600;
195 margin-bottom: 0;
196 }
197
198 .product-page-form {
199 margin-bottom: 15px;
200 }
201
202 .btn-product-page-buy {
203 width: 40%;
204 min-width: 250px;
205 }
206
207 .btn-bold {
208 border-width: 2px;
209 text-transform: uppercase;
210 font-weight: 800;
211 }
212
213 .buy-product-dropdown {
214 margin-left: -4px;
215 border-left: none;
216 padding: 0;
217 width: 11%;
218 height: 43px
219 }
220
221 .buy-product-dropdown h3 {
222 display: inline;
223 vertical-align: middle;
224 }
225
226 .buy-product-dropdown svg {
227 width: 20px;
228 line-height: .2;
229 vertical-align: middle;
230 }
231
232
233 .product-page-form input {
234 position: absolute;
235 opacity: 0;
236 cursor: pointer;
237 }
238
239 .container-first-section {
240 padding-bottom: 0px;
241 }
242
243 .container-last-section {
244 padding-top: 0px;
245 }
246
247
248i.award-icon {
249 color: #CCC;
250}
251i.award-icon:hover {
252 cursor: pointer;
253 color: #6daa41;
254}
255.discontinued-carousel .owl-prev {
256 width: 17px;
257 height: 100px;
258 position: absolute;
259 left: -20px;
260 top: 47%;
261 transform: translateY(-50%);
262 display: block !important;
263 border:0px solid black;
264 font-size: 2em !important;
265}
266
267.discontinued-carousel .owl-next {
268 width: 17px;
269 height: 100px;
270 position: absolute;
271 right: -20px;
272 top: 47%;
273 transform: translateY(-50%);
274 display: block !important;
275 border:0px solid black;
276 font-size: 2em !important;
277}
278.award-img{
279max-width: 180px;
280}
281
282</style>
283
284<script>
285 $('.discontinued-carousel').owlCarousel({
286 loop:false,
287 nav:true,
288 dots:false,
289 margin:5,
290 lazyLoad:true,
291 navText : ['<i class="icon-angle-left">','<i class="icon-angle-right">'],
292 responsive:{
293 0:{items:3, slideBy:3},
294 600:{items:5, slideBy:5},
295 1000:{items:7, slideBy:7}
296 },
297});
298
299$(document).mouseup(function (e) {
300 if(!$('#popupContent'+"Awards").is(e.target) &&
301 $('#popupContent'+"Awards").has(e.target).length == 0 &&
302 $(e.target).attr('class') != 'close' &&
303 $('#theme-popup'+"9").css("display") == "block"){
304 closePopup(9);
305 }
306})
307
308</script>
309</#if>
Une erreur s'est produite lors du traitement du gabarit.
The following has evaluated to null or missing:
==> cmsEntity.getField(profile, documentPath) [in template "20116#20152#211671" at line 14, column 30]
----
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: #assign documents = cmsEntity.getFiel... [in template "20116#20152#211671" at line 14, column 9]
----
1<#-- </div></div> -->
2
3<#if cmsEntity?has_content>
4<#include "${templatesPath}/227222" />
5<#assign siteDefaultLocale = portalUtil.getSiteDefaultLocale(groupId)?string?replace("_","-") >
6<#assign reviewsPath = "/entity/relationships/reviews/"+profile.getCMSLangCode()+"/references" >
7
8<#if cmsEntity.getField(profile, "/entity/relationships/documents")?has_content || cmsEntity.getField(profile, reviewsPath)?has_content || cmsEntity.getField(profile, "/entity/relationships/faqs")?has_content>
9<#assign pageTemplate = "${getPageTemplateNameByUuid('${themeDisplay.layout.layoutPrototypeUuid}')}">
10
11<#if cmsEntity.getField(profile, "/entity/relationships/documents")?has_content>
12 <#assign documentPath = "/entity/relationships/documents/"+profile.getCMSLangCode()+"/references" >
13 <#if documentPath?has_content>
14 <#assign documents = cmsEntity.getField(profile, documentPath) >
15 </#if>
16</#if>
17<#if cmsEntity.getField(profile, reviewsPath)?has_content>
18 <#assign reviews = cmsEntity.getField(profile, reviewsPath) >
19</#if>
20
21<#if cmsEntity.getField(profile, "/entity/relationships/faqs")?has_content>
22 <#assign faqs = cmsEntity.getField(profile, "/entity/relationships/faqs") >
23 <#if groupField(cmsEntity,"/entity/relationships/faqs", groupId)?has_content>
24 <#assign faqs = groupField(cmsEntity,"/entity/relationships/faqs", groupId).references >
25 </#if>
26</#if>
27
28<@sectionHeader title="${title}" menuTitle="${menuTitle}" cssClasses="bg-blue-darker product-page-downloads" id="section-downloads"/>
29
30
31<#assign documentsDocumentTypes = ["operating manual", "guide", "other manual", "brochure", "catalogue", "datasheet", "software release note"]>
32<#assign downloadsDocumentTypes = ["line drawing","simulation file", "test signal", "software realese note", "certificate", "technical paper", "article or publication"]>
33<#assign reviewsDocumentTypes = ["review"]>
34
35<#assign reviewColContent = "" />
36<#assign downloadColContent = "" />
37<#assign documentColContent = "" />
38
39<#if documents?has_content>
40 <#list documents.iterator() as document>
41 <#assign documentType = "">
42 <#if !document.properties.isNull("documentTypeKey")>
43 <#assign documentType = localizeField(document.properties.documentTypeKey)?lower_case>
44 <#elseif !document.properties.isNull("documentType")>
45 <#assign documentType = localizeField(document.properties.documentType)?lower_case>
46 </#if>
47 <#if !document.assets.isNull("file") && !document.assets.file.isNull("mediaType")>
48 <#assign mediaType = document.assets.file.mediaType?replace(".","/")>
49 </#if>
50
51 <#if downloadsDocumentTypes?seq_contains(documentType)>
52 <#assign downloadColContent>
53 ${downloadColContent}
54 <#if !document.assets.isNull("file")>
55 <a href="${document.assets['file'].url}" target="_blank" rel="noopener noreferrer" class="type-${documentType?replace(" ", "-")}">
56 <#if mediaType?keep_after_last("/") = "pdf">
57 <span class="text-bolder">${localizeField(document.properties.title, profile.getCMSLangCode())}<span style="white-space: nowrap"> <@linkIcon cssClasses="icon tiny-icon" alt="pdf" icon="pdf-green"/></span></span>
58 <#else>
59 <span class="text-bolder">${localizeField(document.properties.title, profile.getCMSLangCode())}<span style="white-space: nowrap"> <@linkIcon cssClasses="icon tiny-icon" alt="" icon="download-green"/></span></span>
60 </#if>
61 </a>
62 </#if>
63 </#assign>
64 <#elseif documentsDocumentTypes?seq_contains(documentType)>
65 <#assign documentColContent>
66 ${documentColContent}
67 <#if !document.assets.isNull("file")>
68 <a href="${document.assets['file'].url}" target="_blank" rel="noopener noreferrer" class="type-${documentType?replace(" ", "-")}">
69 <span class="text-bolder">${localizeField(document.properties.title, profile.getCMSLangCode())}<span style="white-space: nowrap"> <@linkIcon cssClasses="icon tiny-icon" alt="pdf" icon="pdf-green"/></span></span>
70 </a>
71 </#if>
72 </#assign>
73 </#if>
74 </#list>
75</#if>
76
77<#if reviews?has_content>
78 <#list reviews.iterator() as review>
79 <#assign id = review.id>
80 <#assign reviewColContent>
81 ${reviewColContent}
82 <#if !review.properties.isNull("url")>
83 <a href="${review.properties.url}" target="_blank" rel="noopener noreferrer" class="type-review">
84 <span class="text-bolder">${review.properties.heading}<span style="white-space: nowrap"> <@linkIcon cssClasses="icon tiny-icon" alt="" icon="external-green"/></span></span>
85 </a>
86 <#else>
87 <a href="#/" onClick="openDocumentReviewPopup('${id}')" class="type-review">
88 <span class="text-bolder">
89 ${review.properties.heading}
90 </span>
91 </a>
92 </#if>
93 </#assign>
94 </#list>
95</#if>
96
97<div class="row bg-white table-row-padding">
98
99 <div class="col-md-4">
100 <#if documentColContent?has_content>
101 <h3><@liferay.language key="documents"/></h3>
102 ${documentColContent}
103 </#if>
104
105 </div>
106
107 <div class="col-md-4">
108 <#if downloadColContent?has_content>
109 <h3><@liferay.language key="downloads"/></h3>
110 ${downloadColContent}
111 </#if>
112 </div>
113
114
115 <div class="col-md-4">
116 <#if reviewColContent?has_content>
117 <h3><@liferay.language key="reviews"/></h3>
118 ${reviewColContent}
119 </#if>
120 </div>
121
122 <#if faqs?has_content && !faqs.keys??>
123 <#assign showFAQCount = 3 >
124
125 <div id="faqs" class="row bg-white table-row-padding">
126 <div class="col-md-7">
127 <h3><@liferay.language key="faq"/></h3>
128 <#list faqs.iterator() as faq>
129 <#assign id = faq.id>
130
131 <div class="faq_element <#if faq?index gte showFAQCount>hidden</#if>" >
132 <div class="faq_element_question col-lg-12" onclick="faqShowAnswer('${id}');">
133
134 <i class="icon-plus-sign" id="faq-plus-${id}"></i>
135 <i class="icon-minus-sign" id="faq-minus-${id}" style="display: none;"></i>
136
137 <a href="#faq_element_answer" class="ml-4" >
138 <#assign question = faq.properties.question>
139 <h4 class="text-bolder">${question}</h4>
140 </a>
141 </div>
142 <div class="faq_element_answer ml-4" id="faq-element-answer-${id}">
143 <#assign answer = cmsContentFormatterService.getMarkdown(faq.properties.answer)>
144 ${answer?replace('h1>|h2>', 'h5>', 'r')?replace('h3>', 'h6>')}
145 </div>
146 </div>
147 </#list>
148
149 <#if faqs.length() gt showFAQCount>
150 <a href="#" onclick="$('#faqs .hidden').removeClass('hidden'); $(this).hide();return false;"><@liferay.language key="show-more"/></a>
151 </#if>
152 </div>
153 </div>
154 </#if>
155</div>
156<@sectionFooter/>
157
158
159<#-- Popup -->
160<#if reviews?has_content>
161 <div id="theme-popupDocumentReview" class="popup">
162 <#list reviews.iterator() as review>
163 <#assign id = review.id>
164
165 <#if review?index == 0>
166 <div class="close-button-container">
167 <button class="close" onClick="closeDocumentReviewPopup('${id}')" id="closeButtonDocumentReview-${id}"></button>
168 </div>
169
170 <div class="panel popup-content" id="popupContentDocumentReview">
171 <div class="panel-body">
172 </#if>
173
174 <div class="documentReviewContent" id="documentReviewContent-${id}">
175 <div class="h1 section-heading text-bolder">${review.properties.heading}</div>
176 <#if !review.properties.isNull("summary")>
177 <#assign summary = cmsContentFormatterService.getMarkdown(review.properties.summary)>
178 ${summary}
179 </#if>
180
181 <#if !review.properties.isNull("content")>
182 <#assign content = cmsContentFormatterService.getMarkdown(localizeField(review.properties.content, profile.getCMSLangCode()))>
183 ${content}
184 </#if>
185 </div>
186
187 <#if review?index == (review?size - 1)>
188 </div>
189 </div>
190 </#if>
191
192 </#list>
193 </div>
194</#if>
195
196</#if>
197
198<script>
199function faqShowAnswer(id){
200
201 var wasHidden = $("#faq-element-answer-"+id).is(":hidden");
202
203 // Close all
204 $("#faqs .faq_element_answer").hide();
205 $("#faqs .icon-plus-sign").show();
206 $("#faqs .icon-minus-sign").hide();
207
208 if (wasHidden) {
209 var answer = $("#faq-element-answer-"+id);
210 $("#faq-plus-"+id).hide();
211 $("#faq-minus-"+id).show();
212 answer.show();
213 console.log(answer.parent().find(".faq_element_question"));
214 if(!inViewport(answer.parent().find(".faq_element_question").first())) {
215
216 var scrollFix = 10; // some margin
217 var questionPos = answer.parent().find(".faq_element_question").first().offset().top;
218
219 // ControlBar
220 if ($("#ControlMenu").is(":visible")) {
221 scrollFix += $("#ControlMenu").height();
222 }
223
224 // subnavi
225 if ($("#submenu-links").is(":visible")) {
226 scrollFix += $("#submenu-links").height();
227 }
228 console.log("Scrollfix " + scrollFix)
229
230 var scrollTo = questionPos - scrollFix;
231
232 $('html, body').animate({
233 scrollTop: (scrollTo-1)
234 },500, function(){
235 setTimeout(function() {
236 $('html, body').scrollTop(scrollTo);
237 }, 200);
238 });
239 }
240
241 }
242};
243
244function inViewport(el) {
245 var elementTop = el.offset().top;
246 var elementBottom = elementTop + el.outerHeight();
247
248 var viewportTop = $(window).scrollTop();
249 var viewportBottom = viewportTop + $(window).height();
250
251 return elementBottom > viewportTop && elementTop < viewportBottom;
252}
253
254function openDocumentReviewPopup(reviewId) {
255 openPopup("DocumentReview");
256 $('#documentReviewContent-'+reviewId).show();
257
258 //update:
259 $('#theme-popupDocumentReview .close').attr('id','closeButtonDocumentReview-'+reviewId);
260 $('#theme-popupDocumentReview .close').attr('onclick', 'closeDocumentReviewPopup("' + reviewId + '")');
261 $('#closeButtonDocumentReview-'+reviewId).show();
262}
263
264function closeDocumentReviewPopup(reviewId) {
265 closePopup("DocumentReview");
266 $('#documentReviewContent-'+reviewId).hide();
267
268 //update:
269 $('#closeButtonDocumentReview-'+reviewId).hide();
270}
271function closeDownloadsPopup(e) {
272 if(!$('#popupContent'+"DocumentReview").is(e.target) &&
273 $('#popupContent'+"DocumentReview").has(e.target).length == 0 &&
274 $(e.target).attr('class') != 'close' &&
275 $('#theme-popup'+"DocumentReview").css("display") == "block"){
276 closePopup("DocumentReview");
277 $('div[id^=documentReviewContent-]').hide();
278
279 }
280};
281
282$(document).on({
283 "mouseup": function (e) { closeDownloadsPopup(e); },
284 "touchstart": function (e) { closeDownloadsPopup(e); }
285});
286
287
288</script>
289
290</#if>