MOSCARDO
Tecnologie ICT per il MOnitoraggio Strutturale di Costruzioni Antiche basato su Reti di sensori wireless e DrOni
Si è verificato un errore nell'elaborarazione del modello.
Failed to get value for key "com.liferay.document.library.kernel.util.PDFProcessorUtil"; see cause exception.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign pdfUtil = staticUtil["com.lif... [in template "10155#10195#29852944" at line 12, column 1]
----
1<#setting time_zone=timeZone.ID>
2<#assign defaultLocale="it_IT">
3<#assign imagePath = themeDisplay.getPathThemeImages() />
4
5<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
6<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
7<#assign AssetVocabularyService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyService") />
8<#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
9<#assign DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") />
10<#assign DLAppLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService") />
11<#assign dlUtil = staticUtil["com.liferay.document.library.kernel.util.DLUtil"] />
12<#assign pdfUtil = staticUtil["com.liferay.document.library.kernel.util.PDFProcessorUtil"] />
13
14<#assign article = JournalArticleLocalService.getLatestArticle(groupId, .vars['reserved-article-id'].data) />
15<#assign entry = AssetEntryLocalService.fetchEntry("com.liferay.journal.model.JournalArticle", article.resourcePrimKey) />
16<#assign assetRenderer = entry.getAssetRenderer() />
17<#assign totalPages = 0 />
18
19<#assign hasCookie >
20 <@tor.checkCookieAcceptance siteId=themeDisplay.getScopeGroupId() cookieToCheck="third-party" />
21</#assign>
22
23<style>
24 .asset-full-content p.component-title.h4 {
25 display: none;
26 }
27
28 div.asset-full-content > div.align-items-center:first-of-type {
29 display: none !important;
30 }
31
32 .header-back-to {
33 display: none;
34 }
35
36 .hide-content {
37 visibility: hidden;
38 height: 0;
39 padding: 0px !important;
40 overflow: hidden;
41 position: absolute;
42 height: 1px;
43 }
44
45</style>
46
47<div class="rtds-space-y-5 md:rtds-space-y-8 rtds-background-01">
48 <div class="rtds-container-sm first:rtds-pt-6 first:md:rtds-pt-12 rtds-pb-6 md:rtds-pb-12 ">
49 <div class="rtds-grid md:rtds-grid-cols-12 rtds-gap-6">
50 <div class="md:rtds-col-span-8">
51 <div class="rtds-article-body">
52 <#if (abstract.getData())??>
53 ${abstract.getData()}
54 </#if>
55
56 <#if attachment.getData()?? && (attachment.getData())?has_content >
57
58 <#assign attachment = attachment.getData() />
59 <#assign attachmentArray = attachment?split("/") />
60 <#if (attachmentArray?size >= 5)>
61 <#assign uuid = "${attachmentArray[5]}"?split("?")[0] />
62
63 <#if uuid?has_content >
64 <#assign dlFileEntry = DLFileEntryLocalService.fetchFileEntry(uuid, themeDisplay.getScopeGroupId())!"" />
65
66 <#assign fileEntry = "" />
67 <#if dlFileEntry?has_content >
68 <#assign fileEntry = DLAppLocalService.getFileEntry(dlFileEntry.getFileEntryId()) />
69 </#if>
70
71 <#if fileEntry?has_content>
72 <#assign previewURL = dlUtil.getPreviewURL(fileEntry, fileEntry.getLatestFileVersion(false), themeDisplay, "") + "&previewFileIndex=1" />
73 <#assign img = {
74 "path": "${previewURL}",
75 "alt": "${fileEntry.fileName}"
76 } >
77
78 <#assign fileVersion = fileEntry.getFileVersion() />
79 <#assign totalPages = pdfUtil.getPreviewFileCount(fileVersion) />
80 <section class="rtds-space-y-4 md:rtds-space-y-6">
81 <div>
82 <div class="rtds-section-header">
83 <div class="rtds-flex rtds-items-center rtds-gap-4 md:rtds-gap-6 rtds-content-01">
84 <div class="rtds-flex rtds-flex-wrap rtds-items-center rtds-gap-2 md:rtds-gap-4">
85 <div class="rtds-flex rtds-flex-col rtds-gap-6 rtds-w-full">
86 <div class="rtds-flex rtds-flex-wrap rtds-items-center rtds-gap-2 md:rtds-gap-4">
87 <div class="rtds-vertical-divider rtds-w-4 md:rtds-w-6 lg:rtds-w-8">
88 <img class="rtds-w-full rtds-h-auto"
89 src="${imagePath}/vertical-divider.svg" alt="">
90 </div>
91 <h2 class="rtds-heading-3 md:rtds-heading-2 ">
92 Allegato
93 </h2>
94 </div>
95 </div>
96 </div>
97 </div>
98 </div>
99 </div>
100 <div class="" style="margin-top: 0">
101 <a href="${attachment}" class="rtds-text-link rtds-leading-snug">
102
103 <svg class="rtds-icon rtds-fill-current rtds-w-4 rtds-h-4 rtds-flex-shrink-0 rtds-flex-grow-0"
104 aria-hidden="true" focusable="false" role="img">
105 <use href="${imagePath}/icons.svg#outline--document-arrow-down"/>
106 </svg>
107
108 ${languageUtil.get(request, "download")}
109 </a>
110 </div>
111 <div class="rtds-carousel rtds-carousel-tor splide" aria-label="Titolo sezione" style="margin-top: 0">
112 <div class="rtds-carousel__arrows splide__arrows">
113 <button class="rtds-carousel__arrow rtds-carousel__arrow--prev splide__arrow splide__arrow--prev"
114 aria-label="Slide precedente">
115 <svg class="rtds-icon rtds-fill-current rtds-carousel__arrow-svg"
116 aria-hidden="true"
117 focusable="false" role="img">
118 <use href="${imagePath}/icons.svg#solid--chevron-right"/>
119 </svg>
120 <span class="rtds-sr-only">Slide precedente</span>
121 </button>
122 <button class="rtds-carousel__arrow rtds-carousel__arrow--next splide__arrow splide__arrow--next"
123 aria-label="Slide successivo">
124 <svg class="rtds-icon rtds-fill-current rtds-carousel__arrow-svg"
125 aria-hidden="true"
126 focusable="false" role="img">
127 <use href="${imagePath}/icons.svg#solid--chevron-right"/>
128 </svg>
129 <span class="rtds-sr-only">Slide successivo</span>
130 </button>
131 </div>
132 <div class="rtds-carousel-wrapper splide__track">
133 <ul class="rtds-carousel__list splide__list rtds-space-y-6 md:rtds-space-y-0">
134
135 <figure class="rtds-mt-5">
136 <img id="attachment" class="rtds-rounded-2xl" alt="${img.alt}"
137 src="${img.path}"/>
138 </figure>
139
140 </ul>
141 </div>
142 </div>
143 </section>
144 </#if>
145
146 <#if (video.getSiblings()?has_content) && (video.getSiblings()?size >0)
147 && video.getSiblings()[0].ytCode.getData()?has_content>
148 <section class="rtds-space-y-4 md:rtds-space-y-6">
149 <div>
150 <div class="rtds-section-header">
151 <div class="rtds-flex rtds-items-center rtds-gap-4 md:rtds-gap-6 rtds-content-01">
152 <div class="rtds-flex rtds-flex-wrap rtds-items-center rtds-gap-2 md:rtds-gap-4">
153 <div class="rtds-flex rtds-flex-col rtds-gap-6 rtds-w-full">
154 <div class="rtds-flex rtds-flex-wrap rtds-items-center rtds-gap-2 md:rtds-gap-4">
155 <div class="rtds-vertical-divider rtds-w-4 md:rtds-w-6 lg:rtds-w-8">
156 <img class="rtds-w-full rtds-h-auto"
157 src="${imagePath}/vertical-divider.svg" alt="">
158 </div>
159 <h2 class="rtds-heading-3 md:rtds-heading-2 ">
160 Video
161 </h2>
162 </div>
163 </div>
164 </div>
165 </div>
166 </div>
167 </div>
168 <div class="rtds-container-sm rtds-grid rtds-grid-cols-1 md:rtds-grid-cols-2 rtds-gap-5" style="margin-top: 0">
169 <#list video.getSiblings() as cur_video>
170 <#if (cur_video.getData())??>
171
172 <#assign title = "" />
173 <#assign ytCode = "" />
174 <#assign isPlaylist = "false" />
175
176 <#if (cur_video.videoTitle.getData())??>
177 <#assign title = cur_video.videoTitle.getData() />
178 </#if>
179
180 <#if (cur_video.ytCode.getData())??>
181 <#assign ytCode = cur_video.ytCode.getData() />
182 </#if>
183
184 <#if getterUtil.getBoolean(cur_video.playlist.getData())>
185 <#assign isPlaylist = cur_video.playlist.getData() />
186 </#if>
187
188
189 <div class="rtds-card rtds-card--video rtds-gap-0">
190 <div class="rtds-video-item rtds-border rtds-border-gray-01 rtds-card__video">
191 <div class="rtds-aspect-video">
192 <#if getterUtil.getBoolean(hasCookie)>
193 <iframe title="Video youtube: ${title}" width="1167"
194 height="656"
195 src="https://www.youtube.com/embed/${getterUtil.getBoolean(isPlaylist)?then('videoseries?list=','')}${ytCode}"
196 frameborder="0"
197 allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
198 allowfullscreen=""></iframe>
199 <#else>
200 <#assign videoAnchor = '<a class="rtds-link rtds-font-bold rtds-content-primary" href="https://www.youtube.com/watch?v='+ytCode+'" rel="noopener noreferrer" target="_blank">link</a>' />
201 <#assign youHaveNotAcceptedCookieMsg = languageUtil.format(locale, "you-have-not-accepted-third-party-cookie-x", videoAnchor, false) />
202
203 <span class="rtds-card__title rtds-content-01 rtds-font-normal">
204 ${youHaveNotAcceptedCookieMsg}
205 </span>
206 </#if>
207 </div>
208 </div>
209 <#if title?has_content>
210 <div class="rtds-card__content">
211 <div class="rtds-card__heading">
212 <h3 class="rtds-card__title rtds-content-01 rtds-text-xl rtds-font-semibold">
213 ${title}
214 </h3>
215 </div>
216 </div>
217 </#if>
218 </div>
219 </#if>
220 </#list>
221 </div>
222 </section>
223 </#if>
224 </#if>
225 </#if>
226 </#if>
227 </div>
228 </div>
229 </div>
230 </div>
231</div>
232<div class="rtds-background-01">
233 <@tor.getArticleUpdateInformation entry=entry article="" sharebutton=true />
234</div>
235
236<script>
237 document.addEventListener("DOMContentLoaded", function () {
238 const totalPages = ${totalPages};
239
240 if (totalPages > 0) {
241
242 const img = document.getElementById("attachment");
243 const prevBtn = document.querySelector(".splide__arrow--prev");
244 const nextBtn = document.querySelector(".splide__arrow--next");
245
246 function updatePreviewIndex(delta) {
247 if (!img) return;
248
249 const currentUrl = new URL(img.src);
250 let currentIndex = parseInt(currentUrl.searchParams.get("previewFileIndex")) || 1;
251
252 // Calcolo nuovo indice
253 let newIndex = currentIndex + delta;
254
255 if (newIndex < 1) {
256 newIndex = totalPages;
257 } else if (newIndex > totalPages) {
258 newIndex = 1;
259 }
260
261 currentUrl.searchParams.set("previewFileIndex", newIndex);
262
263 // Aggiorno src
264 img.src = currentUrl.toString();
265 }
266
267 if (prevBtn) {
268 prevBtn.addEventListener("click", function () {
269 updatePreviewIndex(-1);
270 });
271 }
272
273 if (nextBtn) {
274 nextBtn.addEventListener("click", function () {
275 updatePreviewIndex(1);
276 });
277 }
278 }
279
280 });
281</script>