ES

Elige tu idioma

Buscar

Royal Air Maroc

Una ciudad de colores, aromas y encanto sin tiempo.

Empieza ya

¡No se han encontrado vuelos!

Comienza tu viaje

lo hacemos inolvidable

                                   
Se ha producido un error al procesar la plantilla.
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> 

Bienvenido a Safar Flyer, nuestro programa de fidelidad

  • Gana Millas en cada vuelo o actividad con nuestros socios aéreos y no aéreos

  • Canjea tus Millas por recompensas exclusivas

  • Image Alternative Text
    Únete ahora

    Descarga nuestra nueva aplicación

    ¡Descubre un mundo de comodidad con nuestra app! Ya sea que busques ofertas personalizadas, soporte al cliente rápido o una experiencia de usuario impecable. ¡No te lo pierdas!