Begradigt – Strukturarm – Aufgestaut
The following has evaluated to null or missing: ==> formField.getValue().getString(locale) [in template "blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" at line 56, column 49] ---- Tip: If the failing expression is known to 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 Bildnachweis = formField.getV... [in template "blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" in function "getCopyrightText" at line 56, column 25] ----
1<#import "/blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" as common>
2
3<#assign layoutService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
4<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
5<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
6<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
7<#assign namespace = randomNamespace />
8<#assign journalArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) />
9
10<#assign
11parentLayoutPlid = layout.getParentPlid()
12parentLayout = layoutLocalService.fetchLayout(parentLayoutPlid)!""
13parentAssetPublisherId = ""
14/>
15<#if validator.isNotNull(parentLayout)>
16 <#if parentLayout.isTypePortlet()>
17 <#assign parentLayoutTypePortlet = parentLayout.getLayoutType() />
18 <#assign parentPortlets = parentLayoutTypePortlet.getExplicitlyAddedPortlets() />
19 <#list parentPortlets as parentPortlet>
20 <#if parentPortlet.getRootPortletId() == "com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet">
21 <#assign parentAssetPublisherId = parentPortlet.getPortletId() />
22
23 <#break />
24 </#if>
25 </#list>
26 </#if>
27</#if>
28
29<#assign topBgColorClass = "on-" + TopBgColor.getData() + "-bg" />
30
31<article class="article">
32 <#if Slider?? && Slider.NeuerSlider?? && (Slider.NeuerSlider.Image.getData()?has_content || Slider.NeuerSlider.Youtube.getData()?has_content)>
33 <div class="slider-hero" id="slider_${namespace}">
34 <div class="slides-list" aria-roledescription="Karusell">
35 <#list Slider.NeuerSlider.getSiblings() as curSlide>
36
37 <#if curSlide.AltTextImage?? && curSlide.AltTextImage.getData()?has_content>
38 <#assign AltText = curSlide.AltTextImage.data />
39 </#if>
40
41 <#assign AltText = common.getAltText(curSlide.Image.data, AltText) />
42
43 <#assign Copyright = "" />
44 <#assign CopyrightMobile = "" />
45 <#if (common.getCopyrightText(curSlide.Image.data)!"") != "">
46 <#assign Copyright = common.getCopyrightTag("",curSlide.Image.data) />
47 </#if>
48
49
50
51 <#assign hasMobileImageClass= "" />
52 <#assign ImageMobileFocusClass= "image-focus-mobile-center" />
53 <#if curSlide.ImageMobile?? && curSlide.ImageMobile.getData()?has_content>
54 <#assign hasMobileImageClass= "image-with-mobile-alternative" />
55 <#if (common.getCopyrightText(curSlide.ImageMobile.data)!"") != "">
56 <#assign CopyrightMobile = common.getCopyrightTag("",curSlide.ImageMobile.data,"","mobile") />
57 </#if>
58 <#if curSlide.ImageMobile.ImageMobileFocus?? && curSlide.ImageMobile.ImageMobileFocus.getData()?has_content>
59 <#assign ImageMobileFocusClass= "image-focus-mobile-" + curSlide.ImageMobile.ImageMobileFocus.getData() />
60 </#if>
61 </#if>
62
63 <#assign ImageDesktopFocusClass= "image-focus-desktop-center fooo" />
64 <#if curSlide.Image.ImageDesktopFocus?? && curSlide.Image.ImageDesktopFocus.getData()?has_content>
65 <#assign ImageDesktopFocusClass= "image-focus-desktop-" + curSlide.Image.ImageDesktopFocus.getData()/>
66 </#if>
67
68
69 <div class="slide">
70 <div class="slide-content">
71 <#if (curSlide.Youtube?? && curSlide.Youtube.getData()?has_content) && (curSlide.Image?? && curSlide.Image?has_content)>
72 <#assign videoId = curSlide.Youtube.getData()/>
73
74 <#if videoId?starts_with("http")>
75 <#assign videoId = videoId?split("/")[3]>
76 </#if>
77
78 <div class="slide-content-video image-with-caption ${hasMobileImageClass} ${ImageDesktopFocusClass} ${ImageMobileFocusClass}">
79 <a href="https://www.youtube-nocookie.com/${videoId}" target="_blank"
80 class="video-link">
81 <img src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
82 data-src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
83 class="slide__image image--desktop" alt="${AltText}"/>
84 <#if curSlide.ImageMobile?? && curSlide.ImageMobile.getData()?has_content>
85 <img src="${common.getScaledImageURL(curSlide.ImageMobile.getData(), "bg-image-medium")}"
86 data-src="${common.getScaledImageURL(curSlide.ImageMobile.getData(), "bg-image-medium")}"
87 class="slide__image image--mobile" alt="${AltText}"/>
88 ${CopyrightMobile}
89 </#if>
90 </a>
91 ${Copyright}
92 </div>
93 <#else>
94 <div class="slide-content-image image-with-caption ${hasMobileImageClass} ${ImageDesktopFocusClass} ${ImageMobileFocusClass}">
95 <img src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
96 data-src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
97 class="slide__image image--desktop" alt="${AltText}"/>
98 <#if curSlide.ImageMobile?? && curSlide.ImageMobile.getData()?has_content>
99 <img src="${common.getScaledImageURL(curSlide.ImageMobile.getData(), "bg-image-medium")}"
100 data-src="${common.getScaledImageURL(curSlide.ImageMobile.getData(), "bg-image-medium")}"
101 class="slide__image image--mobile" alt="${AltText}"/>
102 </#if>
103 ${Copyright}
104 </div>
105 </#if>
106 </div>
107 </div>
108 </#list>
109 </div>
110 </div>
111 </#if>
112
113 <section class="article-area article-area--${topBgColorClass}">
114 <div class="container">
115 <div class="row justify-content-center">
116 <div class="col-sm-8">
117 <nav id="breadcrumbs">
118 <#assign preferencesMap = {"portletSetupPortletDecoratorId": "decorate-yellow-bg", "displayStyle": "ddmTemplate_BREADCRUMB-BLAUES-GUT","showPortletBreadcrumb":"true"} />
119
120 <@liferay.breadcrumbs default_preferences = freeMarkerPortletPreferences.getPreferences(preferencesMap) />
121 </nav>
122 </div>
123 </div>
124 <div class="row justify-content-center">
125 <div class="col-sm-8">
126 <h1 class="article-headline">${HeadlineArticle.getData()}</h1>
127 </div>
128 </div>
129 <div class="row justify-content-center">
130 <div class="col-sm-8">
131 <#assign assetCategories = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", journalArticle.resourcePrimKey) />
132 <#if assetCategories?? && assetCategories?size gt 0>
133 <ul class="tags">
134 <#list assetCategories as assetCategory>
135 <#assign
136 categoryURL = portletURLFactory.create(renderRequest, parentAssetPublisherId, parentLayoutPlid, "RENDER_PHASE")
137 href = categoryURL.toString()
138 href = httpUtil.setParameter(href, "_" + parentAssetPublisherId + "_categoryId", assetCategory.getCategoryId()?string)
139 href = httpUtil.setParameter(href, "_" + parentAssetPublisherId + "_resetCur", "true")
140 />
141
142 <li class="tag">
143 <a href="${href}" class="no-icon">${assetCategory.getTitle(locale)}</a>
144 </li>
145 </#list>
146 </ul>
147 </#if>
148 </div>
149 </div>
150 <#if Intro?? && Intro.data?has_content>
151 <div class="row justify-content-center">
152 <div class="col-md-8">
153 <p class="bold">${Intro.getData()}</p>
154 </div>
155 </div>
156 </#if>
157
158 <div class="row justify-content-center">
159 <div class="col-md-8">
160 <div class="button-area">
161 <button class="share-social-link btn btn-text">
162 <span class="icon-bg icon-bg--share"></span> <span class="link-title"> <span
163 class="hide-accessible">Seite </span>Teilen </span>
164 </button>
165 <button class="btn btn-text" onclick="window.print();">
166 <span class="icon-bg icon-bg--print"></span> <span class="link-title"> <span
167 class="hide-accessible">Seite </span>Drucken </span>
168 </button>
169 </div>
170 </div>
171 </div>
172 </div>
173
174 </section>
175
176
177 <#if WaveTop?? && WaveTopColor??>
178 <section class="article-wave-area" data-source="${WaveTop.getData()}">
179 <section class="waves">
180 <div class="wave wave--${WaveTop.getData()}-${WaveTopColor.getData()} v-mirrored"></div>
181 </section>
182 </section>
183 </#if>
184
185
186
187
188
189 <#if Text?? && Text.data?has_content>
190 <section class="article-text container">
191 <div class="row justify-content-center">
192 <div class="col-md-8">
193 ${Text.getData()}
194 </div>
195 </div>
196 </section>
197 </#if>
198
199 <#if ImageLarge?? && ImageLarge.data?has_content>
200
201 <#assign CopyrightImageLarge= "" />
202 <#assign CopyrightImageLargeMobile= "" />
203
204 <#assign hasMobileImageLargeClass= "" />
205 <#if ImageLargeMobile?? && ImageLargeMobile.getData()?has_content>
206 <#assign hasMobileImageLargeClass= "image-with-mobile-alternative" />
207 <#if (common.getCopyrightText(ImageLargeMobile.data)!"") != "">
208 <#assign CopyrightMobile = common.getCopyrightTag("",ImageLargeMobile.data,"","mobile") />
209 </#if>
210 </#if>
211
212 <#if (common.getCopyrightText(ImageLarge.data)!"") != "">
213 <#assign CopyrightImageLarge = common.getCopyrightTag("",ImageLarge.data) />
214 </#if>
215
216 <section class="article-image-large">
217 <section class="image-large image-with-caption ${hasMobileImageLargeClass}" id="image-large_${namespace}">
218 <div class="image-inner">
219 <img src="${common.getScaledImageURL(ImageLarge.getData(), "bg-image-medium")}"
220 alt="${common.getAltText(ImageLarge.data)}" class="image image--desktop"/>
221 <#if ImageLargeMobile?? && ImageLargeMobile.getData()?has_content>
222 <img src="${common.getScaledImageURL(ImageLarge.getData(), "bg-image-medium")}"
223 alt="${common.getAltText(ImageLarge.data)}" class="image image--mobile"/>
224 ${CopyrightImageLargeMobile}
225 </#if>
226 ${CopyrightImageLarge}
227 </div>
228 </section>
229 <#if ImageCaption?? && ImageCaption.data?has_content>
230 <div class="container">
231 <div class="row justify-content-center">
232 <div class="col-md-8">
233 <div class="article__image-large-caption">${ImageCaption.getData()}</div>
234 </div>
235 </div>
236 </div>
237 </#if>
238 </section>
239 </#if>
240
241 <#if TextBottom?? && TextBottom.data?has_content>
242 <section class="article-text container">
243 <div class="row justify-content-center">
244 <div class="col-md-8">
245 ${TextBottom.getData()}
246 </div>
247 </div>
248 </section>
249 </#if>
250
251</article>
252
253<#if Slider?? && Slider.NeuerSlider?? && (Slider.NeuerSlider.Image.getData()?has_content || Slider.NeuerSlider.Youtube.getData()?has_content)>
254 <script>
255 window.addEventListener("load", function () {
256 function ${namespace}_updateInfo(info) {
257 for (var i = 0; i < info.navItems.length; i++) {
258 info.navItems[i].setAttribute('aria-label', 'Folie ' + (i + 1));
259 }
260
261 info.navItems[info.navCurrentIndex].setAttribute('aria-label', 'Folie ' + (info.navCurrentIndex + 1) + ' (aktuell)');
262
263 info.controlsContainer.setAttribute('aria-label', 'Navigationselemente');
264 info.prevButton.setAttribute('aria-label', 'zur vorhergehenden Folie springen');
265 info.nextButton.setAttribute('aria-label', 'zur nächsten Folie springen');
266 info.navContainer.setAttribute('aria-label', 'Auswahl der Folien')
267 }
268
269 var slider = tns({
270 container: '#slider_${namespace} .slides-list',
271 items: 1,
272 slideBy: 'page',
273 center: true,
274 controlsPosition: 'bottom',
275 navPosition: 'bottom',
276 touch: true,
277 mouseDrag: false,
278 freezable: true,
279 speed: 600,
280 lazyload: true,
281 arrowKeys: true,
282 lazyloadSelector: '.slide__image',
283 controlsText: ['<span class="icon-bg icon-bg--arrow1-left"></span>', '<span class="icon-bg icon-bg--arrow1-right"></span>'],
284 autoplay: true,
285 autoplayHoverPause: true,
286 autoplayPosition: 'bottom',
287 autoplayTimeout: 3000,
288 autoplayText: ["▶", "❚❚"],
289 onInit: function (info) {
290 ${namespace}_updateInfo(info);
291
292 var btn = document.querySelector('#slider_${namespace} button[data-action="stop"]');
293 var nav = document.querySelector('#slider_${namespace} .tns-nav');
294
295 if (btn && nav) {
296 var wrapper = document.createElement('div');
297 wrapper.classList.add('nav-wrapper');
298
299 nav.parentNode.insertBefore(wrapper, nav);
300
301 wrapper.appendChild(nav);
302 wrapper.appendChild(btn);
303 }
304 }
305 });
306 slider.events.on('indexChanged', function (info) {
307 ${namespace}_updateInfo(info);
308 });
309 });
310 </script>
311</#if>
The following has evaluated to null or missing: ==> formField.getValue().getString(locale) [in template "blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" at line 22, column 43] ---- Tip: If the failing expression is known to 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 altTag = formField.getValue()... [in template "blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" in function "getAltText" at line 22, column 25] ----
1<#import "/blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" as common>
2
3<#assign namespace = randomNamespace />
4<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
5<#assign layoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
6
7<#function getDownloadLink content>
8 <#assign
9 dlAppService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")
10 dlUrlHelperUtil = serviceLocator.findService("com.liferay.document.library.util.DLURLHelper")
11 json = jsonFactoryUtil.createJSONObject(content)
12 fileEntryGroupId = json.getLong("groupId")
13 fileEntryUuid = json.getString("uuid")
14 fileEntry = dlAppService.getFileEntryByUuidAndGroupId(fileEntryUuid, fileEntryGroupId)
15 >
16 <#return httpUtil.removeParameter(dlUrlHelperUtil.getDownloadURL(fileEntry, fileEntry.getLatestFileVersion(), themeDisplay, "", false, true), "download") />
17</#function>
18
19
20<#if entries?has_content>
21 <#assign
22 parentLayoutPlid = layout.getParentPlid()
23 parentLayout = layoutLocalService.fetchLayout(parentLayoutPlid)!""
24 parentAssetPublisherId = ""
25 />
26 <#if validator.isNotNull(parentLayout)>
27 <#if parentLayout.isTypePortlet()>
28 <#assign parentLayoutTypePortlet = parentLayout.getLayoutType() />
29 <#assign parentPortlets = parentLayoutTypePortlet.getExplicitlyAddedPortlets() />
30 <#list parentPortlets as parentPortlet>
31 <#if parentPortlet.getRootPortletId() == "com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet">
32 <#assign parentAssetPublisherId = parentPortlet.getPortletId() />
33
34 <#break />
35 </#if>
36 </#list>
37 </#if>
38 </#if>
39
40<#-- <#list entries as entry>-->
41<#-- <#assign assetRenderer = entry.getAssetRenderer() />-->
42
43<#-- <#if assetRenderer.getClassName()=="com.liferay.journal.model.JournalArticle">-->
44<#-- <pre>-->
45<#-- ${assetRenderer.getArticle().getContent()}-->
46<#-- </pre>-->
47<#-- </#if>-->
48<#-- </#list>-->
49
50<#-- <div style="background-color: red;height: 50px;color:white;">-->
51<#-- ###########################################-->
52<#-- </div>-->
53
54 <section class="slider-related" id="slider_${namespace}">
55 <h2 class="headline">Das könnte Sie auch interessieren</h2>
56
57 <div class="slides-wrapper">
58
59 <div class="slides-list aria-roledescription="Karusell"">
60
61 <#list entries as curEntry>
62
63
64 <#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContent()) />
65 <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, curEntry) />
66 <#assign renderer= curEntry.getAssetRenderer()/>
67
68 <#if assetLinkBehavior != "showFullContent">
69 <#assign viewURL = renderer.getURLViewInContext(renderRequest, renderResponse, viewURL) />
70 </#if>
71
72
73
74 <#assign
75 linkTarget = ""
76 linkHref= viewURL
77 headline = docXml.valueOf("//dynamic-element[@name='HeadlineArticle']/dynamic-content/text()")
78 imgUrlExisting = docXml.valueOf("//dynamic-element[@name='ExistingSlider']//dynamic-element[@name='Image']/dynamic-content/text()")
79 imgUrlNew = docXml.valueOf("//dynamic-element[@name='NeuerSlider']//dynamic-element[@name='Image']/dynamic-content/text()")
80 imgLarge = docXml.valueOf("//dynamic-element[@name='ImageLarge']/dynamic-content/text()")
81 imgUrl = ""
82 altText = ""
83 Copyright = ""
84 />
85
86 <#if imgUrlNew!="">
87 <#assign
88 imgUrl = getDownloadLink(imgUrlNew) + "&imageThumbnail=1"
89 altText = common.getAltText(imgUrlNew)
90 Copyright = common.getCopyrightTag("",imgUrlNew)
91 />
92
93 <#elseif imgUrlExisting!="">
94 <#assign
95 imgUrl = getDownloadLink(imgUrlExisting) + "&imageThumbnail=1"
96 altText = common.getAltText(imgUrlExisting)
97 Copyright = common.getCopyrightTag("",imgUrlExisting)
98 />
99 <#elseif imgLarge!="">
100 <#assign
101 imgUrl = getDownloadLink(imgLarge) + "&imageThumbnail=1"
102 altText = common.getAltText(imgLarge)
103 Copyright = common.getCopyrightTag("",imgLarge)
104 />
105 </#if>
106
107 <div class="slide" role="group" aria-roledescription="Folie" aria-label="Folie ${curEntry?index + 1} von ${entries?size}">
108 <div class="slide-content">
109 <div class="slide-content-image image-with-caption">
110 <a href="${linkHref}" ${linkTarget}>
111 <#if imgUrl!="">
112 <img src="${imgUrl}" data-src="${imgUrl}" class="slide__image" alt="${altText}"/>
113 <#else>
114 <img src="/o/blaues-gut-theme/images/no-image_blaues-gut.png" data-src="/o/blaues-gut-theme/images/logo_bg_mobile.svg"
115 class="slide__image no-image" alt=""/>
116 </#if>
117 </a>
118 ${Copyright}
119 </div>
120
121
122 <ul class="tags">
123 <#assign assetCategories = assetCategoryLocalService.getAssetEntryAssetCategories(curEntry.entryId) />
124 <#list assetCategories as assetCategory>
125 <#assign
126 categoryURL = portletURLFactory.create(renderRequest, parentAssetPublisherId, parentLayoutPlid, "RENDER_PHASE")
127 href = categoryURL.toString()
128 href = httpUtil.setParameter(href, "_" + parentAssetPublisherId + "_categoryId", assetCategory.getCategoryId()?string)
129 href = httpUtil.setParameter(href, "_" + parentAssetPublisherId + "_resetCur", "true")
130 />
131
132
133 <li class="tag">
134 <a href="${href}">${assetCategory.getTitle(locale)}</a>
135 </li>
136 </#list>
137 </ul>
138 <h4 class="title"><a href="${linkHref}" ${linkTarget}>${headline}</a></h4>
139 </div>
140 </div>
141 </#list>
142 </div>
143 </div>
144 </section>
145
146 <script>
147 window.addEventListener("load", function () {
148 function ${namespace}_updateInfo(info) {
149 if (info.navItems) {
150 for (var i = 0; i < info.navItems.length; i++) {
151 info.navItems[i].setAttribute('aria-label', 'Folie ' + (i + 1));
152 }
153
154 info.navItems[info.navCurrentIndex].setAttribute('aria-label', 'Folie ' + (info.navCurrentIndex + 1) + ' (aktuell)');
155 }
156
157 if (info.controlsContainer) {
158 info.controlsContainer.setAttribute('aria-label', 'Navigationselemente');
159 }
160 if (info.prevButton) {
161 info.prevButton.setAttribute('aria-label', 'zur vorhergehenden Folie springen');
162 }
163 if (info.nextButton) {
164 info.nextButton.setAttribute('aria-label', 'zur nächsten Folie springen');
165 }
166 if (info.navContainer) {
167 info.navContainer.setAttribute('aria-label', 'Auswahl der Folien')
168 }
169 }
170
171 var slider = tns({
172 container: '#slider_${namespace} .slides-list',
173 items: 1.5,
174 slideBy: 'page',
175 lazyload: true,
176 lazyloadSelector: '.slide__image',
177 loop: false,
178 controls: false,
179 nav: false,
180 controlsPosition: 'bottom',
181 navPosition: 'bottom',
182 touch: true,
183 mouseDrag: true,
184 freezable: true,
185 speed: 600,
186 arrowKeys: true,
187 edgePadding: 16,
188 fixedWidth: 300,
189 // viewportMax: 1600,
190 controlsText: ['<span class="icon-bg icon-bg--arrow2-left"></span>', '<span class="icon-bg icon-bg--arrow2-right"></span>'],
191 responsive: {
192 768: {
193 items: 1.5,
194 edgePadding: 0,
195 gutter: 0
196 },
197 900: {
198 items: 3,
199 edgePadding: 0
200 },
201 1280: {
202 items: 4,
203 controls: true
204 },
205 1600: {
206 controls: true,
207 items: 5
208 }
209 },
210 onInit: function (info) {
211 ${namespace}_updateInfo(info);
212 }
213 });
214 slider.events.on('indexChanged', function(info) {
215 ${namespace}_updateInfo(info);
216 });
217 });
218 </script>
219</#if>