Si è verificato un errore nell'elaborarazione del modello.
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>