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] - Reached through: ${common.getAltText(curSlide.Image.da... [in template "20097#20125#SLIDER-STARTPAGE" at line 43, column 60] ----
1<#import "/blaues-gut-portal.web-resources_SERVLET_CONTEXT_/common_macros.ftl" as common>
2
3<#assign namespace = randomNamespace />
4
5<section class="slider-startpage" id="slider_${namespace}">
6 <div class="slides-list">
7
8 <#list Slide.getSiblings() as curSlide>
9
10 <#if (curSlide.Button.ButtonStyle?? && curSlide.Button.ButtonStyle.getData()?has_content)>
11 <#assign ButtonMarkup = common.getButtonMarkup(
12 curSlide.Button.ButtonInternalLink,
13 curSlide.Button.ButtonExternalLink,
14 curSlide.Button.ButtonText,
15 curSlide.Button.ButtonStyle.getData()) />
16 <#else>
17 <#assign ButtonMarkup = common.getButtonMarkup(
18 curSlide.Button.ButtonInternalLink,
19 curSlide.Button.ButtonExternalLink,
20 curSlide.Button.ButtonText) />
21 </#if>
22
23 <#assign hasLink = false />
24
25 <#if curSlide.Button.ButtonExternalLink.data?has_content || ((curSlide.Button.ButtonInternalLink??) && (curSlide.Button.ButtonInternalLink.getFriendlyUrl()?has_content))>
26 <#assign hasLink = true />
27 </#if>
28
29 <div class="slide" role="group"
30 aria-label="Folie ${curSlide?index + 1} von ${Slide.siblings?size}">
31 <div class="slide-content">
32 <span class="h1 headline">${curSlide.Headline.getData()}</span>
33 <#if curSlide.SVG?? && curSlide.SVG.getData()?has_content>
34 <div class="slide-content-image">
35 ${curSlide.SVG.getData()}
36 </div>
37 <#else>
38 </#if>
39 <#if curSlide.Image?? && curSlide.Image.getData()?has_content>
40 <div class="slide-content-image">
41 <img src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
42 data-src="${common.getScaledImageURL(curSlide.Image.getData(), "bg-image-medium")}"
43 class="slide__image" alt="${common.getAltText(curSlide.Image.data)}"
44 loading="lazy"
45 />
46 </div>
47 </#if>
48 </div>
49 <#if hasLink == true>
50 <div class="slide-button-area">
51 ${ButtonMarkup}
52 </div>
53 </#if>
54 </div>
55 </#list>
56 </div>
57 <div id="${namespace}_slider-controls">
58 </div>
59</section>
60
61<script>
62
63 window.addEventListener("load", function () {
64 function ${namespace}_updateInfo(info) {
65 for (var i = 0; i < info.navItems.length; i++) {
66 info.navItems[i].setAttribute('aria-label', 'Folie ' + (i + 1));
67 }
68
69 info.navItems[info.navCurrentIndex].setAttribute('aria-label', 'Folie ' + (info.navCurrentIndex + 1) + ' (aktuell)');
70
71 info.controlsContainer.setAttribute('aria-label', 'Navigationselemente');
72 info.prevButton.setAttribute('aria-label', 'zur vorhergehenden Folie springen');
73 info.nextButton.setAttribute('aria-label', 'zur nächsten Folie springen');
74 info.navContainer.setAttribute('aria-label', 'Auswahl der Folien')
75 }
76
77 var slider = tns({
78 arrowKeys: true,
79 autoHeight: false,
80 autoplay: true,
81 autoplayHoverPause: true,
82 autoplayPosition: 'bottom',
83 autoplayText: ["▶", "❚❚"],
84 autoplayTimeout: 3000,
85 center: true,
86 container: '#slider_${namespace} .slides-list',
87 controlsPosition: 'bottom',
88 controlsText: ['<span class="icon-bg icon-bg--arrow2-left"></span>', '<span class="icon-bg icon-bg--arrow2-right"></span>'],
89 freezable: true,
90 items: 1,
91 lazyload: true,
92 lazyloadSelector: '.slide__image',
93 mouseDrag: false,
94 navPosition: 'bottom',
95 slideBy: 'page',
96 speed: 600,
97 touch: true,
98 onInit: function (info) {
99 ${namespace}_updateInfo(info);
100
101 var btn = document.querySelector('#slider_${namespace} button[data-action="stop"]');
102 var nav = document.querySelector('#slider_${namespace} .tns-nav');
103
104 if (btn && nav) {
105 var wrapper = document.createElement('div');
106 wrapper.classList.add('nav-wrapper');
107
108 nav.parentNode.insertBefore(wrapper, nav);
109
110 wrapper.appendChild(nav);
111 wrapper.appendChild(btn);
112 }
113 }
114 });
115 slider.events.on('indexChanged', function (info) {
116 ${namespace}_updateInfo(info);
117 });
118 });
119</script>
Blaues Gut: Wir machen Gewässer besser
Das Thema Gewässer ist gar nicht so trocken, wie man zunächst denken mag. Tauchen Sie mit uns ein in eine faszinierende Welt. Flüsse, Bäche, Seen und Grundwasser – darunter können wir uns alle etwas vorstellen. Aber wissen wir, welche Welten sich dahinter verbergen? Grundwasserschutz ist wichtig, weil wir damit sauberes Trinkwasser sicherstellen. Ohne natürliche Flüsse, Bäche und Seen würde unser Leben veröden. Denn gutes Wasser ist nicht nur für uns Menschen wichtig, sondern es ist auch Lebensraum für Tiere und Pflanzen. Gutes Wasser ist keine Selbstverständlichkeit, sondern etwas, das wir schützen und pflegen müssen. Wasser ist eben etwas ganz Besonderes: unser Blaues Gut.
Was Sie hier finden
Auf dieser Internetseite haben wir einige Themen rund um unsere Gewässer für Sie zusammengestellt: Wir zeigen Ihnen, was wir machen, um sie zu verbessern. Außerdem geben wir Ihnen Tipps, wie und wo Sie unsere heimischen Gewässer selbst erleben können – egal, ob zu Fuß oder mit dem Rad, ob Sie sich für Wassersport interessieren oder die Kinder im Schlepptau haben. Politischen Entscheidern geben wir Hilfestellung, wie Sie selbst Maßnahmen in Ihrer Gemeinde oder in Ihrer Stadt erfolgreich realisieren können. Klicken Sie rein und entdecken Sie die Welt von Blaues Gut!
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 layoutService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
4<#assign namespace = randomNamespace />
5<#assign AltText = "" />
6<#assign Copyright = "" />
7
8<#if AltTextImage?? && AltTextImage.getData()?has_content>
9 <#assign AltText = AltTextImage.data />
10</#if>
11
12<#assign AltText = common.getAltText(ImageLarge.data, AltText) />
13<#if (Button.ButtonStyle?? && Button.ButtonStyle.getData()?has_content)>
14 <#assign ButtonMarkup = common.getButtonMarkup(Button.ButtonInternalLink, Button.ButtonExternalLink, Button.ButtonText, Button.ButtonStyle.getData()) />
15 <#else>
16 <#assign ButtonMarkup = common.getButtonMarkup(Button.ButtonInternalLink, Button.ButtonExternalLink, Button.ButtonText) />
17</#if>
18
19<#if ImageLarge?? && ImageLarge.data?has_content && (common.getCopyrightText(ImageLarge.data)!"") != "">
20 <#assign Copyright = common.getCopyrightTag("",ImageLarge.data) />
21</#if>
22
23
24<section class="teaser">
25 <div class="colorable-bg">
26 <div class="container">
27 <div class="row justify-content-center">
28 <div class="col-md-6">
29 <section class="teaser__content">
30 <section class="image-large image-large--centered" id="image-large_${namespace}">
31 <div class="image-inner image-with-caption">
32 <#if SVG?? && SVG.getData()?has_content>
33 <div class="slide-content-image no-border svg-image">
34 ${SVG.getData()}
35 </div>
36 <#else>
37 <#if ImageLarge?? && ImageLarge.getData()?has_content>
38 <img src="${common.getScaledImageURL(ImageLarge.getData(), "bg-image-medium")}" alt="${common.getAltText(ImageLarge.data)}" class="image" loading="lazy"/>
39 ${Copyright}
40 </#if>
41 </#if>
42 </div>
43 </section>
44 <h2>${Headline.getData()}</h2>
45 <#if Text?? && Text.getData()?has_content>
46 <p class="teaser-text">
47 ${Text.getData()}
48 </p>
49 </#if>
50 <#if Button.ButtonInternalLink.getData()?has_content || Button.ButtonExternalLink.getData()?has_content>
51 <div class="button-area">
52 ${ButtonMarkup}
53 </div>
54 </#if>
55 </section>
56 </div>
57 </div>
58 </div>
59 </div>
60
61</section>
Erst mal die „trockene“ Theorie: Die europäische Wasserrahmenrichtlinie (WRRL)
Interessieren Sie sich für die größeren Zusammenhänge? Wollen Sie wissen, ob es auch über Baden-Württemberg hinaus ähnliche Initiativen gibt und woher unser Verständnis von einem „guten Zustand“ der Gewässer überhaupt kommt? Dann sind Sie hier richtig: Auf der Seite „Grundlagen“ bekommen Sie kurz und verständlich die zentralen Informationen zur europäischen Wasserrahmenrichtlinie (WRRL).
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 blog-slider" id="slider_${namespace}">
55 <h2 class="headline">Die frischesten Entwicklungen: Der News-Bereich</h2>
56
57 <p>Sie wollen wissen, was sich gerade jetzt rund ums Thema Gewässer in Baden-Württemberg tut? Dann bleiben Sie immer auf dem aktuellen Pegelstand und klicken Sie sich durch zu den News.</p>
58
59 <div class="slides-wrapper">
60
61 <div class="slides-list">
62
63 <#list entries as curEntry>
64
65
66 <#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContent()) />
67 <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, curEntry) />
68 <#assign renderer= curEntry.getAssetRenderer()/>
69
70 <#if assetLinkBehavior != "showFullContent">
71 <#assign viewURL = renderer.getURLViewInContext(renderRequest, renderResponse, viewURL) />
72 </#if>
73
74
75
76 <#assign
77 linkTarget = ""
78 linkHref= viewURL
79 headline = docXml.valueOf("//dynamic-element[@name='HeadlineArticle']/dynamic-content/text()")
80 imgUrlExisting = docXml.valueOf("//dynamic-element[@name='ExistingSlider']//dynamic-element[@name='Image']/dynamic-content/text()")
81 imgUrlNew = docXml.valueOf("//dynamic-element[@name='NeuerSlider']//dynamic-element[@name='Image']/dynamic-content/text()")
82 imgLarge = docXml.valueOf("//dynamic-element[@name='ImageLarge']/dynamic-content/text()")
83 imgUrl = ""
84 altText = ""
85 Copyright = ""
86 />
87
88 <#if imgUrlNew!="">
89 <#assign
90 imgUrl = getDownloadLink(imgUrlNew) + "&imageThumbnail=1"
91 altText = common.getAltText(imgUrlNew)
92 Copyright = common.getCopyrightTag("",imgUrlNew)
93 />
94
95 <#elseif imgUrlExisting!="">
96 <#assign
97 imgUrl = getDownloadLink(imgUrlExisting) + "&imageThumbnail=1"
98 altText = common.getAltText(imgUrlExisting)
99 Copyright = common.getCopyrightTag("",imgUrlExisting)
100 />
101 <#elseif imgLarge!="">
102 <#assign
103 imgUrl = getDownloadLink(imgLarge) + "&imageThumbnail=1"
104 altText = common.getAltText(imgLarge)
105 Copyright = common.getCopyrightTag("",imgLarge)
106 />
107 </#if>
108
109 <div class="slide" role="group" aria-label="Folie ${curEntry?index + 1} von ${entries?size}">
110 <div class="slide-content">
111 <div class="slide-content-image image-with-caption">
112 <a href="${linkHref}" ${linkTarget}>
113 <#if imgUrl!="">
114 <img src="${common.getScaledImageURL(imgUrl, "bg-image-h600")}"
115 data-src="${common.getScaledImageURL(imgUrl, "bg-image-h600")}"
116 class="slide__image" alt="${altText}"
117 width="600" height="400"
118 loading="lazy"
119 />
120 <#else>
121 <img src="/o/blaues-gut-theme/images/no-image_blaues-gut.png" data-src="/o/blaues-gut-theme/images/logo_bg_mobile.svg"
122 class="slide__image no-image" alt=""/>
123 </#if>
124 </a>
125 ${Copyright}
126 </div>
127
128 <h3 class="title">
129 <a href="${linkHref}" ${linkTarget} title="${headline}" class="no-icon">${headline}</a>
130 </h3>
131 </div>
132 </div>
133 </#list>
134 </div>
135 </div>
136 </section>
137
138 <script>
139 window.addEventListener("load", function () {
140 function ${namespace}_updateInfo(info) {
141 if (info.navItems) {
142 for (var i = 0; i < info.navItems.length; i++) {
143 info.navItems[i].setAttribute('aria-label', 'Folie ' + (i + 1));
144 }
145
146 info.navItems[info.navCurrentIndex].setAttribute('aria-label', 'Folie ' + (info.navCurrentIndex + 1) + ' (aktuell)');
147 }
148
149 if (info.controlsContainer) {
150 info.controlsContainer.setAttribute('aria-label', 'Navigationselemente');
151 }
152 if (info.prevButton) {
153 info.prevButton.setAttribute('aria-label', 'zur vorhergehenden Folie springen');
154 }
155 if (info.nextButton) {
156 info.nextButton.setAttribute('aria-label', 'zur nächsten Folie springen');
157 }
158 if (info.navContainer) {
159 info.navContainer.setAttribute('aria-label', 'Auswahl der Folien')
160 }
161 }
162
163 var slider = tns({
164 container: '#slider_${namespace} .slides-list',
165 items: 2,
166 slideBy: 'page',
167 lazyload: true,
168 lazyloadSelector: '.slide__image',
169 loop: false,
170 // center: true,
171 controlsPosition: 'bottom',
172 controls: false,
173 navPosition: 'bottom',
174 touch: true,
175 mouseDrag: true,
176 freezable: true,
177 speed: 600,
178 arrowKeys: true,
179 controlsText: ['<span class="icon-bg icon-bg--arrow2-left"></span>', '<span class="icon-bg icon-bg--arrow2-right"></span>'],
180 responsive: {
181 768: {
182 items: 2,
183 edgePadding: 0,
184 gutter: 0
185 },
186 900: {
187 items: 3,
188 edgePadding: 0,
189 controls: true
190 },
191 1280: {
192 items: 3,
193 controls: true
194 },
195 1600: {
196 controls: true,
197 items: 3
198 }
199 },
200 onInit: function (info) {
201 ${namespace}_updateInfo(info);
202 }
203 });
204 slider.events.on('indexChanged', function(info) {
205 ${namespace}_updateInfo(info);
206 });
207 });
208 </script>
209</#if>