08.11.2026 | Skiverband Berlin/SG Einheit Berliner Bär e.V. Abt. Ski | Kienbaum
Status: Noch offen
33. Berliner Rollski Kienbaum 2026
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
Can't convert this string to number: "12,50"
The blamed expression:
==> raceFee.getData()?number [in template "20097#20123#RACE_DETAIL_TEMPLATE" at line 178, column 42]
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${raceFee.getData()?has_content?then(... [in template "20097#20123#RACE_DETAIL_TEMPLATE" at line 178, column 5]
----
1<#function getIcon(discipline, raceEventName, raceTypeName)>
2 <#assign iconName>
3 <#switch discipline>
4 <#case 'Alpin'>
5 <#switch raceTypeName>
6 <#case 'Wettkämpfe Freestyle'>
7 dsv-icon-skicross1
8 <#break>
9 <#default>
10 dsv-icon-ski-alpin1
11 </#switch>
12 <#break>
13 <#case 'Biathlon'>
14 dsv-icon-biathlon1
15 <#break>
16 <#case 'Freeski'>
17 dsv-icon-freestyle1
18 <#break>
19 <#case 'Langlauf'>
20 dsv-icon-langlauf1
21 <#break>
22 <#case 'NoKo-Sprung'>
23 <#switch raceEventName>
24 <#case 'Skisprung'>
25 dsv-icon-skisprung1
26 <#break>
27 <#default>
28 dsv-icon-nordische-kombination1
29 </#switch>
30 <#break>
31 <#case 'Skisprung'>
32 dsv-icon-skisprung1
33 <#break>
34 <#default>
35 dsv-icon-general
36 </#switch>
37 </#assign>
38 <#return iconName>
39</#function>
40
41<#function getRaceEventNameShort (discipline, raceEventName) >
42 <#assign raceEventNameShort>
43 <#switch discipline>
44 <#case "Alpin">
45 <#switch raceEventName>
46 <#case "Slalom">
47 SL
48 <#break>
49 <#case "Riesenslalom">
50 RS
51 <#break>
52 <#case "Giant Slalom">
53 GS
54 <#break>
55 <#case "Super G">
56 <#case "Super-G">
57 SG
58 <#break>
59 <#case "Abfahrt">
60 AF
61 <#break>
62 <#case "Downhill">
63 DH
64 <#break>
65 <#case "Super-Combi">
66 SC
67 <#break>
68 <#case "Kids-Cross">
69 KC
70 <#break>
71 <#case "Alpine Combined">
72 AC
73 <#break>
74 <#case "Parallelslalom">
75 PS
76 <#break>
77 <#case "Team Parallelslalom">
78 <#case "Team Parallel">
79 TP
80 <#break>
81 <#case "Parallel-Riesenslalom">
82 PR
83 <#break>
84 <#case "Team Parallelslalom-RS">
85 TRS
86 <#break>
87 <#default>
88 AL
89 </#switch>
90 <#break>
91 <#case "Biathlon">
92 <#switch raceEventName>
93 <#case "Ski-Freistil">
94 SF
95 <#break>
96 <#case "Ski-Klassisch">
97 SK
98 <#break>
99 <#case "Roller-Freistil">
100 RF
101 <#break>
102 <#case "Roller-Klassisch">
103 RK
104 <#break>
105 <#case "Schießen">
106 SC
107 <#break>
108 <#case "Cross">
109 CX
110 <#break>
111 <#default>
112 BIA
113 </#switch>
114 <#break>
115 <#case "Skisprung">
116 <#switch raceEventName>
117 <#case "Ski-Freistil">
118 SF
119 <#break>
120 <#default>
121 SP
122 </#switch>
123 <#break>
124 <#case "Nordische Kombination">
125 NK
126 <#break>
127 <#case "Skilanglauf">
128 <#switch raceEventName>
129 <#case "Ski">
130 SKI
131 <#break>
132 <#case "Roller">
133 RL
134 <#break>
135 <#case "Cross">
136 CX
137 <#break>
138 <#default>
139 SLL
140 </#switch>
141 <#break>
142 <#case "Skicross">
143 SX
144 <#break>
145 <#case "Freeski">
146 FR
147 <#break>
148 <#default>
149 </#switch>
150 </#assign>
151
152 <#return raceEventNameShort?trim >
153</#function >
154
155<#assign
156icon = ''
157parsedStartDate = ''
158dateTimeAppEnd = raceRegistrationDeadline.getData()
159dateTimeAppEndData = ''
160raceEventNameShort = getRaceEventNameShort(discipline.getData(), raceEventName.getData())
161icon = getIcon(discipline.getData(), raceEventName.getData(), raceTypeName.getData())
162isPastRace = true
163/>
164
165<#if raceDate.getData()?has_content>
166 <#assign
167 startDate_DateObj = dateUtil.parseDate("yyyy-MM-dd", raceDate.getData(), locale)
168 isPastRace = startDate_DateObj?datetime < .now
169 parsedStartDate = dateUtil.getDate(startDate_DateObj, "dd.MM.yyyy", locale) />
170</#if>
171<#if dateTimeAppEnd?has_content && dateTimeAppEnd != "null">
172 <#assign dateTimeAppEndData = dateTimeAppEnd?datetime("yyyy-MM-dd HH:mm")?string("dd.MM.yyyy / HH:mm") />
173</#if>
174
175<#assign raceFee>
176 <#assign originalLocale = .locale>
177 <#setting locale="de_DE">
178 ${raceFee.getData()?has_content?then(raceFee.getData()?number?string.currency,'0,00 €')}
179 <#setting locale=originalLocale>
180</#assign>
181
182<#assign raceStatus>
183 <#if raceStatusName.getData()?has_content>
184 <#assign statusKey="dsv.race.event.status."+ raceStatusName.getData() />
185 <#assign status><@liferay.language key=statusKey /></#assign>
186 <#if statusKey != status>
187 <@liferay.language_format key="dsv.race.event.status" arguments=status/>
188 </#if>
189 </#if>
190</#assign>
191
192<#--<#assign raceRegistration>-->
193<#-- <#if raceExternalRegistration.getData()?has_content && raceExternalRegistration.getData() == "1">-->
194<#-- <@liferay.language key="dsv.race.event.registration.external" />-->
195<#-- <#else>-->
196<#-- <@liferay.language key="dsv.race.event.registration.dsv" />-->
197<#-- </#if>-->
198<#--</#assign>-->
199
200<div class="dynamic-view-block date-item date-${parsedStartDate}">
201 <div class="dsv-accordion">
202 <div class="dsv-accordion__header align-items-center px-4 ${isPastRace?then('dsv-accordion__header--grey', '')}">
203 <div class="w-100">
204 <div class="d-flex flex-row flex-wrap justify-content-between">
205 <p class="text-capitalize text-3">
206 ${parsedStartDate}
207 | <#if raceHost.getData()?has_content && raceHost.getData() != 'null'>${raceHost.getData()} | </#if>
208 ${raceLocation.getData()}
209 </p>
210
211 <#if raceStatus?has_content>
212 <p class="text-capitalize text-3">${raceStatus}</p>
213 </#if>
214 </div>
215 <div class="d-flex flex-row justify-content-between">
216 <div class="d-flex flex-row pt-3 align-items-xl-center">
217 <div class="dsv-icon ${icon} dsv-icon--red dsv-icon--32 align-self-center"></div>
218 <div class="d-flex flex-column">
219 <p class="dsv-text--lg pl-3 text-weight-bold">${raceName.getData()} ${raceCode.getData()?has_content?then('(' + raceCode.getData() + ')', '')}</p>
220 <p class="dsv-text--lg pl-3">${raceCategoryName.getData()}
221 <#if raceEventNameShort?has_content> | ${raceEventNameShort} </#if>
222 | ${gender.getData()}</p>
223 </div>
224 </div>
225 <i class="dsv-icon dsv-icons--xs align-self-end"></i>
226 </div>
227 </div>
228 </div>
229
230 <div class="dsv-accordion__item">
231 <div class="px-3 d-none d-lg-block d-md-block mt-4 ">
232 <div class="dsv-tabs__btn-container">
233 <button class="dsv-btn dsv-btn--primary dsv-tabs__tab-btn text-weight-bold text-uppercase py-2"
234 value="key-facts"
235 onclick="accordionDesctopContentChange(this);recalculateAccordionHeight(this);"
236 type="button"><@liferay.language key="dsv.training.key.facts" />
237 </button>
238 <button class="dsv-btn dsv-btn--bl dsv-tabs__tab-btn text-weight-bold text-uppercase py-2"
239 value="vorraussetzungen"
240 onclick="accordionDesctopContentChange(this);recalculateAccordionHeight(this);"
241 type="button"><@liferay.language key="dsv.race.event.contact" />
242 </button>
243 </div>
244
245 <div class="d-flex border border-danger align-items-sm-start flex-row dsv-text--lg">
246 <div class="dynamic-content-show d-none d-flex flex-wrap key-facts-details p-3 c-gapy-3">
247 <div class="col-6 d-flex justify-content-between">
248 <div><@liferay.language key="dsv.race.event.date" /></div>
249 <div>${parsedStartDate}</div>
250 </div>
251 <#if raceHost.getData()?has_content && raceHost.getData() != 'null'>
252 <div class="col-6 d-flex justify-content-between">
253 <div><@liferay.language key="dsv.race.event.host" /></div>
254 <div>${raceHost.getData()}</div>
255 </div>
256 </#if>
257 <div class="col-6 d-flex justify-content-between">
258 <div><@liferay.language key="dsv.race.event.location" /></div>
259 <div>${raceLocation.getData()}</div>
260 </div>
261 <div class="col-6 d-flex justify-content-between">
262 <div><@liferay.language key="dsv.race.event.race.number" /></div>
263 <div>${raceCode.getData()}</div>
264 </div>
265 <div class="col-6 d-flex justify-content-between">
266 <div><@liferay.language key="dsv.race.event.category" /></div>
267 <div>${raceCategoryName.getData()}</div>
268 </div>
269
270 <#if dateTimeAppEnd?has_content>
271 <div class="col-6 d-flex justify-content-between">
272 <div><@liferay.language key="dsv.race.event.app.date.time" /></div>
273 <div class="text-right">${dateTimeAppEndData}</div>
274 </div>
275 </#if>
276
277 <div class="col-6 d-flex justify-content-between">
278 <div><@liferay.language key="dsv.race.event.cost" /></div>
279 <div>${raceFee}</div>
280 </div>
281 <div class="col-6 d-flex justify-content-between">
282 <div><@liferay.language key="dsv.race.event.competitive.discipline" /></div>
283 <div>${raceEventName.getData()}</div>
284 </div>
285
286 <#-- <#if raceRegistration?has_content>-->
287 <#-- <div class="col-6">${raceRegistration}</div>-->
288 <#-- </#if>-->
289 </div>
290
291 <div class="dynamic-content-show d-none vorraussetzungen-details col-6 p-3 flex-column c-gapy-3">
292 <div class="d-flex justify-content-between col-12">
293 <div><@liferay.language key="dsv.race.event.name" /></div>
294 <div>${contactPersonFirstname.getData()?string + " " + contactPersonLastname.getData()?string}</div>
295 </div>
296 <div class="d-flex justify-content-between col-12">
297 <div><@liferay.language key="dsv.race.event.phone" /></div>
298 <div>${contactPersonPhone.getData()}</div>
299 </div>
300 <div class="d-flex justify-content-between col-12">
301 <div><@liferay.language key="dsv.race.event.website" /></div>
302 <a href="https://${contactPersonWww.getData()}" target="_blank">
303 ${contactPersonWww.getData()}
304 </a>
305 </div>
306 <div class="d-flex justify-content-between col-12">
307 <div><@liferay.language key="dsv.race.event.email" /></div>
308 <div>${contactPersonEmail.getData()}</div>
309 </div>
310 </div>
311 </div>
312
313 <#if (raceEventFiles?has_content && raceEventFiles.getSiblings()?size > 0)>
314 <div class="d-flex flex-wrap flex-row justify-content-center my-4 c-gapx-4 c-gapy-3">
315
316 <#list raceEventFiles.getSiblings() as raceEventFile>
317 <#if raceEventFile.raceEventFileType.getData()?has_content && raceEventFile.raceEventFileUpload.getData()?has_content >
318 <a href="${raceEventFile.raceEventFileUpload.getData()}" class="dsv-btn"
319 download="download">
320 <@liferay.language key="${'dsv.race.event.button.'+ raceEventFile.raceEventFileType.getData()}" />
321 <i class="dsv-icon dsv-icon-download dsv-icon--red"></i>
322 </a>
323 </#if>
324 </#list>
325 </div>
326 </#if>
327 </div>
328
329 <div class="d-lg-none d-md-none d-sm-block px-3">
330 <div class="dsv-accordion mt-3">
331 <div class="dsv-accordion__header align-items-center px-4"
332 onClick="accordionParentHeightCorrect(this)">
333 <p class="dsv-text--lg p-0 text-weight-bold"><@liferay.language key="dsv.training.key.facts" /></p>
334 <i class="dsv-icon dsv-icons--xs align-self-center"></i>
335 </div>
336 <div class="dsv-accordion__item">
337 <div class="container border border-danger py-3">
338 <div class="row c-gapy-3">
339 <div class="col-6"><@liferay.language key="dsv.race.event.date" /></div>
340 <div class="col-6">${parsedStartDate}</div>
341
342 <div class="col-6"><@liferay.language key="dsv.race.event.location" /></div>
343 <div class="col-6">${raceLocation.getData()}</div>
344
345 <div class="col-6"><@liferay.language key="dsv.race.event.category" /></div>
346 <div class="col-6">${raceCategoryName.getData()}</div>
347
348 <div class="col-6"><@liferay.language key="dsv.race.event.competitive.discipline" /></div>
349 <div class="col-6">${raceEventName.getData()}</div>
350
351 <#if raceHost.getData()?has_content && raceHost.getData() != 'null'>
352 <div class="col-6"><@liferay.language key="dsv.race.event.host" /></div>
353 <div class="col-6">${raceHost.getData()}</div>
354 </#if>
355
356 <div class="col-6"><@liferay.language key="dsv.race.event.race.number" /></div>
357 <div class="col-6">${raceCode.getData()}</div>
358
359 <#if dateTimeAppEnd?has_content>
360 <div class="col-6"><@liferay.language key="dsv.race.event.app.date.time" /></div>
361 <div class="col-6">${dateTimeAppEndData}</div>
362 </#if>
363
364 <div class="col-6"><@liferay.language key="dsv.race.event.cost" /></div>
365 <#if raceFee?has_content>
366 <div class="col-6">${raceFee}</div>
367 </#if>
368
369 <#-- <#if raceRegistration?has_content>-->
370 <#-- <div class="col-12">${raceRegistration}</div>-->
371 <#-- </#if>-->
372 </div>
373 </div>
374 </div>
375 </div>
376
377 <div class="dsv-accordion">
378 <div class="dsv-accordion__header align-items-center px-4"
379 onClick="accordionParentHeightCorrect(this)">
380 <p class="dsv-text--lg p-0 text-weight-bold"><@liferay.language key="dsv.race.event.contact" /></p>
381 <i class="dsv-icon dsv-icons--xs align-self-center"></i>
382 </div>
383 <div class="dsv-accordion__item">
384 <div class="container border border-danger py-3">
385 <div class="row c-gapy-3">
386 <div class="col-4"><@liferay.language key="dsv.race.event.name" /></div>
387 <div class="col-8">${contactPersonFirstname.getData()?string + " " + contactPersonLastname.getData()?string}</div>
388
389 <div class="col-4"><@liferay.language key="dsv.race.event.phone" /></div>
390 <div class="col-8">${contactPersonPhone.getData()}</div>
391
392 <div class="col-4"><@liferay.language key="dsv.race.event.website" /></div>
393 <div class="col-8">
394 <#if contactPersonWww.getData()?has_content>
395 <a href="https://${contactPersonWww.getData()}" target="_blank">
396 ${contactPersonWww.getData()}
397 </a>
398 </#if>
399 </div>
400
401 <div class="col-4"><@liferay.language key="dsv.race.event.email" /></div>
402 <div class="col-8">${contactPersonEmail.getData()}</div>
403 </div>
404 </div>
405 </div>
406 </div>
407 <#if (raceEventFiles?has_content && raceEventFiles.getSiblings()?size > 0)>
408 <div class="d-flex flex-column align-items-stretch">
409 <#list raceEventFiles.getSiblings() as raceEventFile>
410 <#if raceEventFile.raceEventFileType.getData()?has_content && raceEventFile.raceEventFileUpload.getData()?has_content >
411 <a href="${raceEventFile.raceEventFileUpload.getData()}" class="my-2 dsv-btn text-3"
412 download="download">
413 <@liferay.language key="${'dsv.race.event.button.'+ raceEventFile.raceEventFileType.getData()}" />
414 <i class="dsv-icon dsv-icon-download dsv-icon--red"></i>
415 </a>
416 </#if>
417 </#list>
418 </div>
419 </#if>
420 </div>
421 </div>
422 </div>
423</div>
06.09.2026 | Skiverband Rheinhessen | Boppard/Mittelrhein
Status: Noch offen
23. Rollski-Berglauf in Boppard
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
19.07.2026 | SC Lanzenhain | Muna (Grebenhain-Oberwald)
Status: Resultate offiziell
6. Vogelsberger Rollskimarathon 2026
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
12.10.2025 | Deutscher Skiverband e.V./WSV Oberhof 05 e.V. | Oberhof Arena
Status: Noch offen
DSV Marathon Serie - Oberhof
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
06.09.2025 | Skiverband Rheinhessen | Boppard/Mittelrhein
Status: Noch offen
22. Rollski-Berglauf in Boppard
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
17.08.2025 | Deutscher Skiverband e.V./TSG Ruhla e.V. | Moorgrund
Status: Resultate offiziell
DSV Marathon Serie - Ruhla
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
27.07.2025 | Deutscher Skiverband e.V./TSV Carlsgrün | Carlsgrün
Status: Resultate offiziell
DSV Marathon Serie - Carlsgrün
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
29.06.2025 | Deutscher Skiverband e.V./SC Lanzenhain | Muna (Grebenhain-Oberwald)
Status: Resultate offiziell
DSV Marathon Serie - SC Lanzenhain
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt
29.09.2024 | Deutscher Skiverband e.V./Thüringer Skiverband | Gräfenroda/Oberhof
Status: Resultate offiziell
Rennsteig Rollskilauf
Schüler, Jugend, Masters | m/w
KEY FACTS
Kontakt