An error occurred while processing the template.
The following has evaluated to null or missing: ==> result.getJSONObject("data").getJSONArray("items") [in template "1084819#1084854#4104773" at line 26, column 11] ---- Tip: If the failing expression is known to be 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: doc = result.getJSONObject("data").ge... [in template "1084819#1084854#4104773" at line 26, column 5] - Reached through: #assign-container [in template "1084819#1084854#4104773" at line 24, column 1] ----
1<#import "_TEMPLATE_CONTEXT_/1084819/1099604/23609/2387505" as d40>
2
3<#assign
4 SRLS = serviceLocator.findService("eu.suggesto.servicecs.service.SuggestoRecommenderLocalService")
5 PUTIL = objectUtil("com.liferay.portal.kernel.util.PortalUtil")
6 jsonParams = result.getNamespacedParameters().getString("jsonParams")
7 serviceName = "tdm40"
8 collection = "tdm_sila"
9 query = "{'id': 0}"
10 id = ""
11/>
12
13<#if jsonParams?has_content>
14 <#assign
15 params = d40.createObject(jsonParams)
16 id = params.getString("id")
17 />
18
19 <#if id?has_content>
20 <#assign query = "{'id': ${id}}">
21 </#if>
22</#if>
23
24<#assign
25 result = SRLS.search("0", serviceName, collection, query, "", 0, 1)
26 doc = result.getJSONObject("data").getJSONArray("items").getJSONObject(0)
27/>
28
29<#if doc.getString("title")?has_content>
30 ${PUTIL.setPageTitle(doc.getString("title")?capitalize, request)}
31</#if>
32
33<section id="banner" class="tw:h-[20vh] lg:tw:h-[45vh] tw:overflow-hidden">
34 <div class="card card-flat tw:w-full tw:h-full">
35 <img data-src="${doc.op_img_url}" loading="lazy" class="lazyload tw:w-full tw:h-full tw:object-cover" alt="${doc.title?js_string}"/>
36 <div class="card-img-overlay tw:bg-gradient-to-b tw:from-transparent tw:via-trasparent tw:to-dark/40 <lg:tw:hidden"></div>
37 </div>
38</section>
39
40
41
42<div class="container tw:my-10 lg:tw:my-20">
43 <div class="card-row">
44 <div class="autofit-col autofit-col-expand">
45 <div class="autofit-section">
46 <p class="tw:text-dark tw:text-2xl tw:font-semibold tw:mb-5 lg:tw:text-5xl">
47 ${doc.title}
48 </p>
49 </div>
50 </div>
51 <div class="autofit-col tw:mt-auto <lg:tw:hidden">
52 <a href="/dormire" class="btn btn-block tw:border-2 tw:border-dark tw:text-dark tw:text-base hover:tw:bg-dark hover:tw:text-white tw:transition-colors tw:duration-300 tw:py-4 tw:inline-block">
53 ${d40.getLabel("torna_indietro")}
54 </a>
55 </div>
56 </div>
57</div>
58
59<div class="tw:bg-lightgray">
60 <div class="container tw:py-10">
61 <div class="row">
62 <div class="col-12 col-lg-6">
63 <div class="aspect-ratio aspect-ratio-4-to-3 tw:rounded-md">
64 <img data-src="${doc.op_img_url}" loading="lazy" class="lazyload aspect-ratio-item-fluid tw:w-full tw:h-full tw:object-cover" alt="${doc.title?js_string}" />
65 </div>
66 </div>
67
68 <div class="col-12 col-lg-6">
69 <div class="lg:tw:ml-10 <lg:tw:mt-10">
70 <div class="tw:space-y-4 tw:mb-5">
71 <div class="card-row tw:space-x-3">
72 <div class="autofit-col">
73 <div class="autofit-section">
74 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
75 <i class="fas fa-paw tw:text-dark fa-2x"></i>
76 </div>
77 </div>
78 </div>
79 <div class="autofit-col autofit-col-expand">
80 <div class="autofit-section">
81 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">${d40.getLabel("animali_ammessi")}</p>
82 <p class="tw:text-dark text-capitalize">${doc.op_animals}</p>
83 </div>
84 </div>
85 </div>
86 </div>
87
88 <div class="tw:space-y-4 tw:mb-5">
89 <div class="card-row tw:space-x-3">
90 <div class="autofit-col">
91 <div class="autofit-section">
92 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
93 <i class="fas fa-restroom tw:text-dark fa-2x"></i>
94 </div>
95 </div>
96 </div>
97 <div class="autofit-col autofit-col-expand">
98 <div class="autofit-section">
99 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">${d40.getLabel("bagno")}</p>
100 <p class="tw:text-dark text-capitalize">${doc.op_bathroom}</p>
101 </div>
102 </div>
103 </div>
104 </div>
105
106 <div class="tw:space-y-4 tw:mb-5">
107 <div class="card-row tw:space-x-3">
108 <div class="autofit-col">
109 <div class="autofit-section">
110 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
111 <i class="fas fa-bed-alt tw:text-dark fa-2x"></i>
112 </div>
113 </div>
114 </div>
115 <div class="autofit-col autofit-col-expand">
116 <div class="autofit-section">
117 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">${d40.getLabel("camera_letto")}</p>
118 <p class="tw:text-dark text-capitalize">si</p>
119 <#-- ${doc.op_bedroom}-->
120 </div>
121 </div>
122 </div>
123 </div>
124
125 <div class="tw:space-y-4 tw:mb-5">
126 <div class="card-row tw:space-x-3">
127 <div class="autofit-col">
128 <div class="autofit-section">
129 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
130 <i class="fas fa-wifi tw:text-dark fa-2x"></i>
131 </div>
132 </div>
133 </div>
134 <div class="autofit-col autofit-col-expand">
135 <div class="autofit-section">
136 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">Internet</p>
137 <p class="tw:text-dark text-capitalize">${doc.op_internet}</p>
138 </div>
139 </div>
140 </div>
141 </div>
142
143 <div class="tw:space-y-4 tw:mb-5">
144 <div class="card-row tw:space-x-3">
145 <div class="autofit-col">
146 <div class="autofit-section">
147 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
148 <i class="fas fa-utensils tw:text-dark fa-2x"></i>
149 </div>
150 </div>
151 </div>
152 <div class="autofit-col autofit-col-expand">
153 <div class="autofit-section">
154 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">${d40.getLabel("cucina")}</p>
155 <p class="tw:text-dark text-capitalize">${doc.op_kitchen}</p>
156 </div>
157 </div>
158 </div>
159 </div>
160
161 <div class="tw:space-y-4 tw:mb-5">
162 <div class="card-row tw:space-x-3">
163 <div class="autofit-col">
164 <div class="autofit-section">
165 <div class="center-child tw:border-2 tw:border-dark tw:rounded-full tw:h-20 tw:w-20">
166 <i class="fas fa-parking tw:text-dark fa-2x"></i>
167 </div>
168 </div>
169 </div>
170 <div class="autofit-col autofit-col-expand">
171 <div class="autofit-section">
172 <p class="tw:text-dark tw:font-semibold tw:uppercase tw:mb-2">${d40.getLabel("parcheggio")}</p>
173 <p class="tw:text-dark text-capitalize">${doc.op_parking}</p>
174 </div>
175 </div>
176 </div>
177 </div>
178
179 <#--
180 <div class="card-row">
181 <div class="autofit-col">
182 <div class="autofit-section">
183 <a href="#request-info" class="btn btn-block tw:border-2 tw:border-dark tw:text-dark tw:text-base hover:tw:bg-dark hover:tw:text-white tw:transition-colors tw:duration-300 tw:py-4 tw:uppercase tw:px-5">
184 ${d40.getLabel("richiedi_info")}
185 </a>
186 </div>
187 </div>
188 </div>
189 -->
190 </div>
191 </div>
192 </div>
193 </div>
194</div>
195
196<#if doc.op_gallery?has_content>
197 <div id="gallery" class="container tw:relative tw:my-10">
198 <div class="swiper-container">
199 <button type="button" class="btn-prev semicircle-right tw:bg-dark/70 tw:w-7 tw:h-14 tw:left-0 tw:top-2/4 tw:-translate-y-2/4 tw:absolute tw:z-5">
200 <span class="sr-only">${d40.getLabel("precedente")}</span>
201 <i class="fal fa-chevron-left tw:text-white"></i>
202 </button>
203 <button type="button" class="btn-next semicircle-left tw:bg-dark/70 tw:w-7 tw:h-14 tw:right-0 tw:top-2/4 tw:-translate-y-2/4 tw:absolute tw:z-5">
204 <span class="sr-only">${d40.getLabel("successivo")}</span>
205 <i class="fal fa-chevron-right tw:text-white"></i>
206 </button>
207
208 <div class="swiper-wrapper">
209 <#list doc.op_gallery?split(",") as slide>
210 <div class="swiper-slide">
211 <a href="javascript:void(0);" data-toggle="modal" data-target="#lightbox-modal" data-slider="${slide?index}">
212 <div class="aspect-ratio aspect-ratio-4-to-3 tw:rounded-md tw:shadow-2xl">
213 <img data-src="${slide}" loading="lazy" class="lazyload aspect-ratio-item-fluid tw:object-cover tw:w-full tw:h-full" alt="image ${slide?counter}" />
214 </div>
215 </a>
216 </div>
217 </#list>
218 </div>
219 </div>
220 </div>
221
222 <div id="lightbox-modal" tabindex="-1" role="dialog" class="modal fade">
223 <div class="modal-dialog modal-full-screen tw:inset-0 tw:border-none tw:shadow-none">
224 <div class="modal-content tw:bg-transparent">
225 <div class="modal-body tw:overflow-hidden">
226 <div class="tw:absolute tw:top-0 tw:right-0 tw:z-5">
227 <button type="button" data-dismiss="modal" class="btn btn-monospaced btn-secondary m-3">
228 <i class="fal fa-times fa-lg"></i>
229 </button>
230 </div>
231 <div id="lightbox-swiper" class="swiper-container tw:h-3/4 tw:my-auto">
232 <div class="swiper-button-prev tw:w-12 tw:h-12">
233 <span class="sticker sticker-circle tw:bg-green tw:w-full tw:h-full">
234 <span class="sticker-overlay">
235 <i class="fas fa-chevron-left fa-2x tw:text-white"></i>
236 </span>
237 </span>
238 </div>
239 <div class="swiper-button-next tw:w-12 tw:h-12">
240 <span class="sticker sticker-circle tw:bg-green tw:w-full tw:h-full">
241 <span class="sticker-overlay">
242 <i class="fas fa-chevron-right fa-2x tw:text-white"></i>
243 </span>
244 </span>
245 </div>
246 <div class="swiper-wrapper tw:h-full">
247 <#list doc.op_gallery?split(",") as slide>
248 <div class="swiper-slide tw:h-full">
249 <img data-src="${slide}" loading="lazy" class="lazyload tw:h-full tw:object-contain tw:mx-auto" alt="image ${slide?counter}" />
250 </div>
251 </#list>
252 </div>
253 </div>
254 <div id="thumbnail-swiper" class="swiper-container">
255 <div class="swiper-wrapper">
256 <#list doc.op_gallery?split(",") as slide>
257 <div class="swiper-slide">
258 <img data-src="${slide}" loading="lazy" class="lazyload tw:object-cover tw:cursor-pointer tw:h-full tw:w-full" alt="image ${slide?counter}" />
259 </div>
260 </#list>
261 </div>
262 </div>
263 </div>
264 </div>
265 </div>
266 </div>
267</#if>
268
269<#if doc.content?has_content>
270 <div class="container tw:my-10 lg:tw:my-20">
271 <p class="tw:text-dark tw:text-xl tw:font-semibold tw:mb-5 lg:tw:text-4xl">${d40.getLabel("nel_dettaglio")}</p>
272 <p class="tw:text-dark">
273 ${doc.content}
274 </p>
275 </div>
276</#if>
277
278<section id="contacts" class="tw:my-20">
279 <div class="tw:bg-lightgray">
280 <div class="container tw:py-5 lg:tw:py-25">
281 <p class="tw:text-dark tw:text-xl tw:font-semibold tw:uppercase tw:mb-10 lg:tw:text-3xl lg:mb-15">
282 ${d40.getLabel("dati_contatto")}
283 </p>
284 <div class="row">
285 <div class="col-12 col-lg-6">
286 <div class="card-row tw:space-x-3 tw:mb-4">
287 <div class="autofit-col">
288 <div class="autofit-section">
289 <div class="center-child tw:border-2 tw:border-dark tw:rounded-md tw:h-10 tw:w-10">
290 <span class="sr-only">Location</span>
291 <i class="fas fa-map-marker-alt tw:text-dark fa-lg"></i>
292 </div>
293 </div>
294 </div>
295 <div class="autofit-col autofit-col-expand">
296 <div class="autofit-section">
297 <p class="tw:text-dark">
298 ${doc.op_address}
299 </p>
300 </div>
301 </div>
302 </div>
303 </div>
304 </div>
305 </div>
306 </div>
307</section>
308
309<#if doc.op_gallery?has_content>
310 <script>
311 document.addEventListener("DOMContentLoaded", () => {
312 new Swiper("#gallery .swiper-container", {
313 slidesPerView: 1,
314 spaceBetween: 25,
315 centerSlides: true,
316 centerInsufficientSlides: true,
317 navigation: {
318 prevEl: ".btn-prev",
319 nextEl: ".btn-next",
320 },
321 breakpoints: {
322 768: {
323 slidesPerView: 2,
324 spaceBetween: 25,
325 },
326 992: {
327 slidesPerView: 3,
328 spaceBetween: 25,
329 },
330 },
331 });
332
333 var thumbnails = new Swiper("#thumbnail-swiper", {
334 spaceBetween: 10,
335 slidesPerView: 2,
336 centerInsufficientSlides: true,
337 freeMode: true,
338 watchSlidesVisibility: true,
339 watchSlidesProgress: true,
340 breakpoints: {
341 768: {
342 slidesPerView: 3,
343 },
344 992: {
345 slidesPerView: 4,
346 },
347 1200: {
348 slidesPerView: 5,
349 },
350 },
351 });
352
353 var lightbox = new Swiper("#lightbox-swiper", {
354 spaceBetween: 10,
355 autoHeight: true,
356 observer: true,
357 observeSlideChildren: true,
358 keyboard: {
359 enabled: true,
360 },
361 navigation: {
362 nextEl: ".swiper-button-next",
363 prevEl: ".swiper-button-prev",
364 },
365 thumbs: {
366 swiper: thumbnails,
367 },
368 });
369
370 $("#lightbox-modal").on("shown.bs.modal", function (e) {
371 lightbox.update();
372 thumbnails.update();
373 lightbox.slideTo($(e.relatedTarget).data("slider"));
374 lightbox.update();
375 });
376
377 $("#lightbox-modal .swiper-wrapper").on("click", function (e) {
378 if ($(e.target).attr("class").includes("swiper-slide")) {
379 $("#lightbox-modal").modal("hide");
380 }
381 });
382 });
383 </script>
384</#if>