An error occurred while processing the template.
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"> 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-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}" loading="lazy" /> 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 <#assign assetCategories = assetCategoryLocalService.getAssetEntryAssetCategories(curEntry.entryId) /> 122 <#if assetCategories?? && assetCategories?size gt 0> 123 <ul class="tags"> 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 </#if> 139 <h3 class="title"><a href="${linkHref}" ${linkTarget}>${headline}</a></h3> 140 </div> 141 </div> 142 </#list> 143 </div> 144 </div> 145 </section> 146 147 <script> 148 window.addEventListener("load", function () { 149 function ${namespace}_updateInfo(info) { 150 if (info.navItems) { 151 for (var i = 0; i < info.navItems.length; i++) { 152 info.navItems[i].setAttribute('aria-label', 'Folie ' + (i + 1)); 153 } 154 155 info.navItems[info.navCurrentIndex].setAttribute('aria-label', 'Folie ' + (info.navCurrentIndex + 1) + ' (aktuell)'); 156 } 157 158 if (info.controlsContainer) { 159 info.controlsContainer.setAttribute('aria-label', 'Navigationselemente'); 160 } 161 if (info.prevButton) { 162 info.prevButton.setAttribute('aria-label', 'zur vorhergehenden Folie springen'); 163 } 164 if (info.nextButton) { 165 info.nextButton.setAttribute('aria-label', 'zur nächsten Folie springen'); 166 } 167 if (info.navContainer) { 168 info.navContainer.setAttribute('aria-label', 'Auswahl der Folien') 169 } 170 } 171 172 var slider = tns({ 173 container: '#slider_${namespace} .slides-list', 174 items: 1.5, 175 slideBy: 'page', 176 lazyload: true, 177 lazyloadSelector: '.slide__image', 178 loop: false, 179 controls: false, 180 nav: false, 181 controlsPosition: 'bottom', 182 navPosition: 'bottom', 183 touch: true, 184 mouseDrag: true, 185 freezable: true, 186 speed: 600, 187 arrowKeys: true, 188 edgePadding: 16, 189 fixedWidth: 300, 190 // viewportMax: 1600, 191 controlsText: ['<span class="icon-bg icon-bg--arrow2-left"></span>', '<span class="icon-bg icon-bg--arrow2-right"></span>'], 192 responsive: { 193 768: { 194 items: 1.5, 195 edgePadding: 0, 196 gutter: 0 197 }, 198 900: { 199 items: 3, 200 edgePadding: 0 201 }, 202 1280: { 203 items: 4, 204 controls: true 205 }, 206 1600: { 207 controls: true, 208 items: 5 209 } 210 }, 211 onInit: function (info) { 212 ${namespace}_updateInfo(info); 213 } 214 }); 215 slider.events.on('indexChanged', function(info) { 216 ${namespace}_updateInfo(info); 217 }); 218 }); 219 </script> 220</#if> 