Start your journey
we make it memorable
An error occurred while processing the template.
The following has evaluated to null or missing:
==> cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule [in template "64899143380625#20119#8206410" at line 38, column 40]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
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 scheduleStr = cur_CarouselSec... [in template "64899143380625#20119#8206410" at line 38, column 17]
----
1<#--
2 Add elements from the sidebar to define your template. Type "${" to use the
3 autocomplete feature.
4
5 #set($serviceContext = $portal.getClass().forName("com.liferay.portal.service.ServiceContextThreadLocal").getServiceContext())
6 #set($layoutLocalServiceUtil = $serviceLocator.findService("com.liferay.portal.service.LayoutLocalService"))
7 #set($themeDisplay = $serviceContext.getThemeDisplay())
8 #set($journalTool = $serviceLocator.findService("ram-single-site-portlet", "es.indra.velocity.tools.JournalTool"))
9 #set($httpRequest = $themeDisplay.getRequest())
10 #set($isMobile = $journalTool.isMobile($httpRequest))
11 -->
12
13 <div class="offersUpdate flex-c flex-g-16 f-mb-64">
14 <h2 class="whyram__title f-heading-l f-fw-l"><@liferay.language key='offers-updates-title' /></h2>
15 <div class="js-offersUpdateContainer offersUpdate__container">
16 <div class="swiper swiper-offersUpdate">
17 <div class="swiper-wrapper">
18
19 <#assign currentDateMillis = .now?datetime>
20 <#assign array = []>
21
22
23
24 <#if ImageDesktopFieldSet.getSiblings()?has_content>
25 <#list ImageDesktopFieldSet.getSiblings() as cur_CarouselSection>
26
27
28
29
30
31
32
33 <#assign isActive = getterUtil.getBoolean(cur_CarouselSection.ImageDesktopFieldSetFieldSet.Active.getData())>
34 <#-- assign scheduleDateMillis = cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule.getData() -->
35
36
37 <#-- Recupera y parsea la fecha programada (yyyy-MM-dd) -->
38 <#assign scheduleStr = cur_CarouselSection.ImageDesktopFieldSetFieldSet.Schedule.getData()>
39 <#if scheduleStr?? && scheduleStr?has_content>
40 <#assign scheduleDate = scheduleStr?date("yyyy-MM-dd")>
41 <#-- Convierte a milisegundos (00:00:00 de esa fecha en la zona configurada) -->
42 <#assign scheduleDateMillis = scheduleDate?long>
43 <#assign isPast = (currentDateMillis?long gt scheduleDateMillis)>
44
45 <#if isActive == true && isPast>
46 <#assign item = {
47 "data": cur_CarouselSection,
48 "order": cur_CarouselSection.ImageDesktopFieldSetFieldSet.order.getData()
49 }>
50 <#assign array = array + [item]>
51 </#if>
52
53 <#else>
54 <#if isActive>
55 <#assign item = {
56 "data": cur_CarouselSection,
57 "order": cur_CarouselSection.ImageDesktopFieldSetFieldSet.order.getData()
58 }>
59 <#assign array = array + [item]>
60 </#if>
61 </#if>
62 </#list>
63
64 <#if array?size != 0>
65 <#assign sortedArray = array?sort_by("order")>
66 <#list sortedArray as cur_ImageDesktop>
67
68 <div class="swiper-slide ${cur_ImageDesktop.order}">
69
70 <#assign link = "">
71
72
73
74 <#if cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Link_to_Page5551.getFriendlyUrl() != "">
75 <#assign link = cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Link_to_Page5551.getFriendlyUrl()>
76 <#else>
77 <#assign link = cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.linkUrl.getData()>
78 </#if>
79
80 <a href="${link}" class="offersUpdate__card js-offersUpdateCard">
81
82 <img class="offersUpdate__img-mobile" src="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.ImageMobileFieldSet.ImageMobile.getData()}" alt="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.ImageMobileFieldSet.ImageMobileFieldSetFieldSet.altMobile.getData()}">
83 <img class="offersUpdate__img" src="${cur_ImageDesktop.data.ImageDesktop.getData()}" alt="${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.altDesktop.getData()}" />
84
85 <div class="offersUpdate__footer">
86 <span class="ram-btn-f2">
87 ${cur_ImageDesktop.data.ImageDesktopFieldSetFieldSet.Button_textFieldSet.Button_text.getData()}
88 </span>
89 </div>
90 </a>
91 </div>
92 </#list>
93 </#if>
94 </#if>
95 </div>
96 </div>
97 <button class="offersUpdate__arrow ram-btn-f2 swiper-button-prev" tabindex="-1"></button>
98 <button class="offersUpdate__arrow ram-btn-f2 swiper-button-next" tabindex="-1"></button>
99 </div>
100 <div class="swiper-pagination offersUpdate__pagination"></div>
101 </div>
102 <script>
103 document.addEventListener("DOMContentLoaded", () => {
104 const swiperOffersUpdateWrapper = document.querySelector('.js-offersUpdateContainer'),
105 swiper = document.querySelector('.swiper-offersUpdate');
106
107 var swiperOffersUpdate = new Swiper(".swiper-offersUpdate", {
108 uniqueNavElements: true,
109 loop: true,
110 centeredSlides: true,
111 disableOnInteraction: true,
112 keyboard: {
113 enabled: true,
114 },
115 autoplay: {
116 delay: 5000,
117 disableOnInteraction: true,
118 },
119 slidesPerView: 1,
120 navigation: {
121 nextEl: ".offersUpdate .swiper-button-next",
122 prevEl: ".offersUpdate .swiper-button-prev",
123 },
124 pagination: {
125 el: ".swiper-pagination",
126 clickable: true,
127 },
128 on: {
129 init: function () {
130 let params = swiper.swiper.params;
131 const slides = document.querySelectorAll('.swiper-offersUpdate .swiper-slide');
132
133 if (slides.length <= 3) {
134 params.loop = false;
135 params.rewind = true;
136 }
137 },
138 },
139 });
140
141 if (swiperOffersUpdateWrapper) {
142 swiperOffersUpdateWrapper.addEventListener('mouseover', () => {
143 swiperOffersUpdateWrapper.classList.add('offersUpdate--hover');
144 });
145
146 swiperOffersUpdateWrapper.addEventListener('mouseout', () => {
147 swiperOffersUpdateWrapper.classList.remove('offersUpdate--hover');
148 });
149
150 swiper.addEventListener('mouseover', () => {
151 swiperOffersUpdate.autoplay.stop();
152 });
153
154 swiper.addEventListener('mouseleave', () => {
155 swiperOffersUpdate.autoplay.start();
156 });
157 }
158
159
160 });
161 </script>
What makes so great flying with us?
- Learn more
Meals included in all our flights
Delight in carefully prepared complimentary meals on flights
- Learn more
Free hold luggage for your trip
Travel stress-free with included complimentary baggage allowance
- Learn more
Entertainment on board
Enjoy the latest movies and music during flights
- Learn more
Extra leg room in all our flights
Stretch out and enjoy enhanced comfort on flights