Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception ---- FTL stack trace ("~" means nesting-related): - Failed at: @ait_contentreplacer["replace-content"] [in template "20116#20152#34027" at line 5, column 1] ----
1<#assign
2 ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"]
3>
4
5<@ait_contentreplacer["replace-content"]>
6
7 <#assign
8 accordionId = "accordion_" + themeDisplay.getPortletDisplay().getInstanceId()
9 />
10
11 <#-- Rendering -->
12 <#if !entries?has_content>
13 <#if !themeDisplay.isSignedIn()>
14 ${renderRequest.setAttribute("PORTLET_CONFIGURATOR_VISIBILITY", true)}
15 </#if>
16
17 <div class="alert alert-info">
18 <@liferay_ui["message"] key="no-entries-were-found" />
19 </div>
20 <#else>
21 <div class="faq-list" id="${accordionId}" role="tablist" aria-multiselectable="true">
22 <#list entries as entry>
23 <#assign
24 assetRenderer = entry.getAssetRenderer()
25
26 entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale))
27
28 entryClassName = assetRenderer.getClassName()
29 >
30
31 <#if entryClassName == "com.liferay.journal.model.JournalArticle">
32 <#assign
33 journalArticle = assetRenderer.getArticle()
34
35 document = saxReaderUtil.read(journalArticle.getContent())
36 rootElement = document.getRootElement()
37
38 faqId = accordionId + "_" + entry?index
39
40 heading = ""
41 content = ""
42 >
43
44 <#list rootElement.elements() as dynamicElement>
45 <#switch dynamicElement.attributeValue("name")>
46 <#case "Heading">
47 <#assign heading = dynamicElement.element("dynamic-content").getText()>
48 <#break>
49 <#case "Content">
50 <#assign content = dynamicElement.element("dynamic-content").getText()>
51 <#break>
52 </#switch>
53 </#list>
54
55 <div class="faq-item">
56 <div class="lfr-portal-asset-edit-tooltip">
57 <@getEditIcon />
58 </div>
59 <div class="faq-item-header" role="tab" id="${faqId}_question">
60 <a role="button"
61 data-toggle="liferay-collapse"
62 data-parent="#${accordionId}"
63 href="#${faqId}_answer"
64 aria-expanded="false"
65 aria-controls="${faqId}_answer"
66 class="collapsed"
67 >
68 <span class="faq-title-text">${heading}</span>
69 <span class="faq-toggle-icon">
70 <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon">
71 <use xlink:href="#icon_arrow_alt_down" />
72 </svg>
73 </span>
74 </a>
75 </div>
76 <div id="${faqId}_answer" class="collapse" role="tabpanel" aria-labelledby="${faqId}_question">
77 <div class="faq-item-body content-block-content">
78 ${content}
79 </div>
80 </div>
81 </div>
82 <#else>
83 <#if themeDisplay.isSignedIn()>
84 <div class="alert alert-warning">
85 <@liferay_ui["message"] key="asset-type" /> <@liferay_ui["message"] key="not-supported" />
86 </div>
87 </#if>
88 </#if>
89 </#list>
90 </div>
91 </#if>
92
93 <#macro getEditIcon>
94 <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())>
95 <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("NORMAL"), themeDisplay.getURLCurrent())!"" />
96
97 <#if validator.isNotNull(editPortletURL)>
98 <#assign title = languageUtil.format(locale, "edit-x", entryTitle, false) />
99
100 <@liferay_ui["icon"]
101 cssClass="icon-monospaced visible-interaction"
102 icon="pencil"
103 markupView="lexicon"
104 message=title
105 url=editPortletURL.toString()
106 />
107 </#if>
108 </#if>
109 </#macro>
110
111</@>
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception ---- FTL stack trace ("~" means nesting-related): - Failed at: @ait_contentreplacer["replace-content"] [in template "20116#20152#34027" at line 5, column 1] ----
1<#assign
2 ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"]
3>
4
5<@ait_contentreplacer["replace-content"]>
6
7 <#assign
8 accordionId = "accordion_" + themeDisplay.getPortletDisplay().getInstanceId()
9 />
10
11 <#-- Rendering -->
12 <#if !entries?has_content>
13 <#if !themeDisplay.isSignedIn()>
14 ${renderRequest.setAttribute("PORTLET_CONFIGURATOR_VISIBILITY", true)}
15 </#if>
16
17 <div class="alert alert-info">
18 <@liferay_ui["message"] key="no-entries-were-found" />
19 </div>
20 <#else>
21 <div class="faq-list" id="${accordionId}" role="tablist" aria-multiselectable="true">
22 <#list entries as entry>
23 <#assign
24 assetRenderer = entry.getAssetRenderer()
25
26 entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale))
27
28 entryClassName = assetRenderer.getClassName()
29 >
30
31 <#if entryClassName == "com.liferay.journal.model.JournalArticle">
32 <#assign
33 journalArticle = assetRenderer.getArticle()
34
35 document = saxReaderUtil.read(journalArticle.getContent())
36 rootElement = document.getRootElement()
37
38 faqId = accordionId + "_" + entry?index
39
40 heading = ""
41 content = ""
42 >
43
44 <#list rootElement.elements() as dynamicElement>
45 <#switch dynamicElement.attributeValue("name")>
46 <#case "Heading">
47 <#assign heading = dynamicElement.element("dynamic-content").getText()>
48 <#break>
49 <#case "Content">
50 <#assign content = dynamicElement.element("dynamic-content").getText()>
51 <#break>
52 </#switch>
53 </#list>
54
55 <div class="faq-item">
56 <div class="lfr-portal-asset-edit-tooltip">
57 <@getEditIcon />
58 </div>
59 <div class="faq-item-header" role="tab" id="${faqId}_question">
60 <a role="button"
61 data-toggle="liferay-collapse"
62 data-parent="#${accordionId}"
63 href="#${faqId}_answer"
64 aria-expanded="false"
65 aria-controls="${faqId}_answer"
66 class="collapsed"
67 >
68 <span class="faq-title-text">${heading}</span>
69 <span class="faq-toggle-icon">
70 <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon">
71 <use xlink:href="#icon_arrow_alt_down" />
72 </svg>
73 </span>
74 </a>
75 </div>
76 <div id="${faqId}_answer" class="collapse" role="tabpanel" aria-labelledby="${faqId}_question">
77 <div class="faq-item-body content-block-content">
78 ${content}
79 </div>
80 </div>
81 </div>
82 <#else>
83 <#if themeDisplay.isSignedIn()>
84 <div class="alert alert-warning">
85 <@liferay_ui["message"] key="asset-type" /> <@liferay_ui["message"] key="not-supported" />
86 </div>
87 </#if>
88 </#if>
89 </#list>
90 </div>
91 </#if>
92
93 <#macro getEditIcon>
94 <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())>
95 <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("NORMAL"), themeDisplay.getURLCurrent())!"" />
96
97 <#if validator.isNotNull(editPortletURL)>
98 <#assign title = languageUtil.format(locale, "edit-x", entryTitle, false) />
99
100 <@liferay_ui["icon"]
101 cssClass="icon-monospaced visible-interaction"
102 icon="pencil"
103 markupView="lexicon"
104 message=title
105 url=editPortletURL.toString()
106 />
107 </#if>
108 </#if>
109 </#macro>
110
111</@>
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception ---- FTL stack trace ("~" means nesting-related): - Failed at: @ait_contentreplacer["replace-content"] [in template "20116#20152#34027" at line 5, column 1] ----
1<#assign
2 ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"]
3>
4
5<@ait_contentreplacer["replace-content"]>
6
7 <#assign
8 accordionId = "accordion_" + themeDisplay.getPortletDisplay().getInstanceId()
9 />
10
11 <#-- Rendering -->
12 <#if !entries?has_content>
13 <#if !themeDisplay.isSignedIn()>
14 ${renderRequest.setAttribute("PORTLET_CONFIGURATOR_VISIBILITY", true)}
15 </#if>
16
17 <div class="alert alert-info">
18 <@liferay_ui["message"] key="no-entries-were-found" />
19 </div>
20 <#else>
21 <div class="faq-list" id="${accordionId}" role="tablist" aria-multiselectable="true">
22 <#list entries as entry>
23 <#assign
24 assetRenderer = entry.getAssetRenderer()
25
26 entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale))
27
28 entryClassName = assetRenderer.getClassName()
29 >
30
31 <#if entryClassName == "com.liferay.journal.model.JournalArticle">
32 <#assign
33 journalArticle = assetRenderer.getArticle()
34
35 document = saxReaderUtil.read(journalArticle.getContent())
36 rootElement = document.getRootElement()
37
38 faqId = accordionId + "_" + entry?index
39
40 heading = ""
41 content = ""
42 >
43
44 <#list rootElement.elements() as dynamicElement>
45 <#switch dynamicElement.attributeValue("name")>
46 <#case "Heading">
47 <#assign heading = dynamicElement.element("dynamic-content").getText()>
48 <#break>
49 <#case "Content">
50 <#assign content = dynamicElement.element("dynamic-content").getText()>
51 <#break>
52 </#switch>
53 </#list>
54
55 <div class="faq-item">
56 <div class="lfr-portal-asset-edit-tooltip">
57 <@getEditIcon />
58 </div>
59 <div class="faq-item-header" role="tab" id="${faqId}_question">
60 <a role="button"
61 data-toggle="liferay-collapse"
62 data-parent="#${accordionId}"
63 href="#${faqId}_answer"
64 aria-expanded="false"
65 aria-controls="${faqId}_answer"
66 class="collapsed"
67 >
68 <span class="faq-title-text">${heading}</span>
69 <span class="faq-toggle-icon">
70 <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon">
71 <use xlink:href="#icon_arrow_alt_down" />
72 </svg>
73 </span>
74 </a>
75 </div>
76 <div id="${faqId}_answer" class="collapse" role="tabpanel" aria-labelledby="${faqId}_question">
77 <div class="faq-item-body content-block-content">
78 ${content}
79 </div>
80 </div>
81 </div>
82 <#else>
83 <#if themeDisplay.isSignedIn()>
84 <div class="alert alert-warning">
85 <@liferay_ui["message"] key="asset-type" /> <@liferay_ui["message"] key="not-supported" />
86 </div>
87 </#if>
88 </#if>
89 </#list>
90 </div>
91 </#if>
92
93 <#macro getEditIcon>
94 <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())>
95 <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("NORMAL"), themeDisplay.getURLCurrent())!"" />
96
97 <#if validator.isNotNull(editPortletURL)>
98 <#assign title = languageUtil.format(locale, "edit-x", entryTitle, false) />
99
100 <@liferay_ui["icon"]
101 cssClass="icon-monospaced visible-interaction"
102 icon="pencil"
103 markupView="lexicon"
104 message=title
105 url=editPortletURL.toString()
106 />
107 </#if>
108 </#if>
109 </#macro>
110
111</@>
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception ---- FTL stack trace ("~" means nesting-related): - Failed at: @ait_contentreplacer["replace-content"] [in template "20116#20152#BKS-STANDARD-WEB-CONTENT" at line 9, column 1] ----
1<#assign
2 ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"]
3
4 DLFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService')
5 DLAppService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLAppService')
6 DLUtil = serviceLocator.findService('com.liferay.document.library.kernel.util.DLUtil')
7/>
8
9<@ait_contentreplacer["replace-content"]>
10
11 <@initMediaValues/>
12 <#assign mediaData = getMediaTypeData(Video VideoFileEntry Image) />
13
14 <#if VideoPreview??>
15 <#assign
16 videoPreview = VideoPreview
17 />
18 <#else>
19 <#assign videoPreview = '' />
20 </#if>
21
22 <#if mediaData['hasMedia']>
23 <figure class="content-media-element media-element-left ${mediaData['mediaCssClass']}">
24 <@renderMedia Video VideoFileEntry Image mediaData videoPreview/>
25
26 <#if Caption.getData()?? && Caption.getData() != "">
27 <figcaption class="media-element-caption">${Caption.getData()}</figcaption>
28 </#if>
29 </figure>
30 </#if>
31 ${content.getData()}
32
33
34 <#function getDLFileEntryAltText Image>
35 <#if Image.getAttribute("id")?? && Image.getAttribute("id") != "">
36 <#return "">
37 <#else>
38 <#assign dlFileEntry = getDLFileEntry(Image) >
39 <#return dlFileEntry.getDescription()/>
40 </#if>
41 </#function>
42
43 <#function getDLFileEntry fileEntry>
44 <#assign dlFileEntry = ''>
45 <#if fileEntry.getAttribute("fileEntryId")?? && fileEntry.getAttribute("fileEntryId") != "">
46 <#assign
47 dlFileEntry = DLFileEntryService.getFileEntry(fileEntry.getAttribute("fileEntryId")?number)
48 />
49 <#else>
50 <#assign
51 dlFileEntry = getDLFileEntryFromUrl(fileEntry.getData())
52 />
53 </#if>
54 <#return dlFileEntry>
55 </#function>
56
57 <#function getDLFileEntryFromUrl fileUrl>
58 <#assign counter = 0 >
59 <#list "${fileUrl}"?split("/") as pathSegemtent>
60 <#if counter == 2>
61 <#assign groupId = pathSegemtent?number >
62 </#if>
63 <#if counter == 5>
64 <#assign subCounter = 0 >
65 <#list "${pathSegemtent}"?split("?") as subSegemtent>
66 <#if subCounter == 0>
67 <#assign uuId = subSegemtent >
68 </#if>
69 <#assign subCounter = subCounter+1 >
70 </#list>
71 </#if>
72 <#assign counter = counter+1 >
73 </#list>
74
75 <#assign dlFileEntry = DLFileEntryService.getFileEntryByUuidAndGroupId(uuId,groupId) >
76
77 <#return dlFileEntry>
78 </#function>
79
80 <#macro initMediaValues>
81 <#-- If either one of the needed Media Types is not present create the Variable with an empty string -->
82 <#-- needed since some Articles might not have them -->
83 <#if !Video??>
84 <#assign Video = ''/>
85 </#if>
86 <#if !VideoFiles??>
87 <#assign VideoFileEntry = ''/>
88 <#else>
89 <#assign
90 VideoFileEntry = VideoFiles.VideoFileEntry
91 />
92 </#if>
93 <#if !Image??>
94 <#assign Image = ''/>
95 </#if>
96 </#macro>
97
98 <#macro renderYoutubeVideo videoId>
99 <iframe
100 data-name="youtube"
101 data-src="https://www.youtube-nocookie.com/embed/${videoId}?color=white&controls=2&hl=${locale.getLanguage()}&iv_load_policy=3&modestbranding=1&rel=0&showinfo=0"
102 frameborder="0"
103 allow="autoplay; encrypted-media"
104 allowfullscreen
105 ></iframe>
106 </#macro>
107
108 <#macro renderVideoPlayer videoFiles videoPreview videoPlayerId=randomNamespace>
109 <#assign
110 previewImage = ''
111
112 theme_path = themeDisplay.getPathThemeCss()
113
114 videojsCssPath = theme_path + '/theme/video-js/video-js.min.css'
115 />
116
117 <#if !videoPreview?is_string >
118 <#if videoPreview.getData()?? && videoPreview.getData() != ''>
119 <#assign
120 previewImage = videoPreview.getData()
121 />
122 </#if>
123 </#if>
124
125 <video id="media_teaser_video_${videoPlayerId}" class="video-js vjs-fluid vjs-big-play-centered video-js-bks">
126 <#list videoFiles.getSiblings() as videoFile>
127 <#if videoFile.getData()?? && videoFile.getData() != ''>
128 <#assign
129 videoFileEntry = getFileEntryFromUrl(videoFile.getData())
130 mimeType = videoFileEntry.getMimeType()
131 />
132 <#if previewImage == ''>
133 <#assign
134 previewImage = DLUtil.getImagePreviewURL(videoFileEntry, videoFileEntry.getFileVersion(), themeDisplay)
135 />
136 </#if>
137 <source src="${videoFile.getData()}" type="${mimeType}">
138 </#if>
139 </#list>
140 <p class="vjs-no-js">Um dieses Video anzusehen, aktivieren Sie bitte JavaScript, und verwenden Sie einen Browser der <a href="http://videojs.com/html5-video-support/" target="_blank">Videos im HTML5 Standard unterstützt.</a></p>
141 </video>
142
143 <script>
144 Liferay.Loader.require([
145 "bks-main-theme-js-modules@2.0.0/video-js/video.min"
146 ],
147 function(videojs) {
148 var allCssElements=document.getElementsByTagName("link");
149 var cssAlreadyExists = false;
150
151 for (var i=allCssElements.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove
152 if (allCssElements[i] && allCssElements[i].getAttribute("href")!=null && allCssElements[i].getAttribute("href").indexOf("${videojsCssPath}")!=-1){
153 cssAlreadyExists = true;
154 }
155 }
156
157 if (!cssAlreadyExists) {
158 var newCssFile=document.createElement("link");
159 newCssFile.setAttribute("rel", "stylesheet");
160 newCssFile.setAttribute("type", "text/css");
161 newCssFile.setAttribute("href", "${videojsCssPath}");
162
163 document.getElementsByTagName('head')[0].appendChild(newCssFile);
164 }
165
166 videojs('media_teaser_video_${videoPlayerId}', {
167 controls: true,
168 autoplay: false,
169 preload: 'auto',
170 aspectRatio: "16:9",
171 fluid: 1,
172 language: "${locale.getLanguage()}",
173 poster: "${previewImage}"
174 });
175
176 Liferay.on('startNavigate', function() {
177 videojs('media_teaser_video_${videoPlayerId}').dispose();
178 });
179 },
180 function(error) {
181 console.error(error);
182 }
183 );
184 </script>
185 </#macro>
186
187 <#-- Get FileEntry NOT DlFileEntry!!! -->
188 <#function getFileEntryFromUrl fileUrl>
189 <#assign counter = 0 >
190 <#list "${fileUrl}"?split("/") as pathSegemtent>
191 <#if counter == 2>
192 <#assign groupId = pathSegemtent?number >
193 </#if>
194 <#if counter == 5>
195 <#assign subCounter = 0 >
196 <#list "${pathSegemtent}"?split("?") as subSegemtent>
197 <#if subCounter == 0>
198 <#assign uuId = subSegemtent >
199 </#if>
200 <#assign subCounter = subCounter+1 >
201 </#list>
202 </#if>
203 <#assign counter = counter+1 >
204 </#list>
205
206 <#assign fileEntry = DLAppService.getFileEntryByUuidAndGroupId(uuId,groupId) >
207
208 <#return fileEntry>
209 </#function>
210
211 <#function getYoutubeIdFromUrl url>
212 <#assign pathSegments = "${url}"?split("/") >
213 <#return pathSegments?last>
214 </#function>
215
216 <#function getMediaTypeData Video VideoFileEntries Image>
217 <#assign
218 mediaTypeData = {
219 "hasMedia" : false,
220 "mediaType" : "",
221 "mediaCssClass" : ""
222 }
223 />
224 <#if Video?? && Video?has_content && Video.getData()?contains("youtube") || Video.getData()?contains("youtu.be")>
225 <#assign
226 mediaTypeData = {
227 "hasMedia" : true,
228 "mediaType" : "youtube",
229 "mediaCssClass" : "media-element-fixed-width"
230 }
231 />
232 <#elseif VideoFileEntries?? && VideoFileEntries?has_content && VideoFileEntries.getSiblings()?has_content>
233 <#list VideoFileEntries.getSiblings() as videoFileEntryItem>
234 <#if videoFileEntryItem.getData()?? && videoFileEntryItem.getData() != ''>
235 <#assign
236 mediaTypeData = {
237 "hasMedia" : true,
238 "mediaType" : "videofile",
239 "mediaCssClass" : "media-element-fixed-width"
240 }
241 />
242 </#if>
243 </#list>
244 </#if>
245 <#if !mediaTypeData['hasMedia'] && Image?? && Image?has_content && Image.getData()?? && Image.getData() != "">
246 <#assign
247 mediaTypeData = {
248 "hasMedia" : true,
249 "mediaType" : "image",
250 "mediaCssClass" : ""
251 }
252 />
253 </#if>
254 <#return mediaTypeData/>
255 </#function>
256
257 <#macro renderMedia Video VideoFileEntries Image mediaTypeData VideoPreview mediaId=randomNamespace>
258 <#switch mediaTypeData['mediaType']>
259 <#case 'youtube'>
260 <#assign youtubeId = getYoutubeIdFromUrl(Video.getData()) />
261 <div class="aspect-ratio aspect-ratio-16-to-9">
262 <@renderYoutubeVideo youtubeId/>
263 </div>
264 <#break>
265 <#case 'videofile'>
266 <@renderVideoPlayer VideoFileEntries VideoPreview mediaId/>
267 <#break>
268 <#case 'image'>
269 <#assign
270 altText = Image.getAttribute("alt")
271 />
272 <#if !Image.getAttribute("alt")?? || Image.getAttribute("alt") == "">
273 <#assign
274 altText = getDLFileEntryAltText(Image)
275 />
276 </#if>
277 <img data-fileentryid="${Image.getAttribute("fileEntryId")}" alt="${altText}" src="${Image.getData()}" />
278 <#break>
279 </#switch>
280 </#macro>
281
282</@>
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception ---- FTL stack trace ("~" means nesting-related): - Failed at: @ait_contentreplacer["replace-content"] [in template "20116#20152#BKS-INDEXBOX-AT" at line 7, column 1] ----
1<#assign
2 ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"]
3
4 DLFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService')
5/>
6
7<@ait_contentreplacer["replace-content"]>
8
9 <#assign
10 linkUrl = ''
11 linkTitle = languageUtil.format(locale, "go-to-x", htmlUtil.stripHtml(htmlUtil.extractText(Heading.getData())), false)
12 linkParams = ''
13 linkText = languageUtil.get(locale, "bks-default-link-text")
14 />
15
16 <#if Link.LinkInternal.getData()?? && Link.LinkInternal.getData() != "">
17 <#assign linkUrl = Link.LinkInternal.getFriendlyUrl()/>
18 <#elseif Link.DocumentInternal.getData()?? && Link.DocumentInternal.getData() != "">
19 <#assign linkUrl = Link.DocumentInternal.getData()/>
20 <#assign linkParams = 'target="_blank" rel="external"'/>
21 <#elseif Link.LinkExternal.getData()?? && Link.LinkExternal.getData() != "">
22 <#assign linkUrl = Link.LinkExternal.getData()/>
23 <#assign linkParams = 'target="_blank" rel="external"'/>
24 </#if>
25 <#if Link.LinkText?? && Link.LinkText.getData()?? && Link.LinkText.getData() != "">
26 <#assign linkText = Link.LinkText.getData()/>
27 </#if>
28
29
30 <div class="card card-index">
31 <div class="card-index-content">
32 <#if Image.getData()?? && Image.getData() != "">
33 <#assign
34 altText = Image.getAttribute("alt")
35 />
36 <#if !Image.getAttribute("alt")?? || Image.getAttribute("alt") == "">
37 <#assign
38 altText = getDLFileEntryAltText(Image)
39 />
40 </#if>
41 <div class="card-index-image aspect-ratio">
42 <img class="aspect-ratio-item aspect-ratio-item-top-center" data-fileentryid="${Image.getAttribute("fileEntryId")}" alt="${altText}" src="${Image.getData()}" />
43 </div>
44 </#if>
45
46 <#if Heading.getType() != "text">
47 ${Heading.getData()}
48 <#else>
49 <h2>${Heading.getData()}</h2>
50 </#if>
51 <p>${Content.getData()}</p>
52 </div>
53 <#if linkUrl != "">
54 <div class="card-index-footer">
55 <a class="btn btn-secondary" href="${linkUrl}" title="${linkTitle}" ${linkParams}>${linkText} <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon icon-btn-right"><use xlink:href="#icn_arrow-right" /></svg></a>
56 </div>
57 </#if>
58 </div>
59
60 <#function getDLFileEntryAltText Image>
61 <#if Image.getAttribute("id")?? && Image.getAttribute("id") != "">
62 <#return "">
63 <#else>
64 <#assign dlFileEntry = getDLFileEntry(Image) >
65 <#return dlFileEntry.getDescription()/>
66 </#if>
67 </#function>
68
69 <#function getDLFileEntry fileEntry>
70 <#assign dlFileEntry = ''>
71 <#if fileEntry.getAttribute("fileEntryId")?? && fileEntry.getAttribute("fileEntryId") != "">
72 <#assign
73 dlFileEntry = DLFileEntryService.getFileEntry(fileEntry.getAttribute("fileEntryId")?number)
74 />
75 <#else>
76 <#assign
77 dlFileEntry = getDLFileEntryFromUrl(fileEntry.getData())
78 />
79 </#if>
80 <#return dlFileEntry>
81 </#function>
82
83 <#function getDLFileEntryFromUrl fileUrl>
84 <#assign counter = 0 >
85 <#list "${fileUrl}"?split("/") as pathSegemtent>
86 <#if counter == 2>
87 <#assign groupId = pathSegemtent?number >
88 </#if>
89 <#if counter == 5>
90 <#assign subCounter = 0 >
91 <#list "${pathSegemtent}"?split("?") as subSegemtent>
92 <#if subCounter == 0>
93 <#assign uuId = subSegemtent >
94 </#if>
95 <#assign subCounter = subCounter+1 >
96 </#list>
97 </#if>
98 <#assign counter = counter+1 >
99 </#list>
100
101 <#assign dlFileEntry = DLFileEntryService.getFileEntryByUuidAndGroupId(uuId,groupId) >
102
103 <#return dlFileEntry>
104 </#function>
105
106</@>