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>
Multifunkční aula Gong v Dolní oblasti Vítkovic
20. ledna, 2012Rekonverze plynojemu s cílem vytvořit multifunkční aulu s kapacitou 1500 osob, malý sál s kapacitou 400 osob, konferenční místnosti a výstavní prostory. Restrukturalizace obsahovala úpravy nosných ocelových konstrukcí a hybridní betonovou i ocelovou vestavbu nových prostor. Přestavba se...
VíceVysoká škola polytechnická Jihlava
30. listopadu, 2019Nová posluchárna Vysoké školy polytechnické v Jihlavě (VŠPJ) je moderní koncept dynamické soudobé architektury s industriálními prvky v minimalistickém střihu v přímém kontrastu k původnímu areálu a jeho nově rekonstruované části - Severovýchodní křídlo, dříve vnímaném jako hospodářský dvůr. Na...
Více