Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing: ==> locationAddress [in template "20116#20152#LOCATION-ELEMENT-DETAIL" at line 395, column 6] ---- 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: #if locationAddress.street?? && locat... [in template "20116#20152#LOCATION-ELEMENT-DETAIL" at line 395, column 1] ----
1<#-- variables -->
2<#assign categoryProductListID = 46179333>
3<#assign sNavigate = "Navigieren">
4<#assign sOurProfile = "Unser Unternehmensprofil auf Google">
5<#assign sGetQuote = "Angebot anfordern">
6<#assign sOpeningH = "Öffnungszeiten">
7<#assign sContactDetails = "Kontaktdaten">
8<#assign sProductListing = "Verfügbare Produkte für diesen Standort">
9<#assign sLocalContacts = "Ansprechpartner vor Ort">
10<#assign sPriceList = "Preisliste">
11<#assign sSpecialProducts = "Unser Angebot an Spezialprodukten">
12<#assign sZipShort = "PLZ">
13<#assign sGoogleCustomerReviews = "Google Bewertungen">
14<#assign googleServerApiKey = "">
15<#-- /variables -->
16
17
18<link href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.css" rel="stylesheet">
19<link href="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.theme.min.css" rel="stylesheet">
20<script src="https://cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.min.js"></script>
21
22<style>
23 .signed-out .h2 {
24 display: none !important;
25 }
26
27 .ld-location-detail {
28 font-family: roboto-regular,sans-serif;
29 }
30
31 .ld-topline {
32 border-top: 1px solid lightgray;
33 }
34
35 .ld-topbox-heading-h1 {
36 font-size: 40px;
37 margin-right: 2em;
38 color: #023185;
39 }
40
41 .ld-topbox-heading {
42 display: flex;
43 flex-direction: row;
44 align-items: baseline;
45 flex-wrap: wrap;
46 }
47
48 .ld-topbox-heading-stars {
49 font-size: 18px;
50 }
51
52
53 .ld-topbox-heading-stars a {
54 font-size: 16px;
55 }
56
57 p.ld-topbox-address-address {
58 font-size: 26px;
59 font-weight: 500;
60 }
61
62 .ld-topbox-links {
63 display: flex;
64 flex-direction: row;
65 justify-content: space-between;
66 }
67
68 .ld-contactbox-quote a.btn {
69 border-radius: 0;
70 padding: 10px 35px;
71 text-transform: uppercase;
72 font-size: 11px;
73 font-weight: 900;
74 letter-spacing: 2px;
75 color: #FFF;
76 background-color: #356090;
77 }
78
79
80 .ld-contactbox-products-list {
81 display: flex;
82 flex-direction: row;
83 flex-wrap: wrap;
84 }
85
86 .ld-contactbox-products-list p {
87 width: 48%;
88 margin-right: 2%;
89 }
90
91 .ld-topbox-address {
92 padding-top: 20px;
93 }
94
95 .ld-box div.ld-contactbox,
96 .ld-box div.ld-peoplebox,
97 .ld-box div.ld-docubox {
98 padding: 20px 0px 40px 0;
99 }
100
101 .ld-box .ld-contactbox {
102 padding-right: 20px;
103 }
104
105 .ld-contactbox-contacts a {
106 font-weight: 500;
107 }
108
109 .ld-box .ld-aboutbox {
110 padding: 20px 20px 20px 0px;
111 }
112
113 .ld-box div.ld-rangebox {
114 padding-top: 40px;
115 }
116
117 .ld-box p {
118 padding: 0;
119 font-size: 16px;
120 }
121
122 .ld-box .ld-peoplebox-list-contact-name {
123 font-weight: 500;
124 }
125
126 .ld-backimage {
127 background-color: #cccccc;
128 background-position: center;
129 background-repeat: no-repeat;
130 background-size: cover;
131 border: 0;
132 }
133
134 .ld-box .ld-topbox-address-address {
135 padding-bottom: 20px;
136 }
137
138 .ld-box h4,
139 .ld-box h3 {
140 font-size: 18px;
141 font-weight: 500;
142 padding-bottom: 0.75em;
143 color: black;
144 }
145
146 .ld-box h3 {
147 font-size: 26px;
148 }
149
150 .ld-contactbox-contacts,
151 .ld-contactbox-hours,
152 .ld-contactbox-products {
153 padding-bottom: 20px;
154 }
155
156 .ld-peoplebox-list-contact {
157 display: flex;
158 margin-right: 50px;
159 margin-bottom: 20px;
160 flex-direction: column;
161 }
162
163 .ld-peoplebox-list {
164 display: flex;
165 flex-direction: row;
166 justify-content: flex-start;
167 flex-wrap: wrap;
168 }
169
170 .ld-rangebox-list {
171 display: flex;
172 flex-direction: row;
173 overflow: hidden;
174 }
175
176 .ld-rangebox-list-card {
177 display: flex;
178 flex-direction: column;
179 }
180
181 .ld-gallerybox {
182 overflow: hidden;
183 }
184
185 .ld-gallerybox-imageholder {
186 width: 100%;
187 max-height: 420px;
188 height: calc(50vw / 1.5);
189 }
190
191 @media only screen and (max-width: 1023px) {
192 .ld-gallerybox-imageholder {
193 height: calc(70vw);
194 }
195 }
196
197 .ld-rangebox-list-card {
198 border: solid 1px lightgray;
199 border-left: 0;
200 color: black;
201 <#-- margin-right: -1px;
202 margin-bottom: -1px; -->
203 flex-grow: 1;
204 }
205
206 .ld-rangebox-list-card-image {
207 width: 100%;
208 height: calc(25vw / 2.3);
209 min-height: 150px;
210 display: flex;
211 align-items: center;
212 justify-content: center;
213 padding: 20px;
214 }
215
216 .ld-rangebox-list-card-text {
217 padding: 18px 40px;
218 }
219
220 h4.ld-rangebox-list-card-text-h {
221 font-size: 26px;
222 }
223
224 .ld-docubox-list {
225 display: flex;
226 align-items: center;
227 flex-direction: row;
228 flex-wrap: wrap;
229 }
230
231 a.ld-docubox-list-doc {
232 margin-right: 80px;
233 font-size: 12px;
234 text-decoration: underline;
235 }
236
237 img.inline-align-self-middle {
238 max-height: 35px;
239 margin-right: 5px;
240 margin-top: 5px;
241 }
242
243 .ld-docubox-list-file {
244 display: flex;
245 align-items: center;
246 margin-bottom: 0.5em;
247 }
248
249 .ld-box .fa-file-pdf {
250 color: red;
251 }
252
253 .ld-box .fa-file-word {
254 color: darkblue;
255 }
256
257 .ld-box .fa-file-excel {
258 color: darkgreen;
259 }
260
261 /* carousels */
262
263 #carousel-products .owl-item:first-child a.ld-rangebox-list-card
264 {
265 border: solid 1px lightgray;
266 }
267
268
269 .owl-carousel .owl-wrapper,
270 .owl-carousel .owl-item,
271 #carousel-products .owl-wrapper {
272 display: flex!important;
273 }
274
275 #carousel-gallery .owl-wrapper-outer,
276 #carousel-gallery .owl-wrapper,
277 #carousel-gallery .owl-item {
278 height: 100%;
279 }
280
281 #carousel-gallery.owl-theme .owl-controls {
282 margin-top: -30px;
283 }
284
285 #carousel-gallery.owl-theme #progressBar {
286 height: 6px;
287 background-color: #3FA9F5;
288 position: relative;
289 }
290
291 #carousel-gallery.owl-theme #progressBar #bar {
292 height: 6px;
293 background-color: #003875;
294 }
295
296 #carousel-gallery.owl-theme .owl-controls .owl-page span {
297 background: #fff;
298 width: 12px;
299 height: 12px;
300 opacity: 0.99 !important;
301 transition: all 0.4s ease;
302 }
303
304 #carousel-gallery.owl-theme .owl-controls .owl-page.active span,
305 #carousel-gallery.owl-theme .owl-controls.clickable .owl-page:hover span {
306 background: #3FA9F5;
307 }
308
309 #carousel-gallery.owl-theme .owl-controls .owl-page:not(.active) span:hover {
310 transition: none;
311 box-shadow: 0 0 3px 1px rgba(0, 0, 0, 0.7);
312 }
313
314 #carousel-gallery.owl-theme .image-overlay {
315 position: absolute;
316 width: 100%;
317 height: 100%;
318 background: linear-gradient(to top, rgba(0, 0, 0, 0.0), rgba(0, 0, 0, 0.41) 60%, rgba(0, 0, 0, 0.7));
319 }
320
321 /* carousel nav */
322
323 #carousel-products .owl-wrapper {
324 z-index: 100;
325 }
326
327 #carousel-products .owl-controls.clickable {
328 position: absolute;
329 top: 0;
330 height: 100%;
331 width: 100%;
332 flex-direction: row;
333 margin-top: 0;
334 }
335
336 #carousel-products .owl-buttons {
337 height: 100%;
338 display: flex;
339 flex-direction: row;
340 justify-content: space-between;
341 align-items: center;
342 }
343
344 #carousel-products .owl-buttons .owl-prev,
345 #carousel-products .owl-buttons .owl-next {
346 border-radius: 0;
347 text-align: center;
348 display: flex;
349 align-items: center;
350 z-index: 200;
351 color: #5A5D66;
352 font-size: 36px;
353 margin: 0;
354 background: 0;
355 padding: 10px 5px;
356 }
357
358 .ld-rangebox-list-card-logo {
359 width: 200px;
360 }
361
362</style>
363
364<link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" rel="stylesheet" />
365
366
367<#-- get Google Api Key from site settings -->
368<#assign group = themeDisplay.getScopeGroup()>
369<#assign gApiKey = group.getTypeSettingsProperty("googleMapsAPIKey")!"key_is_missing">
370
371
372<#assign dateFormat = "d. MMMM yyyy" />
373<#setting locale=locale.toString()>
374<#-- the langPrefix is used to recieve a google API request in specigfic language - in troubles set it manualy -->
375<#assign langPrefix = locale?keep_before("_")>
376
377<#assign dLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") />
378<#assign httpUtil = staticUtil["com.liferay.portal.kernel.util.HttpUtil"] />
379
380
381<#assign journalArticleId = .vars['reserved-article-id'].data>
382<#assign journalArticleResourceLocalServiceUtil = serviceLocator.findService('com.liferay.journal.service.JournalArticleResourceLocalService')>
383<#assign assetCategoryLocalServiceUtil = serviceLocator.findService('com.liferay.asset.kernel.service.AssetCategoryService')>
384
385<#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/>
386<#assign categoryList=assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK) >
387
388<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
389<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
390<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
391
392<#-- build address line -->
393<#assign address = []>
394<#assign addressLine = "">
395<#if locationAddress.street?? && locationAddress.street.getData() !="">
396 <#assign address = address + [locationAddress.street.getData()]>
397</#if>
398<#if locationAddress.city?? && locationAddress.city.getData() !="">
399 <#assign address = address + [locationAddress.city.getData()]>
400</#if>
401<#if locationAddress.region?? && locationAddress.region.getData() !="">
402 <#assign address = address + [locationAddress.region.getData()]>
403</#if>
404<#if locationAddress.postcode?? && locationAddress.postcode.getData() !="">
405 <#assign address = address + ["${sZipShort} " + locationAddress.postcode.getData()]>
406</#if>
407<#if locationAddress.area?? && locationAddress.area.getData() !="">
408 <#assign address = address + [locationAddress.area.getData()]>
409</#if>
410<#if locationAddress.country?? && locationAddress.country.getData() !="">
411 <#assign address = address + [locationAddress.country.getData()]>
412</#if>
413<#list address as part_address>
414 <#assign addressLine = addressLine + part_address>
415 <#if part_address?has_next>
416 <#assign addressLine = addressLine + ", ">
417 </#if>
418</#list>
419
420<#-- set GEO -->
421<#if geoLoc_customgeolocation.getData() != "">
422 <#assign geolocationJSONObject = jsonFactoryUtil.createJSONObject(geoLoc_customgeolocation.getData())>
423 <#assign latitude = geolocationJSONObject.getDouble("latitude")>
424 <#assign longitude = geolocationJSONObject.getDouble("longitude")>
425 <#assign geo = true>
426<#else>
427 <#assign geo = false>
428</#if>
429
430<#-- analyze google place -->
431<#assign gLocationRate = 0>
432<#assign gLocationUser_rates = 0>
433<#assign gLocationStars = 0>
434<#assign gLocationUrl = "#">
435
436<#if googleServerApiKey?has_content && GoogleLocationID?? && GoogleLocationID.getData() != "">
437 <#assign googleApiKey = gApiKey/>
438 <#assign httpUtil = staticUtil["com.liferay.portal.kernel.util.HttpUtil"] />
439 <#assign response = httpUtil.URLtoString("") >
440 <#assign resp = response?eval>
441 <#if resp.result??>
442 <#if resp.result.rating??>
443 <#assign gLocationRate = resp.result.rating>
444 <#assign gLocationUser_rates = resp.result.user_ratings_total>
445 <#assign gLocationStars = countStars(gLocationRate)>
446 <#assign gLocationUrl = resp.result.url>
447 </#if>
448 <#if resp.result.opening_hours??>
449 <#assign gLocationWeekdays = resp.result.opening_hours.weekday_text>
450 </#if>
451 <#-- if bad respond -->
452 <#elseif resp.status?? && resp.error_message??>
453 <p>Google palace API: ${resp.status}<BR>
454 Message: ${resp.error_message}</p>
455 <#elseif resp.status??>
456 <p>Google palace API: ${resp.status}</p>
457 </#if>
458</#if>
459
460
461<article class="ld-location-detail">
462 <div class="row" style="margin-top:40px">
463 <div class="ld-wrapper col-xs-12">
464
465 <div class="">
466 <div class="container">
467 <div class="row ld-box">
468 <div class="col-xs-12 ld-topbox">
469 <div class="ld-topbox-heading">
470 <h1 class="ld-topbox-heading-h1">${locationName.getData()}</h1>
471 <#if gLocationRate gte 3>
472 <span class="ld-topbox-heading-stars">${gLocationRate} ${gLocationStars} | <a href="${gLocationUrl}" target="_blank">${gLocationUser_rates} ${sGoogleCustomerReviews}</a></span>
473 </#if>
474 </div>
475 <div class="ld-topbox-address">
476 <p class="ld-topbox-address-address">${addressLine}</p>
477 </div>
478 <div class="ld-topbox-links">
479 ${geo?then('<a target="_blank" href="https://google.com/maps/dir//${latitude},${longitude}">${sNavigate}</a>', '')}
480 <#if gLocationUrl != "#">
481 <a href="${gLocationUrl}" target="_blank">${sOurProfile}</a>
482 </#if>
483 </div>
484 </div>
485 </div>
486 </div>
487 </div>
488
489 <div class="ld-topline">
490 <div class="container">
491 <div class="row ld-box">
492 <div class="col-md-6 ld-contactbox">
493 <div class="ld-contactbox-contacts">
494 <h4>${sContactDetails}</h4>
495 <!-- Cemex DE specific -->
496 <#if contactPerson?? && contactPerson.getData() != ""><p>Ansprechpartner: ${contactPerson.getData()}</p></#if>
497 <#if telephoneNumber?? && telephoneNumber.getData() != ""><p>Telefon: ${telephoneNumber.getData()}</p></#if>
498 <#if workTelephoneNumber?? && workTelephoneNumber.getData() != ""><p>Telefon: ${workTelephoneNumber.getData()}</p></#if>
499 <#if firma?? && firma.getData() != ""><p>Firma: ${firma.getData()}</p></#if>
500 <#if fax?? && fax.getData() != ""><p>Fax: ${fax.getData()}</p></#if>
501 <div></div>
502 <!-- Cemex DE specific -->
503 <#assign basic_contact_has_data = false />
504 <#if BasicContact?? && BasicContact.getSiblings()?has_content>
505 <#list BasicContact.getSiblings() as cur_BasicContact>
506 <#if cur_BasicContact.getData() !="">
507 <#if cur_BasicContact.EmailContact?? && cur_BasicContact.EmailContact.getData() !="">
508 <#assign basic_contact_has_data = true />
509 </#if>
510 <#if cur_BasicContact.PhoneContact?? && cur_BasicContact.PhoneContact.getData() !="">
511 <#assign basic_contact_has_data = true />
512 </#if>
513 </#if>
514 </#list>
515 </#if>
516 <#if basic_contact_has_data>
517 <#list BasicContact.getSiblings() as cur_BasicContact>
518 <p>${cur_BasicContact.getData()}:
519 <#if cur_BasicContact.PhoneContact.getData() !="">
520 <a href="tel:${cur_BasicContact.PhoneContact.getData()}">${cur_BasicContact.PhoneContact.getData()}</a>
521 <#else>
522 <#if cur_BasicContact.EmailContact.getData() !="">
523 <a href="mailto:${cur_BasicContact.EmailContact.getData()}">${cur_BasicContact.EmailContact.getData()}</a>
524 </#if>
525 </#if>
526 </p>
527 </#list>
528 </#if>
529 </div>
530 <#if gLocationWeekdays?? || (openingHours?? && openingHours.getData() != "")>
531 <div class="ld-contactbox-hours">
532 <h4>${sOpeningH}</h4>
533 <#if gLocationWeekdays?? && openingHours.getData() = "">
534 <p>
535 <#list gLocationWeekdays as cur_gLocationWeekdays>
536 ${cur_gLocationWeekdays}<br>
537 </#list>
538 </p>
539 <#else>
540 <p>${openingHours.getData()}</p>
541 </#if>
542 </div>
543 </#if>
544 <div class="ld-contactbox-products">
545 <h4>${sProductListing}</h4>
546 <div class="ld-contactbox-products-list">
547 <#if categoryList?has_content>
548 <#list categoryList as category>
549 <#if category.vocabularyId = categoryProductListID>
550 <p>${category.getName()}
551 <#--if categoryList.getDescription() !="">
552 – ${categoryList.getDescription()}
553 </#if-->
554 </p>
555 </#if>
556 </#list>
557 </#if>
558 </div>
559 </div>
560
561
562 <!-- Cemex DE specific -->
563 <#assign quotePageLinkFriendlyUrl = getWebURL("/angebot-anfordern")>
564 <#if QuotePageLink?? && QuotePageLink.getFriendlyUrl() !="">
565 <#assign quotePageLinkFriendlyUrl = QuotePageLink.getFriendlyUrl()>
566 </#if>
567 <div class="cta-secondary" data-component="cta-secondary">
568 <a data-senna-off="true" href="${quotePageLinkFriendlyUrl}" class="cta-secondary-link" target="_blank" rel="noopener noreferrer" title="${sGetQuote}">
569 <span class="button-copy">${sGetQuote}</span>
570 </a>
571 </div>
572 <!-- Cemex DE specific -->
573
574 </div>
575 <div class="col-md-6 ld-mapbox">
576 <#if geo>
577 <@liferay_map["map-display"]
578 geolocation=true
579 latitude=latitude
580 longitude=longitude
581 name="geoLoc_customgeolocation"
582 />
583 </#if>
584 </div>
585 </div>
586 </div>
587 </div>
588
589 <#if SummaryLabel?? && SummaryLabel.getData() !="">
590 <div class="ld-topline">
591 <div class="container">
592 <div class="row ld-box">
593 <div class="col-md-6 ld-aboutbox">
594 <div class="ld-aboutbox-about">
595 <h3>${SummaryLabel.getData()}</h3>
596 <p>${SummaryLabel.SummaryText.getData()}</p>
597 </div>
598 </div>
599 <div class="col-md-6 ld-gallerybox">
600
601 <div id="carousel-gallery" class="owl-carousel owl-theme">
602 <#if LocationImage.getSiblings()?has_content>
603 <#list LocationImage.getSiblings() as cur_LocationImage>
604 <#if cur_LocationImage.getData()?? && cur_LocationImage.getData() != "">
605 <div class="ld-gallerybox-imageholder ld-backimage" style="background-image: url('${cur_LocationImage.getData()}');">
606 </div>
607 </#if>
608 </#list>
609 </#if>
610 </div>
611 </div>
612 </div>
613 </div>
614 </div>
615 </#if>
616
617
618 <#assign local_contact_has_data = false />
619 <#if LocalContact?? && LocalContact.getSiblings()?has_content>
620 <#list LocalContact.getSiblings() as cur_LocalContact>
621 <#if cur_LocalContact.getData() !="">
622 <#if cur_LocalContact.WorkPositionLabel.getData() !="">
623 <#assign local_contact_has_data = true />
624 </#if>
625 <#if cur_LocalContact.email.getData() !="">
626 <#assign local_contact_has_data = true />
627 </#if>
628 <#if cur_LocalContact.PhoneNumber.getData() !="">
629 <#assign local_contact_has_data = true />
630 </#if>
631 </#if>
632 </#list>
633 </#if>
634 <#if local_contact_has_data>
635 <div class="ld-topline">
636 <div class="container">
637 <div class="row ld-box">
638 <div class="col-md-12 ld-peoplebox">
639 <h3>${sLocalContacts}</h3>
640 <div class="ld-peoplebox-list">
641 <#list LocalContact.getSiblings() as cur_LocalContact>
642 <div class="ld-peoplebox-list-contact">
643 <#if cur_LocalContact.getData() !="">
644 <span class="ld-peoplebox-list-contact-name">${cur_LocalContact.getData()}</span>
645 <#if cur_LocalContact.WorkPositionLabel.getData() !="">
646 <span class="ld-peoplebox-list-contact-text">${cur_LocalContact.WorkPositionLabel.getData()}</span>
647 </#if>
648 <#if cur_LocalContact.email.getData() !="">
649 <span class="ld-peoplebox-list-contact-text">E-mail: ${cur_LocalContact.email.getData()}</span>
650 </#if>
651 <#if cur_LocalContact.PhoneNumber.getData() !="">
652 <span class="ld-peoplebox-list-contact-text">phone: ${cur_LocalContact.PhoneNumber.getData()}</span>
653 </#if>
654 </#if>
655 </div>
656 </#list>
657 </div>
658 </div>
659 </div>
660 </div>
661 </div>
662 </#if>
663
664 <#if attachment?? && attachment.getSiblings()?? && attachment.getSiblings()?has_content>
665 <div class="ld-topline">
666 <div class="container">
667 <div class="row ld-box">
668 <#list attachment.getSiblings() as cur_attachment>
669 <#if isNotEmptyElement(cur_attachment.file)>
670 <@generateAttachmentElement cur_attachment.file.getData() cur_attachment.title/>
671 </#if>
672 </#list>
673 </div>
674 </div>
675 </div>
676 </#if>
677
678 <#function isNotEmptyElement element>
679 <#return element?? && element.getData()?? && element.getData()!="">
680 </#function>
681
682 <#macro generateAttachmentElement attachmentURL title>
683 <#assign counter = 0 >
684 <#list attachmentURL?split("/") as chunkURL>
685 <#if counter == 2>
686 <#assign groupId = chunkURL?number >
687 </#if>
688 <#if counter == 5>
689 <#if chunkURL?index_of("?") != -1>
690 <#assign uuId = chunkURL?substring(0, chunkURL?index_of("?")) >
691 <#else>
692 <#assign uuId = chunkURL >
693 </#if>
694 </#if>
695 <#assign counter = counter+1 >
696 </#list>
697
698 <#assign fileEntry = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') />
699 <#assign file=fileEntry.getFileEntryByUuidAndGroupId(uuId, getterUtil.getLong(groupId)) >
700 <#assign fileName = file.getTitle()>
701 <#assign fileDescription = file.getDescription()>
702
703 <div class="col-md-2 ld-docubox">
704 <div class="ld-docubox-list-file">
705 ${fileDescription}
706 <img class="inline-align-self-middle" src="/documents/46167902/46169687/pdf-icon.png/aff2ac7d-c8ed-eaf1-19fe-28e4df36ee69?t=1523381391249" alt="${fileDescription}">
707
708 <a href="${attachmentURL}" class="ld-docubox-list-doc ico-pdf" target="_blank">
709 <#if isNotEmptyElement(title)>
710 ${title.getData()}
711 <#else>
712 ${fileName}
713 </#if>
714 </a>
715 </div>
716 </div>
717 </#macro>
718
719 <#assign pricelist_document_file_has_data = false />
720 <#if PricelistDocumentFile?? && PricelistDocumentFile.getSiblings()?has_content>
721 <#list PricelistDocumentFile.getSiblings() as cur_PricelistDocumentFile>
722 <#if cur_PricelistDocumentFile.getData() !="">
723 <#if cur_PricelistDocumentFile.FileDisplayName.getData() !="">
724 <#assign pricelist_document_file_has_data = true />
725 </#if>
726 </#if>
727 </#list>
728 </#if>
729 <#if pricelist_document_file_has_data>
730 <div class="ld-topline">
731 <div class="container">
732 <div class="row ld-box">
733 <div class="col-md-12 ld-docubox">
734 <h3>${sPriceList}</h3>
735 <div class="ld-docubox-list">
736 <#list PricelistDocumentFile.getSiblings() as cur_PricelistDocumentFile>
737 <div class="ld-docubox-list-file">
738 <i class="${cur_PricelistDocumentFile.FileTypeIcon.getData()} fa-2x inline-align-self-middle"> </i>
739 <a href="${cur_PricelistDocumentFile.getData()}" class="ld-docubox-list-doc ico-pdf" target="_blank">
740 ${cur_PricelistDocumentFile.FileDisplayName.getData()}
741 </a>
742 </div>
743 </#list>
744 </div>
745 </div>
746 </div>
747 </div>
748 </div>
749 </#if>
750 </div>
751</article>
752
753<#assign product_range_has_data = false />
754<#if ProductRange?? && ProductRange.getSiblings()?has_content>
755 <#list ProductRange.getSiblings() as cur_ProductRange>
756 <#if cur_ProductRange.getData() !="">
757 <#assign product_range_has_data = true />
758 </#if>
759 </#list>
760</#if>
761<#if product_range_has_data>
762 <div class="ld-topline">
763 <div class="container">
764 <div class="row ld-box">
765 <div class="col-md-12 ld-rangebox">
766 <h3>${sSpecialProducts}</h3>
767 <div id="carousel-products" class="ld-rangebox-list owl-carousel owl-theme">
768 <#list ProductRange.getSiblings() as cur_ProductRange>
769 <@printCard cur_ProductRange/>
770 </#list>
771 </div>
772 </div>
773 </div>
774 </div>
775 </div>
776</#if>
777
778<#-- macros & functions -->
779
780<#macro printCard card>
781
782 <#assign webContentData = jsonFactoryUtil.createJSONObject(card.getData())/>
783 <#if !webContentData.classPK??>
784 <#return>
785 </#if>
786 <#assign classPK = webContentData.classPK?number!"" />
787 <#assign journalArticle = journalArticleLocalService.getLatestArticle(classPK)!"none">
788 <#assign journalArticleId = journalArticle.getId() />
789 <#assign document=saxReaderUtil.read(journalArticle.getContent()) />
790
791 <#-- select localization in content to display -->
792 <#-- use actual language or default if is missed -->
793 <#assign availableLocale=document.getRootElement().attributeValue('available-locales') />
794 <#assign defaultLocale=document.getRootElement().attributeValue('default-locale') />
795 <#if availableLocale?contains(locale)>
796 <#assign displayLocale=locale>
797 <#else>
798 <#assign displayLocale=defaultLocale>
799 </#if>
800
801 <#assign cardHeading=document.valueOf("//dynamic-element[@name='ProductHeading']//dynamic-content[@language-id='${displayLocale}']") />
802 <#assign cardDescription=document.valueOf("//dynamic-element[@name='ProductDescription']//dynamic-content[@language-id='${displayLocale}']") />
803 <#assign cardImage=document.valueOf("//dynamic-element[@name='ProductImage']//dynamic-content[@language-id='${displayLocale}']") />
804 <#assign cardLogo=document.valueOf("//dynamic-element[@name='ProductLogo']//dynamic-content[@language-id='${displayLocale}']") />
805 <#--assign ImgMediumUrl = themeDisplay.getPortalURL() + "/o/adaptive-media/image/" + OptionalTourMainImage.fileEntryId + "/medium/" + OptionalTourMainImage.uuid /-->
806
807 <#assign cardUrl=document.valueOf("//dynamic-element[@name='LinkToPage']//dynamic-content[@language-id='${displayLocale}']") />
808 <#if cardUrl ="">
809 <#assign cardExtUrl=document.valueOf("//dynamic-element[@name='AlternateURLUseOnlyForLinksOutOfTheSite']//dynamic-content[@language-id='${displayLocale}']") />
810 </#if>
811 <#if cardUrl = "">
812 <#assign cardUrl = "#">
813 </#if>
814 <#if cardUrl != "#">
815 <#assign layoutId = cardUrl?keep_before("@")?number>
816 <#assign groupId = cardUrl?keep_after_last("@")?number>
817 <#assign pageLayout = layoutLocalService.getLayout(groupId, false, layoutId)>
818 <#assign cardUrl = pageLayout.getFriendlyURL() />
819 </#if>
820 <#-- get the right siteURL by system -->
821 <#assign siteURL = themeDisplay.getPortalURL() />
822 <#assign virtualHostname = layout.getLayoutSet().getVirtualHostname() />
823 <#if !virtualHostname?? || siteURL?index_of(virtualHostname) == -1 || virtualHostname?length == 0 >
824 <#assign siteURL = siteURL + layout.getGroup().getPathFriendlyURL(layout.isPrivateLayout(), themeDisplay)/>
825 <#assign siteURL = siteURL + layout.getGroup().getFriendlyURL()/>
826 </#if>
827 <#assign cardUrl = siteURL + cardUrl>
828
829 <a class="ld-rangebox-list-card" href="${cardUrl}">
830 <div class="ld-rangebox-list-card-image ld-backimage" style="background-image: url('${cardImage}');">
831 <#if cardLogo != "">
832 <img class="ld-rangebox-list-card-logo" src="${cardLogo}"/>
833 </#if>
834 </div>
835 <div class="ld-rangebox-list-card-text">
836 <h4 class="ld-rangebox-list-card-text-h">${cardHeading}</h4>
837 <p class="ld-rangebox-list-card-text-p">${cardDescription}</p>
838 </div>
839 </a>
840</#macro>
841
842<#function getWebURL pathURL>
843 <#-- get the right siteURL by system -->
844 <#assign siteURL = themeDisplay.getPortalURL() />
845 <#assign virtualHostname = layout.getLayoutSet().getVirtualHostname() />
846 <#if !virtualHostname?? || siteURL?index_of(virtualHostname) == -1 || virtualHostname?length == 0 >
847 <#assign siteURL = siteURL + layout.getGroup().getPathFriendlyURL(layout.isPrivateLayout(), themeDisplay)/>
848 <#assign siteURL = siteURL + layout.getGroup().getFriendlyURL()/>
849 </#if>
850 <#return siteURL + pathURL>
851</#function>
852<#-- write stars based on number -->
853<#function countStars stars>
854 <#assign return = "">
855 <#list 1..5 as x>
856 <#if (x > stars)>
857 <#assign return = return + '<i class="glyphicon glyphicon-star-empty"></i>'>
858 <#else>
859 <#assign return = return + '<i class="glyphicon glyphicon-star"></i>'>
860 </#if>
861 </#list>
862 <#return return>
863</#function>
864
865<#-- scripts -->
866
867<#-- owl carousel init gallery-->
868<script>
869 $(function() {
870 var time = 14; // time in seconds
871 var $bar, isPause, tick, percentTime;
872
873 //Init the carousel
874 var carouselGallery = {
875 slideSpeed: 900,
876 paginationSpeed: 500,
877 singleItem: true,
878 afterInit: progressBar,
879 afterMove: moved,
880 startDragging: pauseOnDragging,
881 // Responsive
882 responsive: true,
883 responsiveRefreshRate: 200,
884 responsiveBaseWidth: window
885 };
886
887 $("#carousel-gallery").owlCarousel(carouselGallery);
888 //Init progressBar
889 function progressBar(elem) {
890 // init handlers
891 //pause on mouseover
892 elem.on('mouseover', function() {
893 isPause = true;
894 });
895 elem.on('mouseout', function() {
896 isPause = false;
897 });
898 //build progress bar elements
899 buildProgressBar(elem);
900 //start counting
901 start(elem);
902 }
903
904 //create div#progressBar and div#bar then prepend
905 function buildProgressBar(elem) {
906 var $progressBar = $("<div>", {
907 id: "progressBar"
908 });
909 $bar = $("<div>", {
910 id: "bar"
911 });
912 $progressBar.append($bar).prependTo(elem);
913 }
914
915 function start(elem) {
916 //reset timer
917 percentTime = 0;
918 isPause = false;
919 //run interval every 0.01 second
920 tick = setInterval(function (){interval(elem)}, 10);
921 };
922
923 function interval(elem) {
924 if (isPause === false) {
925 percentTime += 1 / time;
926 $bar.css({
927 width: percentTime + "%"
928 });
929 //if percentTime is equal or greater than 100
930 if (percentTime >= 100) {
931 //slide to next item
932 elem.trigger('owl.next')
933 }
934 }
935 }
936
937 //pause while dragging
938 function pauseOnDragging() {
939 isPause = true;
940 }
941
942 //moved callback
943 function moved(elem) {
944 //clear interval
945 clearTimeout(tick);
946 //start again
947 start(elem);
948 }
949
950 });
951</script>
952
953
954
955<#-- owl carousel init products stripe-->
956<script>
957 $(function() {
958
959 //Init the carousel
960 var carouselProducts = {
961 slideSpeed: 900,
962 paginationSpeed: 500,
963 singleItem: false,
964 pagination: false,
965 navigation: true,
966 items: 4,
967 navigationText:["<i class='fas fa-chevron-left'></i>","<i class='fas fa-chevron-right'></i>"],
968 // Responsive
969 responsive: true,
970 responsiveRefreshRate: 200,
971 responsiveBaseWidth: window,
972 itemsDesktop: [1199, 3],
973 itemsDesktopSmall: [1020, 2],
974 itemsTablet: [1020, 2],
975 itemsMobile: [670, 1],
976 };
977
978 $("#carousel-products").owlCarousel(carouselProducts);
979
980 });
981</script>