Při zpracování šablony došlo k chybě.
The following has evaluated to null or missing: ==> webContentData.classPK [in template "20116#20152#54247682" at line 589, column 23] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- 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: #local classPK = webContentData.class... [in template "20116#20152#54247682" in macro "printProductRange" at line 589, column 5] - Reached through: @printProductRange cur_Product [in template "20116#20152#54247682" at line 311, column 17] ----
1<#assign sUsedProduct = "Využitý produkt">
2<#assign sUsedProducts = "Využití produktů">
3<#assign sBasicInfoAbout = "Základní informace o stavbě">
4<#assign sGallery = "Galerie">
5<#assign thumbnailWidth = 200>
6<#assign thumbnailHeight = (thumbnailWidth / 4 * 3)?round >
7
8<style>
9 .b-hero-placeholder {
10 background-image: url(${MainImageURL.getData()});
11 }
12 /* END of the style for image holder on top */
13
14 .refdetail-h2 {
15 font-weight: normal;
16 padding-bottom: 1em;
17 }
18
19 .refdetail {
20 padding-top: 40px;
21 }
22
23 .refdetail-section {
24 padding-bottom: 40px
25 }
26
27 .refdetail-h1 {
28 padding-bottom: 1em;
29 }
30
31 .refdetail-table {
32 max-width: 100%;
33 }
34
35 table.refdetail-table td {
36 width: 50%;
37 border: 0;
38 }
39
40 .refproduct-item {
41 display: flex;
42 flex-direction: row;
43 margin-bottom: 1em;
44 /* margin-bottom: 0; */
45 border: 1px solid lightgray;
46 /* border: none; */
47 /* padding: 0.5em 1.5em; */
48 padding: 1.2em 1.5em;
49 align-items: center;
50 min-height: calc(60px + 1em);
51 }
52
53 .refproduct-item .refdetail-h3 {
54 flex-grow: 4;
55 padding-left: 1em;
56 }
57
58 a.refproduct-btn {
59 display: inline-block;
60 border: 1px solid #000;
61 color: #000;
62 padding: 15px 36px;
63 line-height: 1px;
64 font-size:10px;
65 font-weight: 900;
66 letter-spacing: 2px;
67 text-transform: uppercase;
68 }
69
70 .refproduct-img {
71 width: 300px;
72 height: 40px;
73 display: flex;
74 align-items: center;
75 }
76
77 .refproduct-img img {
78 max-height: 100%;
79 max-width: 100%;
80 }
81
82 @media (max-width: 767px) {
83 .refproduct-item {
84 flex-direction: column;
85 margin-bottom: 1em;
86 max-height: auto;
87 }
88 .refproduct-img {
89 width: auto;
90 }
91 .refproduct-img img {
92 max-width: 250px!important;
93 }
94 .refproduct-img,
95 .refproduct-btn,
96 .refproduct-item .refdetail-h3 {
97 margin-bottom: 0.5em;
98 }
99 }
100
101 .refdetail-section.refdetail-gallery:focus-visible {
102 outline: 0;
103 }
104
105 .refgal-bigimage {
106 height: calc(50vw);
107 background-color: aliceblue;
108 display: flex;
109 flex-direction: column;
110 align-items: flex-start;
111 justify-content: flex-end;
112 min-height: 350px;
113 max-height: 700px;
114 margin-bottom: 4px;
115 cursor: zoom-in;
116 }
117
118 .refgal-stripeframe {
119 overflow-x: scroll;
120 overflow-y: hidden;
121 position: relative;
122 }
123
124 .refgal-stripeframe::-webkit-scrollbar {
125 display: none;
126 }
127 .refgal-backimg {
128 position: relative;
129 background: no-repeat 50%/cover;
130 }
131
132 .refgal-thumbstripe {
133 display: flex;
134 flex-direction: row;
135 flex-wrap: nowrap;
136 position: relative;
137 transition: .5s;
138 left: 0px;
139 }
140
141 .refgal-thumbitem {
142 height: ${thumbnailHeight}px;
143 width: ${thumbnailWidth - 4}px;
144 margin-right: 4px;
145 cursor: pointer;
146 }
147
148 .refgal-thumbitem.active {
149 height: ${thumbnailHeight}px;
150 width: ${thumbnailWidth - 4}px;
151 border: 5px solid darkgray;
152 }
153
154 .refgal-thumbitem:last-child {
155 width: ${thumbnailWidth}px;
156 margin-right: 0px;
157 }
158
159 .refgal-thumbitem:hover {
160 opacity: 0.5;
161 }
162
163 span.refgal-bigimage-caption {
164 background-color: rgba(255,255,255,.7);
165 padding: 0.5em 1em;
166 width: 100%;
167 }
168
169 .refgal-controls,
170 .refgal-controls-big {
171 display: flex;
172 flex-direction: row;
173 justify-content: space-between;
174 height: 0;
175 align-items: center;
176 }
177
178 .galcontrol {
179 top: -${thumbnailHeight / 2}px;
180 padding: .4em;
181 font-size: 28px;
182 color: white;
183 background-color: rgba(0,0,0,0.1);
184 cursor: pointer;
185 position: relative;
186 }
187
188 .galcontrol-big {
189 padding: .4em;
190 font-size: 28px;
191 color: white;
192 background-color: rgba(0,0,0,0.1);
193 cursor: pointer;
194 position: relative;
195 }
196
197
198 .fullscreen.refgal-bigimage {
199 height: 100%;
200 position: fixed;
201 top: 0;
202 background-color: rgba(0,0,0,1);
203 display: block;
204 min-height: 100%;
205 max-height: 100%;
206 margin-bottom: 0;
207 cursor: default;
208 left: 0;
209 right: 0;
210 bottom: 0;
211 background-position: center;
212 background-size: contain;
213 z-index: 10001;
214 display: flex;
215 flex-direction: column;
216 justify-content: space-between;
217 }
218
219 .refgal-bigimage-close.fas {
220 display: none;
221 }
222
223 .fullscreen .refgal-bigimage-close {
224 display: block;
225 color: white;
226 padding: 1.2em;
227 cursor: pointer;
228 position: relative;
229 align-self: end;
230 }
231
232 .fullscreen span.refgal-bigimage-caption {
233 background-color: rgba(0,0,0,0.8);
234 padding: .5em 2em;
235 width: auto;
236 margin-left: auto;
237 color: white;
238 margin-bottom: calc(5vh);
239 margin-right: auto;
240 }
241
242 .fullscreen.refgal-controls-big {
243 display: flex;
244 flex-direction: row;
245 justify-content: space-between;
246 height: 0;
247 align-items: center;
248 position: fixed;
249 top: calc(50vh);
250 left: 0;
251 width: 100%;
252 z-index: 10002;
253 }
254
255 .fullscreen .galcontrol-big {
256 top: 0!important;
257 }
258
259 .refgal-controls .galcontrol-left,
260 .refgal-controls-big .galcontrol-big-left,
261 .refgal-controls .galcontrol-right,
262 .refgal-controls-big .galcontrol-big-right {
263 opacity: 0.3;
264 cursor: auto;
265 }
266
267 .refgal-controls.left .galcontrol-left,
268 .refgal-controls-big.left .galcontrol-big-left,
269 .refgal-controls.right .galcontrol-right,
270 .refgal-controls-big.right .galcontrol-big-right {
271 opacity: 1;
272 cursor: pointer;
273 }
274
275 /*end styles*/
276</style>
277
278<link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" rel="stylesheet" />
279
280<#-- setting urlHelper -->
281<#assign curUrl = themeDisplay.getURLCurrent()?string>
282<#if curUrl?contains(themeDisplay.getSiteGroup().friendlyURL)>
283 <#assign urlHelper = themeDisplay.getPathFriendlyURLPublic() + themeDisplay.getSiteGroup().friendlyURL>
284<#else>
285 <#assign urlHelper = "">
286</#if>
287<!-- urlHelper: ${urlHelper} -->
288<#-- end setting -->
289<#setting locale=locale.toString()>
290<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")>
291
292<div class="container refdetail">
293 <#-- heading -->
294 <div class="refdetail-section refdetail-heading">
295 <h1 class="refdetail-h1">${Title.getData()}</h1>
296 <p class="refdetail-p">${Description.getData()?replace("\n", "<br>")}</p>
297 </div>
298
299 <#-- used products -->
300 <#if Product.getSiblings()?has_content>
301 <div class="refdetail-section refdetail-prudcts">
302 <h2 class="refdetail-h2">
303 <#if Product.getSiblings()?size > 1>
304 ${sUsedProducts}
305 </#if>
306 <#if Product.getSiblings()?size == 1>
307 ${sUsedProduct}
308 </#if>
309 </h2>
310 <#list Product.getSiblings() as cur_Product>
311 <@printProductRange cur_Product/>
312 </#list>
313 </div>
314 </#if>
315
316 <#-- table -->
317 <#if Oddlovaj442.getSiblings()?has_content>
318 <div class="refdetail-section refdetail-infotable">
319 <h2 class="refdetail-h2">${sBasicInfoAbout}</h2>
320 <table class="refdetail-table">
321 <#list Oddlovaj442.getSiblings() as cur_row>
322 <tr>
323 <td>${cur_row.Label.getData()}</td>
324 <td>${cur_row.Value.getData()}</td>
325 </tr>
326 </#list>
327 </table>
328 </div>
329 </#if>
330
331 <#-- gallery -->
332 <#if ImageGalleryItemURL.getSiblings()?has_content>
333 <#assign galItems = ImageGalleryItemURL.getSiblings()?size?number>
334 <div class="refdetail-section refdetail-gallery" id="js-gallery" tabindex="-1">
335 <h2 class="refdetail-h2">${sGallery}</h2>
336 <#assign iImg = ImageGalleryItemURL.getData()>
337 <#if ImageGalleryItemURL.getAttribute("alt")??>
338 <#assign iCaption = ImageGalleryItemURL.getAttribute("alt")>
339 <#else>
340 <#assign iCaption = "">
341 </#if>
342 <#-- big images -->
343 <div class="refgal-bigimage refgal-backimg" style="" id="js-bigimage">
344 <i class="fas fa-close refgal-bigimage-close" id="js-bigimage-close"></i>
345 <span id="js-bigimage-caption" class="refgal-bigimage-caption" style="display:none"></span>
346 </div>
347 <div class="refgal-controls-big" id="js-galcontrols-big">
348 <div>
349 <i class="fas fa-chevron-left galcontrol-big galcontrol-big-left" data-direction="left"></i>
350 </div>
351 <div>
352 <i class="fas fa-chevron-right galcontrol-big galcontrol-big-right" data-direction="right"></i>
353 </div>
354 </div>
355 <#-- -->
356 <#-- small images -->
357 <div class="refgal-stripeframe" id="js-galstripe-frame">
358 <div class="refgal-thumbstripe" id="js-galstripe" style="width:${galItems*thumbnailWidth}px">
359 <#list ImageGalleryItemURL.getSiblings() as cur_ImageGalleryItemURL>
360 <#assign iIndex = cur_ImageGalleryItemURL?index>
361 <#assign iImg = cur_ImageGalleryItemURL.getData()>
362 <#if cur_ImageGalleryItemURL.getAttribute("alt")??>
363 <#assign iCaption = cur_ImageGalleryItemURL.getAttribute("alt")>
364 <#else>
365 <#assign iCaption = "">
366 </#if>
367 <div class="refgal-thumbitem refgal-backimg" style="background-image:URL('${iImg}');" id="js-galitem-${iIndex}" data-image="${iImg}" data-caption="${iCaption}">
368 </div>
369 </#list>
370 </div>
371 </div>
372 <div class="refgal-controls" id="js-galcontrols">
373 <div>
374 <i class="fas fa-chevron-left galcontrol galcontrol-left" data-direction="left"></i>
375 </div>
376 <div>
377 <i class="fas fa-chevron-right galcontrol galcontrol-right" data-direction="right"></i>
378 </div>
379 </div>
380 <#-- -->
381 </div>
382
383 <script>
384 AUI().ready(
385 function() {
386
387 var galShift = 0;
388 var galPcs = ${galItems};
389 var galStep = ${thumbnailWidth};
390 var galStripeWidth = galPcs * galStep;
391 var galFirst = "js-galitem-0";
392 var galLast = "js-galitem-"+(galPcs-1);
393
394 var id = function(selector) {
395 return "#"+selector;
396 }
397
398 function checkShift() {
399 let frameWidth = getFrameWidth();
400 if (galStripeWidth + galShift < frameWidth ) {
401 galShift = -1 * (galStripeWidth - frameWidth);
402 }
403 if (galShift > 0) {
404 galShift = 0;
405 }
406 $("#js-galstripe").css("left", galShift + "px");
407 }
408
409 function getFrameWidth() {
410 return $("#js-galstripe-frame").width();
411 }
412
413 function getBigImageHeight() {
414 return $("#js-bigimage").height();
415 }
416
417 function showControls() {
418 setControls();
419 setBigControls();
420 // chceck thumbnail controls
421 let frameWidth = getFrameWidth();
422 if (frameWidth < galStripeWidth) {
423 var showIt = "flex";
424 }
425 else {
426 var showIt = "none";
427 }
428 checkShift();
429 $("#js-galcontrols").css("display",showIt);
430
431 //check big controls
432 var bigImageHeight = getBigImageHeight();
433 $(".galcontrol-big").css("top", -1 * bigImageHeight / 2);
434 }
435
436 function makeActive(element) {
437 $(".refgal-thumbitem").removeClass("active");
438 $(element).addClass("active");
439 }
440
441 function changePhoto(e) {
442
443 var newImage = e.target.dataset.image;
444 $("#js-bigimage").css("background-image", "URL('" + newImage + "')");
445
446 var newCaption = e.target.dataset.caption;
447 if (newCaption !== "") {
448 $("#js-bigimage-caption").text(newCaption);
449 $("#js-bigimage-caption").css("display", "block");
450 } else {
451 $("#js-bigimage-caption").css("display", "none");
452 };
453
454 makeActive(e.target);
455 showControls();
456 }
457
458 function scroll(e) {
459 var direction = e.target.dataset.direction;
460
461 if (direction === "right") {
462 galShift = galShift - galStep;
463 }
464 else if (direction === "left") {
465 galShift = galShift + galStep;
466 }
467 checkShift();
468 setControls();
469 }
470
471 function switchBig(e) {
472 var direction = e.target.dataset.direction;
473
474 if (direction === "right") {
475 switchNext();
476 }
477 else if (direction === "left") {
478 switchPrev();
479 }
480 }
481
482 function switchNext() {
483 let curr = $(".refgal-thumbitem.active");
484 let next = curr.next();
485 if (curr.attr('id') !== galLast) {
486 next.click();
487 }
488 }
489
490 function switchPrev() {
491 let curr = $(".refgal-thumbitem.active");
492 let prev = curr.prev();
493 if (curr.attr('id') !== galFirst) {
494 prev.click();
495 }
496 }
497
498 function setBigControls() {
499 // big controls
500 let curr = $(".refgal-thumbitem.active");
501 if (curr.attr('id') === galLast) {
502 $("#js-galcontrols-big").removeClass("right");
503 }
504 else {
505 $("#js-galcontrols-big").addClass("right");
506 }
507 if (curr.attr('id') === galFirst) {
508 $("#js-galcontrols-big").removeClass("left");
509 }
510 else {
511 $("#js-galcontrols-big").addClass("left");
512 }
513 }
514
515 function setControls() {
516 // stripe controls
517 let frameWidth = getFrameWidth();
518 // console.log(galStripeWidth, galShift, frameWidth);
519 if (galStripeWidth + galShift === frameWidth) {
520 $("#js-galcontrols").removeClass("right");
521 }
522 else {
523 $("#js-galcontrols").addClass("right");
524 }
525 if (galShift === 0) {
526 $("#js-galcontrols").removeClass("left");
527 }
528 else {
529 $("#js-galcontrols").addClass("left");
530 }
531 }
532
533 function goFullScreen () {
534 event.stopPropagation();
535 $("#js-bigimage").addClass("fullscreen");
536 $("#js-galcontrols-big").addClass("fullscreen");
537 }
538
539 function exitFullScreen () {
540 event.stopPropagation();
541 $("#js-bigimage").removeClass("fullscreen");
542 $("#js-galcontrols-big").removeClass("fullscreen");
543 }
544
545 function checkKey(e) {
546 var key = e.keyCode;
547 // console.log(key);
548 event.stopPropagation();
549 if (key == 37) {
550 switchPrev();
551 }
552 else if (key == 39) {
553 switchNext();
554 }
555 }
556
557
558
559
560 showControls();
561
562 $("#js-galstripe").click(changePhoto);
563
564 $(id(galFirst)).click();
565
566 $("#js-galcontrols").click(scroll);
567
568 $("#js-galcontrols-big").click(switchBig);
569
570 $("#js-bigimage").click(goFullScreen);
571
572 $("#js-bigimage-close").click(exitFullScreen);
573
574 $("#js-gallery").keydown(checkKey);
575
576 $(window).resize(showControls);
577
578 });
579 </script>
580
581 </#if>
582
583</div>
584
585<#macro printProductRange product>
586 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
587 <#local webContentData = jsonFactoryUtil.createJSONObject(product.getData())/>
588
589 <#local classPK = webContentData.classPK?number!"" />
590 <#local journalArticle = journalArticleLocalService.getLatestArticle(classPK)!"none">
591 <#local journalArticleId = journalArticle.getId() />
592 <#local urlTitle=journalArticle.urlTitle />
593 <#local document=saxReaderUtil.read(journalArticle.getContent()) />
594
595 <#local availableLocale=document.getRootElement().attributeValue('available-locales') />
596 <#local defaultLocale=document.getRootElement().attributeValue('default-locale') />
597 <#if availableLocale?contains(locale)>
598 <#local displayLocale=locale>
599 <#else>
600 <#local displayLocale=defaultLocale>
601 </#if>
602
603 <#local productHeading=document.valueOf("//dynamic-element[@name='ProductHeading']//dynamic-content[@language-id='${displayLocale}']") />
604 <#local productLogoColor=document.valueOf("//dynamic-element[@name='ProductLogoColor']//dynamic-content[@language-id='${displayLocale}']") />
605 <#local pageLink=document.valueOf("//dynamic-element[@name='LinkToPage']//dynamic-content[@language-id='${displayLocale}']") />
606 <#local extLink=document.valueOf("//dynamic-element[@name='AlternateURLUseOnlyForLinksOutOfTheSite']//dynamic-content[@language-id='${displayLocale}']") />
607
608 <#if pageLink !="">
609 <#if pageLink?keep_after('@')?keep_before('@')?string = "public">
610 <#assign boolean = false>
611 <#else>
612 <#assign boolean = true>
613 </#if>
614 <#assign layoutId = getterUtil.getLong(pageLink?keep_before('@'))/>
615 <#assign groupId = getterUtil.getLong(pageLink?keep_after_last('@'))/>
616 <#assign layout = layoutLocalService.getLayout(groupId,boolean,layoutId)/>
617 <#assign linkUrl = urlHelper + layout.getFriendlyURL()>
618 <#elseif extLink != "">
619 <#assign linkUrl = extLink>
620 <#else>
621 <#assign linkUrl = "#">
622 </#if>
623
624
625 <#if journalArticle.isApproved() && !journalArticle.isExpired()>
626 <div class="refproduct-item">
627 <div class="refproduct-img">
628 <img class="" src="${productLogoColor}">
629 </div>
630 <h3 class="refdetail-h3">${productHeading}</h3>
631 <a class="refproduct-btn" href="${linkUrl}">Více</a>
632 </div>
633 </#if>
634</#macro>
Archeopark Pavlov
2. srpna, 2003Cemex se podílel na realizaci oceňovaného Archeoparku Pavlov na Brněnsku. Do dnešního dne se Archeopark Pavlov může pochlubit celkem 7 cenami, které získal nejen za svou jedinečnou a moderní architekturu, ale i za svou expozici věnující se kultuře lovců mamutů. Stavba roku 2016 V roce 2016...
VíceSpolkový dům ve Slavonicích
22. ledna, 2011Rekonstrukce spolkového domu ve Slavonicích byla prováděna firmou Podzimek a synové s.r.o., monolitické práce subdodávkou provedla firma K.K.Beton CZ s.r.o. Vzhledem k umístění stavby v památkové zóně Slavonic bylo nutno ponechat stávající obvodové zdivo. Nové monolitické konstrukce jsou z...
VíceVodní dílo Šance
1. ledna, 2018CEMEX se podílel na stavbě vodního díla Šance, budovaného mezi lety 2015 - 2018
Více