Recherche d'asset dynamique
eu.strasbourg.dynamic-search-strasbourg-result-display-max
Détail Entité
An error occurred while processing the template.
Java method "jdk.proxy56.$Proxy365.getCurrentAndFuturePublishedEventsFromPlace(String)" threw an exception when invoked on jdk.proxy56.$Proxy365 object "eu.strasbourg.service.agenda.service.impl.EventLocalServiceImpl@b6dba5b"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign placeEvents = EventLocalServi... [in template "20116#20160#553507524" at line 483, column 9]
----
1<!-- Detail lieu -->
2<#setting locale=locale />
3
4<@liferay_util["html-bottom"]>
5 <script src="/o/0-global-theme/libs/leaflet/leaflet.js"></script>
6 <link rel="stylesheet" href="/o/0-global-theme/libs/leaflet/leaflet.css" />
7</@>
8
9<#assign fileEntryHelper=serviceLocator.findService("eu.strasbourg.utils.api.FileEntryHelperService") />
10<#assign EventLocalService=serviceLocator.findService("eu.strasbourg.service.agenda.service.EventLocalService") />
11
12<article class="st-place-detail">
13 <@barreAgenda />
14
15 <header class="st-header-fiche-place st-header-fiche">
16 <@liferay.breadcrumbs />
17
18 <div class="st-wrapper st-wrapper-small">
19 <div class="st-content">
20 <div class="st-caption">
21 <h1 class="st-h2">
22 ${entry.getAlias(locale)}
23 </h1>
24 <#if entry.getTypes()?has_content>
25 <ul class="st-surtitre-cat">
26 <#list entry.getTypes() as type>
27 <li>
28 ${type.getTitle(locale)}
29 </li>
30 </#list>
31 </ul>
32 </#if>
33 </div>
34 <#if entry.imageId?has_content && entry.imageId?number != 0>
35 <div class="st-image">
36 <@strasbourg.addImage fileEntryId=entry.imageId maxWidth=560 showCopyright=true />
37 </div>
38 </#if>
39 <div class="st-wrapper-maps">
40 <a href="#skip-map-cover" class="st-btn st--btn-xs st-skip-map st-sr-only st-sr-only-focusable">
41 <@liferay_ui.message key="eu.pass-map" />
42 </a>
43 <div class="st-maps" role="region" aria-label="<@liferay_ui.message key="eu.map" />"
44 data-lat="${ entry.getMercatorY() }" data-lng="${ entry.getMercatorX() }" data-zoom="17"
45 data-callback="initMap" data-marker="true" data-markericon="default">
46 </div>
47 <div id="skip-map-cover"></div>
48 </div>
49 </div>
50 <#if entry.isEnabled()>
51 <div class="st-bloc-info">
52 <#assign occupationState = entry.getRealTime() />
53 <#assign isSwimmingPool = entry.isSwimmingPool() />
54 <#assign isIceRink = entry.isIceRink() />
55 <#assign isMairie = entry.isMairie() />
56 <#assign isParking = entry.isParking() />
57 <#assign isVelhopStation = entry.isVelhopStation() />
58 <div class="st-top-bar__left">
59 <#if isSwimmingPool || isIceRink || isMairie>
60 <p><@liferay_ui.message key="${occupationState.label}-short" /></p>
61 <#else>
62 <#if entry.periods?has_content>
63 <#if entry.isOpenNow()>
64 <p class="st-ouverture st--open"> <@liferay_ui.message key="eu.currently-open" /></p>
65 <#else>
66 <p class="st-ouverture st--closed"> <@liferay_ui.message key="eu.currently-closed" /></p>
67 </#if>
68 </#if>
69 </#if>
70 </div>
71 <#if entry.isOpenNow() && occupationState != "NOT_AVAILABLE" && occupationState != "CLOSED" && occupationState != "DISABLED" && occupationState.occupation??>
72 <div class="st-top-bar__right">
73 <p class="st-frequentation">
74 <#if isSwimmingPool || isIceRink>
75 ${occupationState.occupation?number?round?string.number} <@liferay_ui.message key="eu.place.occupation" />
76 <#elseif isMairie>
77 ${occupationState.occupationLabel}
78 <#elseif isParking>
79 ${occupationState.available?number?round?string.number} <@liferay_ui.message key="eu.place.spots-available" />
80 <#elseif isVelhopStation>
81 ${occupationState.available?number?round?string.number} <@liferay_ui.message key="eu.place.velhop-available" />
82 </#if>
83 </p>
84 <p>
85 <#if isSwimmingPool >
86 <@liferay_ui.message key="eu.place.total-capacity-long" /> ${occupationState.capacity?number?round?string.number} <@liferay_ui.message key="eu.place.person-capacity" />
87 <#elseif isParking>
88 <@liferay_ui.message key="eu.place.total-capacity-long" /> ${occupationState.capacity?number?round?string.number} <@liferay_ui.message key="eu.place.place-capacity" />
89 </#if>
90 </p>
91 <p class="st-small-text">
92 <#if isSwimmingPool>
93 <@liferay_ui.message key="live-occupation-explanation" />
94 <#elseif isMairie>
95 <@liferay_ui.message key="estimated-time-explanation" />
96 <#elseif isIceRink>
97 <@liferay_ui.message key="live-ice-rink-occupation-explanation" />
98 </#if>
99 </p>
100 </div>
101 </#if>
102 </div>
103 </#if>
104 </div>
105 </header>
106
107 <div class="st-content st-main-content">
108 <!-- Horaires -->
109 <#if entry.periods?has_content || entry.hasURLSchedule>
110 <div class="st-bloc st-bloc-sit-onglets st-wrapper st-wrapper-small st--has-margin" id="horaire">
111 <h2 class="st-h3 st-bloc-sit-title">
112 <@liferay_ui.message key="eu.times" />
113 </h2>
114 <#if entry.hasURLSchedule>
115 <div class="st-bottom-part st-text-styles">
116 <a href="${entry.getScheduleLinkURL(locale)}" target="_blank"
117 title="${entry.getScheduleLinkName(locale)}" class="st-btn st--btn-secondary st--btn-full-width">
118 ${entry.getScheduleLinkName(locale)}
119 </a>
120 </div>
121 </#if>
122 <#if !entry.hasURLSchedule>
123 <div class="st-container">
124 <div class="st-slider-tablist st-js-slider-tablist splide" role="tablist">
125 <div class="splide__track">
126 <ul class="splide__list">
127 <li class="splide__slide">
128 <button class="st-slider-tablist__button" id="tab-button-1" type="button" role="tab"
129 aria-selected="true" aria-controls="tabpanel-1">
130 <span class="st-title"><@liferay_ui.message key="eu.place.next-days" /></span>
131 </button>
132 </li>
133 <#if entry.defaultPeriod?has_content>
134 <li class="splide__slide">
135 <button class="st-slider-tablist__button"
136 id="tab-button-${entry.defaultPeriod.getPeriodId()}" type="button" role="tab"
137 aria-selected="true"
138 aria-controls="tabpanel-${entry.defaultPeriod.getPeriodId()}">
139 <span class="st-title">${entry.defaultPeriod.getName(locale)}</span>
140 </button>
141 </li>
142 </#if>
143
144 <!-- Autres periodes -->
145 <#list entry.nonDefaultPeriods as period>
146 <li class="splide__slide">
147 <button class="st-slider-tablist__button" id="tab-button-${period.getPeriodId()}"
148 type="button" role="tab" aria-selected="true"
149 aria-controls="tabpanel-${period.getPeriodId()}">
150 <span class="st-title">${period.getName(locale)}</span>
151 <span class="st-surtitre-cat">${period.getDisplay(locale)}</span>
152 </button>
153 </li>
154
155 </#list>
156
157 </ul>
158 </div>
159 <div class="splide__arrows st-nav-arrows">
160 <button class="splide__arrow splide__arrow--prev st-btn-arrow st--prev"></button>
161 <button class="splide__arrow splide__arrow--next st-btn-arrow st--next"></button>
162 </div>
163 </div>
164 <div class="st-tabpanels">
165
166 <div class="st-tabpanel" id="tabpanel-1" role="tabpanel" tabindex="0" aria-labelledby="tab-button-1">
167 <#if entry.publishedSubPlaces?has_content>
168 <h3 class="st-subplaces">${entry.getAlias(locale)}</h3>
169 </#if>
170
171 <#assign daySchedulesMap=entry.getFollowingWeekSchedules(.now, locale) />
172 <#if daySchedulesMap?has_content>
173 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
174
175 <#assign hasException=false />
176 <#list daySchedulesMap?keys as day>
177 <!-- Correctif car suite a une modif on n'envoie plus une liste vide mais null, donc erreur freemarker -->
178 <#if daySchedulesMap[day]?size !=1 ||
179 (daySchedulesMap[day]?size==1 &&
180 daySchedulesMap[day][0]?? &&
181 daySchedulesMap[day][0]?has_content)>
182
183 <li class="st-item-row">
184 <p class="st-title">${day}</p>
185 <div class="st-info st-u-color-secondary">
186 <#list daySchedulesMap[day] as schedule>
187 <#if schedule.isException() ||
188 schedule.isPublicHoliday()>
189 <#assign hasException=true />
190 <#assign hasAnyException=true />
191 <#else>
192 <#assign hasException=false />
193 </#if>
194 <#if schedule.isClosed()>
195 <p class="st-ouverture st--closed st-u-color-pink">
196 <@liferay_ui.message key="eu.closed" />
197 </p>
198 <#elseif schedule.isAlwaysOpen()>
199 <p class="st-ouverture">
200 <@liferay_ui.message key="always-open" />
201 </p>
202 <#else>
203 <#list schedule.openingTimes as openingTime>
204 <p>
205 ${openingTime.first} -
206 ${openingTime.second}
207 <#if hasException>
208 <span class="st-symbol">*</span>
209 </#if>
210 </p>
211 <#if schedule.comments[openingTime?index]?has_content>
212 <p class="st-note">
213 ${schedule.comments[openingTime?index]}
214 </p>
215 </#if>
216
217 </#list>
218 </#if>
219 </#list>
220
221 </div>
222 </li>
223
224 </#if>
225 </#list>
226 </ul>
227 </#if>
228 <!-- Jours suivants pour les sous-lieux -->
229 <#list entry.publishedSubPlaces as subPlace>
230 <h3 class="st-subplaces mt-4">${subPlace.getName(locale)}</h3>
231 <#assign
232 daySchedulesMap=subPlace.getFollowingWeekSchedules(.now,
233 locale) />
234 <#if daySchedulesMap?has_content>
235 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
236
237 <#list daySchedulesMap?keys as day>
238 <!-- Correctif car suite a une modif on n'envoie plus une liste vide mais null, donc erreur freemarker -->
239 <#if daySchedulesMap[day]?size !=1 ||
240 (daySchedulesMap[day]?size==1 &&
241 daySchedulesMap[day][0]?? &&
242 daySchedulesMap[day][0]?has_content)>
243 <li class="st-item-row">
244 <p class="st-title">${day}</p>
245 <div class="st-info st-u-color-secondary">
246 <#list daySchedulesMap[day] as schedule>
247 <#if schedule.isException() ||
248 schedule.isPublicHoliday()>
249 <#assign hasException=true />
250 <#assign hasAnyException=true />
251 <#else>
252 <#assign hasException=false />
253 </#if>
254 <#if schedule.isClosed()>
255 <p class="st-ouverture st--closed st-u-color-pink">
256 <@liferay_ui.message key="eu.closed" />
257 </p>
258 <#elseif schedule.isAlwaysOpen()>
259 <p class="st-ouverture">
260 <@liferay_ui.message key="always-open" />
261 </p>
262 <#else>
263 <#list schedule.openingTimes
264 as openingTime>
265 <p>
266 ${openingTime.first}
267 -
268 ${openingTime.second}
269 <#if hasException>
270 <span class="st-symbol">*</span>
271 </#if>
272 </p>
273 <#if
274 schedule.comments[openingTime?index]?has_content>
275 <p class="st-note">
276 ${schedule.comments[openingTime?index]}
277 </p>
278 </#if>
279
280 </#list>
281 </#if>
282
283 </#list>
284 </div>
285 </li>
286 </#if>
287 </#list>
288 </ul>
289 </#if>
290 </#list>
291 <#if hasAnyException?has_content && hasAnyException>
292 <!-- Message pour exceptions -->
293 <p class="st-note">
294 <@liferay_ui.message
295 key="eu.place.look-at-exceptionnal-schedule" />
296 </p>
297 </#if>
298
299 </div>
300
301 <!-- Periode par defaut -->
302 <#if entry.defaultPeriod?has_content>
303 <div class="st-tabpanel st-is-hidden" id="tabpanel-${entry.defaultPeriod.getPeriodId()}" role="tabpanel" tabindex="0"
304 aria-labelledby="tab-button-${entry.defaultPeriod.getPeriodId()}">
305 <#if entry.publishedSubPlaces?has_content>
306 <h3 class="st-subplaces">${entry.getAlias(locale)}</h3>
307 </#if>
308 <#assign
309 weekSchedules=entry.defaultPeriod.getWeekSchedule() />
310 <#assign day=0 />
311 <#if weekSchedules?has_content>
312 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
313
314 <#list weekSchedules as schedule>
315 <@showTime day schedule hasException />
316 <#assign day=day + 1 />
317 </#list>
318 </ul>
319 </#if>
320 <!-- Periode par defaut pour les sous-lieux -->
321 <#list entry.publishedSubPlaces as subPlace>
322 <h3 class="st-subplaces">${subPlace.getName(locale)}</h3>
323 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
324 <#assign
325 weekSchedules=subPlace.defaultPeriod.getWeekSchedule(subPlace.subPlaceId) />
326 <#assign day=0 />
327 <#list weekSchedules as schedule>
328 <@showTime day schedule hasException />
329 <#assign day=day + 1 />
330 </#list>
331 </ul>
332 </#list>
333 <#if hasAnyException?has_content && hasAnyException>
334 <!-- Message pour exceptions -->
335 <p class="st-note">
336 <@liferay_ui.message
337 key="eu.place.look-at-exceptionnal-schedule" />
338 </p>
339 </#if>
340
341 </div>
342 </#if>
343
344 <!-- Autres periodes -->
345 <#list entry.nonDefaultPeriods as period>
346 <div class="st-tabpanel st-is-hidden" id="tabpanel-${period.getPeriodId()}" role="tabpanel" tabindex="0"
347 aria-labelledby="tab-button-${period.getPeriodId()}">
348 <#if entry.publishedSubPlaces?has_content>
349 <h3 class="st-subplaces">${entry.getAlias(locale)}</h3>
350 </#if>
351
352 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
353 <#assign weekSchedules=period.getWeekSchedule() />
354 <#assign day=0 />
355 <#list weekSchedules as schedule>
356 <@showTime day schedule hasException />
357 <#assign day=day + 1 />
358 </#list>
359 </ul>
360 <!-- Periode par defaut pour autres périodes -->
361 <#list entry.publishedSubPlaces as subPlace>
362 <h3 class="st-subplaces">${subPlace.getName(locale)}</h3>
363 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
364 <#assign
365 weekSchedules=period.getWeekSchedule(subPlace.subPlaceId) />
366 <#assign day=0 />
367 <#list weekSchedules as schedule>
368 <@showTime day schedule hasException />
369 <#assign day=day + 1 />
370 </#list>
371 </ul>
372 </#list>
373 <#if hasAnyException?has_content && hasAnyException>
374 <!-- Message pour exceptions -->
375 <p class="st-note">
376 <@liferay_ui.message
377 key="eu.place.look-at-exceptionnal-schedule" />
378 </p>
379 </#if>
380 </div>
381
382
383 </#list>
384 </ul>
385 </div>
386 <div class="st-bottom-part st-text-styles">
387 <#if !entry.hasURLSchedule>
388 <!-- Liste des exceptions -->
389 <#assign exceptions = entry.getCompletePlaceScheduleExceptionFreeMarker(.now, true, locale) />
390 <#if exceptions?has_content || (hasAnyException?has_content && hasAnyException)>
391
392 <h3 class="st-title-medium st-h4">
393 <@liferay_ui.message key="eu.exceptional-closings-openings" />
394 </h3>
395 <ul>
396 <#list exceptions as exception>
397 <#assign exceptionPlaceName = exception.getPlaceName() />
398 <li>
399 <strong><#if exceptionPlaceName != entry.getName()>${exceptionPlaceName} - </#if>${exception.getPeriodDisplay(locale)}</strong> :
400 <#if exception.isClosed()>
401 <@liferay_ui.message key="eu.closed" />
402 <#else>
403 <#list exception.openingTimes as openingTime>
404 ${openingTime.first} - ${openingTime.second}
405 <#sep>, </#sep>
406 </#list>
407 </#if>
408 - ${exception.description}
409 </li>
410 </#list>
411 </ul>
412 </#if>
413 </#if>
414
415 <#if entry.getExceptionalSchedule(locale)?has_content>
416 <h3 class="st-title-medium st-h4"><@liferay_ui.message key="eu.exceptional-schedule" /></h3>
417 ${entry.getExceptionalSchedule(locale)}
418
419 </#if>
420 </div>
421 </div>
422 </#if>
423
424 </div>
425 </#if>
426
427 <!-- Listing Lieu meme type -->
428 <#if entry.isSearchable()>
429 <#assign assetVocabularyHelper=serviceLocator.findService("eu.strasbourg.utils.api.AssetVocabularyHelperService") />
430 <#assign placeLocalService=serviceLocator.findService("eu.strasbourg.service.place.service.PlaceLocalService") />
431 <#list entry.types as type>
432 <#if (assetVocabularyHelper.getCategoryProperty(type.categoryId, 'searchable' )=='true' )>
433 <#assign category=type />
434 </#if>
435 </#list>
436 <#assign imageEntryId = assetVocabularyHelper.getCategoryImage(category.categoryId,'picto-vert') ! "" />
437 <div class="st-bloc st-bloc-sit-focus st--with-icon st-wrapper st-wrapper-small">
438 <div class="st-container">
439
440 <div class="st-col-left">
441 <#if imageEntryId?has_content>
442 <div class="st-icon-picto" style="width: 145px;">
443 <@strasbourg.addImage fileEntryId=imageEntryId.getFileEntryId() maxWidth=91 />
444 </div>
445
446 </#if>
447
448 <div class="st-content">
449 <h2 class="st-h3"><@liferay_ui.message key="eu.noel.go-elsewhere" /></h2>
450 <p class="st-surtitre-cat">
451 <#assign arg = [placeLocalService.getPlaceCountByAssetCategory(category, themeDisplay.getCompanyGroupId()), category.getTitle(locale)?lower_case]>
452 <@liferay_ui.message key="eu.noel.other-place-x-x" arguments= arg />
453 </p>
454 </div>
455 </div>
456
457 <div class="st-col-right">
458 <a href="${strasbourg.homeURL()}rechercher-lieu-public?p_p_id=eu_strasbourg_portlet_search_asset_v2_SearchAssetPortlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_eu_strasbourg_portlet_search_asset_v2_SearchAssetPortlet_vocabulariesCount=2&_eu_strasbourg_portlet_search_asset_v2_SearchAssetPortlet_keywords=&_eu_strasbourg_portlet_search_asset_v2_SearchAssetPortlet_vocabulary_0=${category.categoryId}&_eu_strasbourg_portlet_search_asset_v2_SearchAssetPortlet_vocabulary_1="
459 class="st-btn st--btn-secondary">
460 <@liferay_ui.message key="eu.see-all-other-places" />
461 </a>
462 </div>
463 </div>
464 </div>
465 </#if>
466
467 <!-- Presentation -->
468 <#if entry.getPresentation(locale)?has_content>
469 <div class="st-bloc st-bloc-sit-presentation st-wrapper st-wrapper-small st--has-margin">
470 <h2 class="st-h3 st-bloc-sit-title">
471 <@liferay_ui.message key="eu.presentation" />
472 </h2>
473 <div class="st-component-container st-text-styles">
474 <div class="st-limit-height ">
475 <p>${entry.getPresentation(locale)}</p>
476 </div>
477 <@strasbourg.showMore />
478 </div>
479 </div>
480 </#if>
481
482 <!-- Agenda -->
483 <#assign placeEvents=EventLocalService.getCurrentAndFuturePublishedEventsFromPlace(entry.getSIGid()) />
484 <#if entry.displayEvents && placeEvents?has_content>
485 <div class="st-bloc st-bloc-sit-agenda st-wrapper st-wrapper-small st--has-margin">
486 <h2 class="st-h3 st-bloc-sit-title">
487 <@liferay_ui.message key="agenda" />
488 </h2>
489 <ul class="st-cards-wrapper st--has-cards-horizontal st-basic-grid st-col-2@t-small">
490 <#assign i=0 />
491 <#list placeEvents?sort_by("startDateFirstCurrentAndFuturePeriod") as event>
492 <#if i==5>
493 <#break>
494 </#if>
495 <li>
496 <div class="st-card-container">
497 <a href="${strasbourg.homeURL()}evenement/-/entity/id/${event.eventId}/${event.getNormalizedTitle(locale)}"
498 class="st-card st-card-agenda st--text-only st--card-horizontal st--with-gradient"
499 title="${event.getTitle(locale)}">
500 <div class="st-caption">
501 <h3 class="st-title-card">${event.getTitle(locale)}</h3>
502 <p class="st-surtitre-cat">
503 <#list entry.getTypes() as type>
504 <span>
505 ${type.getTitle(locale)}
506 </span>
507 </#list>
508 </p>
509 <div class="st-infos">
510 <p class="st-date">
511 <span>
512 ${event.getEventScheduleDisplayShort(locale)}
513 </span>
514 </p>
515 <p class="st-location">
516 ${event.getPlaceAlias(locale)}
517 <#if event.getPlaceAddress(locale)?has_content>
518 - ${event.getPlaceAddress(locale)}
519 </#if>
520 - ${event.placeZipCode} ${event.getPlaceCity(locale)}
521 </p>
522 </div>
523 </div>
524 <div class="st-image">
525
526 <#if event.getImageId() !=0>
527 <@strasbourg.addImage fileEntryId=event.getImageId() maxWidth=100 isFigure=true />
528 <#else>
529 <figure class="st-figure st-fit-cover" role="group" aria-label=" © ${event.getExternalImageCopyright()}">
530 <picture>
531 <img src="${event.getImageURL()}" alt="" />
532 </picture>
533 <figcaption>
534 <#if event.getExternalImageCopyright()?has_content && event.getExternalImageCopyright() != "n/a">
535 <button type="button" class="st-credits st-js-credits" aria-expanded="false" aria-label="© (<@liferay_ui.message key="eu.copyright" />)">©</button>
536 <span class="st-credits-content">© ${event.getExternalImageCopyright()}</span>
537 </#if>
538 </figcaption>
539 </figure>
540 </#if>
541
542 </div>
543 </a>
544 </div>
545 </li>
546 <#assign i++>
547 </#list>
548 </ul>
549 <a href="${strasbourg.homeURL()}agenda?toDate=${.now?date?string["dd/MM"]}/${.now?date?string["yyyy"]?number + 1}&idSIGPlace=${entry.getSIGid()}"
550 class="st-btn st--btn-secondary"> <@liferay_ui.message key="sae.all-events" /></a>
551 </div>
552 </#if>
553
554 <!-- Activite -->
555 <#assign activityLocalService=serviceLocator.findService("eu.strasbourg.service.activity.service.ActivityLocalService") />
556 <#assign placeActivityAgenda=activityLocalService.getPlaceAgenda(entry.getSIGid(), locale) />
557 <#if placeActivityAgenda.periods?has_content>
558 <div class="st-bloc st-bloc-sit-onglets st-wrapper st-wrapper-small st--has-margin">
559 <h2 class="st-h3 st-bloc-sit-title">
560 <@liferay_ui.message key="eu.activity.activities" />
561 </h2>
562 <div class="st-container">
563 <div class="st-slider-tablist st-js-slider-tablist splide" role="tablist">
564 <div class="splide__track">
565 <ul class="splide__list">
566 <#list placeActivityAgenda.periods as period>
567 <li class="splide__slide">
568 <button class="st-slider-tablist__button" id="tab-button-${period.periodId}" type="button" role="tab" aria-selected="true" aria-controls="tabpanel-${period.periodId}">
569 <span class="st-title">${period.periodName}</span>
570 </button>
571 </li>
572 </#list>
573 </ul>
574 </div>
575 <div class="splide__arrows st-nav-arrows">
576 <button
577 class="splide__arrow splide__arrow--prev st-btn-arrow st--prev"></button>
578 <button
579 class="splide__arrow splide__arrow--next st-btn-arrow st--next"></button>
580 </div>
581 </div>
582 <div class="st-tabpanels">
583 <#list placeActivityAgenda.periods as period>
584 <div class="st-tabpanel st-is-hidden" id="tabpanel-${period.periodId}" role="tabpanel" tabindex="0" aria-labelledby="tab-button-${period.periodId}">
585 <#list period.courses as course>
586 <div class="st-detail-lien">
587 <h3 class="st-title-medium st-h4">${course.courseName} </h3>
588 <a href="${strasbourg.homeURL()}cours/-/entity/id/${course.courseId}"
589 class="st-btn st--btn-secondary-ghost st--btn-xs st--btn-small-padding">
590 <@liferay_ui.message key="eu.see-detail" />
591 </a>
592 </div>
593 <#assign hasSchedules=false />
594 <#-- Check if for each day there is a schedule. Dont show ul if no day is found-->
595 <#list 0..6 as day>
596 <#assign schedulesBool=course.getSchedulesForDay(day) />
597 <#if schedulesBool?has_content>
598 <#assign hasSchedules=true />
599 </#if>
600 </#list>
601
602 <#if hasSchedules>
603 <ul class="st-list-rows st-basic-grid st-col-2@t-small">
604 <#list 0..6 as day>
605 <#assign schedules=course.getSchedulesForDay(day) />
606 <#if schedules?has_content>
607 <li class="st-item-row">
608 <p class="st-title">
609 <@liferay_ui.message
610 key="${course.getDayName(day)}" />
611 </p>
612 <div class="st-info st-u-color-secondary">
613
614 <#list schedules as schedule>
615 <p>${schedule.startTime} -
616 ${schedule.endTime} </p><#sep>
617 </#sep>
618 </#list>
619
620 </div>
621 </li>
622 </#if>
623 </#list>
624 </ul>
625 </#if>
626 </#list>
627
628 </div>
629 </#list>
630 </div>
631 </div>
632 </div>
633 </#if>
634
635 <!-- Documents Utiles/Medias -->
636 <#if entry.documentURLs?has_content || entry.videos?has_content>
637 <div class="st-bloc st-bloc-liens st-wrapper st-wrapper-small st--has-margin">
638 <h2 class="st-h3 st-bloc-sit-title"><@liferay_ui.message key="eu.useful-documents" /></h2>
639 <div class="st-component-container">
640 <ul class="st-liste st-limit-height">
641
642 <#list entry.documentsIds?split(",") as fileId>
643 <#if fileId?has_content>
644 <#assign url = fileEntryHelper.getFileEntryURL(fileId?number) />
645
646 <#if url="">
647 <#continue>
648 </#if>
649
650 <#assign title = fileEntryHelper.getFileTitle(fileId?number, locale) />
651 <#assign size = fileEntryHelper.getReadableFileEntrySize(fileId?number, locale) />
652 <#assign extension = fileEntryHelper.getFileExtension(fileId?number) />
653 <li class="st-lien-container">
654 <a href="${url}" class="st-lien" download>
655 <p class="st-title-lien">${title}</p>
656 <div class="st-lien-content">
657 <p class="st-type">(${extension?upper_case} - ${size})</p>
658 <p class="st-text"><@liferay_ui.message key="eu.download" /></p>
659
660 </div>
661 </a>
662 </li>
663 </#if>
664 </#list>
665 </ul>
666 <@strasbourg.showMore />
667 </div>
668 </div>
669 </#if>
670
671 <!-- Informations complementaires, lien du site et accès -->
672 <#if (entry.getAdditionalInformation(locale)?has_content ||
673 (entry.getSiteLabel(locale)?has_content && entry.getSiteURL(locale)?has_content)) ||
674 entry.getAccess(locale)?has_content>
675 <div class="st-bloc st-bloc-sit-colonnes st-bloc-sit-services-handicap st-wrapper st-wrapper-small st-basic-grid st-col-2@t-small st--has-margin">
676 <!-- Informations complementaires et lien du site -->
677 <#if entry.getAdditionalInformation(locale)?has_content ||
678 (entry.getSiteLabel(locale)?has_content && entry.getSiteURL(locale)?has_content)>
679 <div class="st-col">
680 <div class="st-component-container st-text-styles">
681 <h2 class="st-h3 st-bloc-sit-title">
682 <@liferay_ui.message key="eu.place.additional-information" />
683 </h2>
684 <div class="st-limit-height ">
685 ${entry.getAdditionalInformation(locale)}
686 <#if entry.getSiteLabel(locale)?has_content && entry.getSiteURL(locale)?has_content>
687 <a href="${entry.getSiteURL(locale)}" target="_blank" rel="noopener">
688 ${entry.getSiteLabel(locale)}
689 </a>
690 </#if>
691 </div>
692 <@strasbourg.showMore />
693 </div>
694 </div>
695 </#if>
696
697 <!-- Acces -->
698 <#if entry.getAccess(locale)?has_content>
699 <div class="st-col">
700 <div class="st-component-container st-text-styles">
701 <h2 class="st-h3 st-bloc-sit-title">
702 <@liferay_ui.message key="access" />
703 </h2>
704 <div class="st-limit-height">
705 ${entry.getAccess(locale)}
706 </div>
707 <@strasbourg.showMore />
708 </div>
709 </div>
710 </#if>
711 </div>
712 </#if>
713
714 <!-- Acces pour handicapes -->
715 <#if entry.hasAnyAccessForDisabled() || entry.getAccessForDisabled(locale)?has_content>
716 <div class="st-bloc st-bloc-sit-services-handicap st-wrapper st-wrapper-small st--has-margin">
717 <h2 class="st-h3 st-bloc-sit-title">
718 <@liferay_ui.message key="eu.access-for-disabled" />
719 </h2>
720 <ul class="st-meta-wrapper">
721 <#if entry.accessForWheelchair>
722 <li>
723 <span class="st-icon-handicap" aria-hidden="true"></span>
724 <@liferay_ui.message key='eu.access-for-wheelchair' />
725 </li>
726 </#if>
727 <#if entry.accessForDeaf>
728 <li>
729 <span class="st-icon-handi-auditif" aria-hidden="true"></span>
730 <@liferay_ui.message key='eu.access-for-deaf' />
731 </li>
732 </#if>
733 <#if entry.accessForBlind>
734 <li>
735 <span class="st-icon-handicap-vision" aria-hidden="true"></span>
736 <@liferay_ui.message key='eu.access-for-blind' />
737 </li>
738 </#if>
739
740 <#if entry.accessForDeficient>
741 <li>
742 <span class="st-icon-handi-mental" aria-hidden="true"></span>
743 <@liferay_ui.message key='eu.access-for-deficient' />
744 </li>
745 </#if>
746
747 <#if entry.accessForElder>
748 <li>
749 <span class="st-icon-personnes-agees" aria-hidden="true"></span>
750 <@liferay_ui.message key='eu.access-for-elder' />
751 </li>
752 </#if>
753 </ul>
754 <div class="st-component-container st-text-styles">
755 <#if entry.getAccessForDisabled(locale)?has_content>
756 <div class="st-limit-height ">
757 ${entry.getAccessForDisabled(locale)}
758 </div>
759 </#if>
760 <@strasbourg.showMore />
761 </div>
762 </div>
763 </#if>
764
765 <!-- Services et caractéristiques-->
766 <#if entry.getServiceAndActivities(locale)?has_content || entry.getCharacteristics(locale)?has_content>
767 <div class="st-bloc st-bloc-sit-colonnes st-bloc-sit-services-handicap st-wrapper st-wrapper-small st-basic-grid st-col-2@t-small st--has-margin">
768 <!-- Services -->
769 <#if entry.getServiceAndActivities(locale)?has_content>
770 <div class="st-services">
771 <div class="st-component-container st-text-styles">
772 <h2 class="st-h3 st-bloc-sit-title">
773 <@liferay_ui.message key="eu.services-and-activities" />
774 </h2>
775 <div class="st-limit-height">
776 ${entry.getServiceAndActivities(locale)}
777 </div>
778 <@strasbourg.showMore />
779 </div>
780 </div>
781 </#if>
782
783 <!-- Caracteristiques -->
784 <#if entry.getCharacteristics(locale)?has_content>
785 <div class="st-caracteristiques">
786 <div class="st-component-container st-text-styles">
787 <h2 class="st-h3 st-bloc-sit-title">
788 <@liferay_ui.message key="eu.features" />
789 </h2>
790 <div class="st-limit-height ">
791 ${entry.getCharacteristics(locale)}
792 </div>
793 <@strasbourg.showMore />
794 </div>
795 </div>
796 </#if>
797 </div>
798 </#if>
799
800 <!-- Contact -->
801 <#if entry.mail?has_content || entry.phone?has_content>
802 <div class="st-bloc st-bloc-sit-focus st-wrapper st--has-margin">
803 <div class="st-container">
804 <div class="st-col-left">
805 <h2 class="st-h3"><@liferay_ui.message key="contact" /></h2>
806 <p class="st-surtitre-cat">${entry.getAlias(locale)}</p>
807 </div>
808 <div class="st-col-right">
809 <#if entry.phone?has_content>
810 <a href="tel:${entry.phone?replace(" ","")?replace("(0)","")}" class="st-btn st--btn-secondary">${entry.phone}</a>
811 </#if>
812
813 <#if entry.mail?has_content>
814 <a href="#st-overlay-contact" class="st-btn st--btn-secondary"><@liferay_ui.message key="eu.contact-mail" /></a>
815 </#if>
816 </div>
817 </div>
818 </div>
819 </#if>
820 </div>
821
822 <#if entry.mail?has_content>
823 <@liferay_portlet.actionURL var="contactURL" name="contact">
824 <@liferay_portlet.param name="classPK" value="${entry.getPlaceId()}" />
825 <@liferay_portlet.param name="entityId" value="${entry.getPlaceId()}" />
826 <@liferay_portlet.param name="title" value="${entry.getAlias(locale)}" />
827 <@liferay_portlet.param name="type" value="Place" />
828 </@liferay_portlet.actionURL>
829 <#assign overlayContactTitle=entry.getAlias(locale) />
830
831 <@strasbourg.overlayContact entry=entry entryType="Place" overlayContactTitle=overlayContactTitle />
832 </#if>
833</article>
834
835<#macro barreAgenda>
836 <div class="st-barre-single-sit st--place">
837 <div class="st-barre-inner st-wrapper">
838 <div class="st-container-left">
839 <div class="st-content">
840 <div>
841 <h5 class="st-title">
842 ${entry.getAlias(locale)}
843 </h5>
844 <#if entry.periods?has_content>
845 <#if entry.isOpenNow()>
846 <p class="st-date st--open"> <@liferay_ui.message key="eu.currently-open" /></p>
847 <#else>
848 <p class="st-date st--closed"> <@liferay_ui.message key="eu.currently-closed" /></p>
849 </#if>
850 </#if>
851 </div>
852 <p class="st-location">
853 <#if entry.addressStreet?has_content>
854 ${entry.addressStreet} <br>
855 </#if>
856 <#if entry.addressComplement?has_content>
857 ${entry.addressComplement} <br>
858 </#if>
859 <#if entry.addressDistribution?has_content>
860 ${entry.addressDistribution} <br>
861 </#if>
862 ${entry.addressZipCode} ${entry.getCity(locale)}
863 </p>
864 </div>
865 </div>
866 <div class="st-container-right">
867 <ul class="st-liens-rapides">
868 <#if entry.getSiteLabel(locale)?has_content && entry.getSiteURL(locale)?has_content>
869 <li>
870 <a href="${entry.getSiteURL(locale)}" class="st-btn-icon st-btn-icon--white" target="_blank"
871 rel="noopener"
872 title="${entry.getSiteLabel(locale)}">
873 <span class="st-icon-web" aria-hidden="true"></span>
874 <span class="st-sr-only">${entry.getSiteLabel(locale)}</span>
875 </a>
876 </li>
877 </#if>
878 </ul>
879 <@strasbourg.socialShare />
880 </div>
881 </div>
882 </div>
883</#macro>
884
885<#macro showTime day schedule hasException>
886 <li class="st-item-row">
887 <p class="st-title">
888 <@liferay_ui.message key="jour-semaine${day}" />
889 </p>
890 <div class="st-info st-u-color-secondary">
891 <#if schedule.isClosed()>
892 <p class="st-ouverture st--closed st-u-color-pink">
893 <@liferay_ui.message key="eu.closed" />
894 </p>
895 <#elseif schedule.isAlwaysOpen()>
896 <p class="st-ouverture">
897 <@liferay_ui.message key="always-open" />
898 </p>
899 <#else>
900 <#list schedule.openingTimes as openingTime>
901 <p>
902 ${openingTime.first}
903 -
904 ${openingTime.second}
905 <#if hasException>
906 <span class="st-symbol">*</span>
907 </#if>
908 </p>
909 <#if schedule.comments[openingTime?index]?has_content>
910 <p class="st-note">
911 ${schedule.comments[openingTime?index]}
912 </p>
913 </#if>
914
915 </#list>
916 </#if>
917 </div>
918 </li>
919</#macro>
INFOS LIVE
The magic is taking shape behind the scenes
Whilst the official dates and programme are still being finalised behind the scenes, the very best holidays in Strasbourg are already being planned. From accommodation and local traditions to practical information: find out everything you need to know to plan your visit to the heart of the Christmas Capital at your own pace.
Check out our Frequently Asked Questions and plan your holiday
