detalle dokuteka-generico-fitxa

Se ha producido un error al procesar la plantilla.
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@5b64356f"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign irudiaJson = jsonFactoryUtil...  [in template "20902#20940#7085098" at line 240, column 41]
----
1<#-- VARIABLES --> 
2<#assign inprimatujarduera = "Inprimatu jarduera"> 
3<#assign bajar = "Jaitsi"> 
4<#assign transcripcion = "Transkripzioa"> 
5<#assign completa = "completa"> 
6<#assign irekijarduera = "Ireki jarduera"> 
7<#assign idioma=locale?substring(0,locale?index_of("_")) > 
8 
9<#-- TRADUCCION --> 
10<#if locale=='en_US'> 
11    	<#assign irekijarduera = 'Go to the exercise'> 
12	<#assign inprimatujarduera = 'Print exercise'> 
13	<#assign bajar = "Download"> 
14	<#assign transcripcion = "Transcription"> 
15</#if> 
16<#if locale=='fr_FR'> 
17    	<#assign irekijarduera = "Aller à l'exercice"> 
18	<#assign inprimatujarduera = "Imprimer l’exercice"> 
19	<#assign bajar = "Télécharger"> 
20	<#assign transcripcion = "Transcription"> 
21</#if> 
22<#if locale=='es_ES'> 
23<#assign irekijarduera = 'Abrir tarea'> 
24	<#assign inprimatujarduera = 'Imprimir tarea'> 
25	<#assign bajar = "Bajar"> 
26	<#assign transcripcion = "Transcripción"> 
27</#if> 
28 
29<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> 
30 
31<#-- JAVASCRIPT --> 
32<script type="text/javascript"> 
33	document.addEventListener("DOMContentLoaded", function () { 
34	 
35	if (window.innerWidth <= 768) { 
36 
37        const relacionados = document.getElementById( 
38            "embedded-articlenextevents-portlet" 
39        ); 
40 
41        const column2 = document.getElementById("column-2"); 
42 
43        if (relacionados && column2) { 
44            column2.after(relacionados); 
45        } 
46				 
47			 document.querySelectorAll('#deskribapena p').forEach(p => { 
48				const estaVacio = p.textContent.trim() === ''; 
49				const tieneImagen = p.querySelector('img, picture'); 
50 
51				if (estaVacio && !tieneImagen) { 
52						p.style.display = 'none'; 
53				} 
54		}); 
55 
56    } 
57 
58			// --- Botones abrir/cerrar transkripzioa --- 
59			$("#trasnkripzioazabaldu").on("click", function (event) { 
60				$("#trasnkripzioedukia").css("display", "block"); 
61					/*$("#trasnkripzioedukia").show();*/ 
62					$("#trasnkripzioazabaldu").hide(); 
63					/*$("#trasnkripzioaestutu").show();*/ 
64					$("#trasnkripzioaestutu").css("display", "inline"); 
65					 
66					return false; 
67			}); 
68 
69			$("#trasnkripzioaestutu").on("click", function (event) { 
70					$("#trasnkripzioedukia").hide(); 
71					$("#trasnkripzioazabaldu").css("display", "inline"); 
72					/*$("#trasnkripzioazabaldu").show();*/ 
73					$("#trasnkripzioaestutu").hide(); 
74					return false; 
75			}); 
76			 
77			const deskribapenak = document.querySelectorAll(".deskribapena:not(.row)"); 
78			const transkripzioa = document.getElementById("transkripzioa"); 
79 
80			const tieneTabla = [...deskribapenak].some(el => el.querySelector("table")); 
81 
82			if (tieneTabla && transkripzioa) { 
83        transkripzioa.style.paddingTop = "10px"; 
84				transkripzioa.style.paddingLeft = "18px"; 
85			} 
86}); 
87 
88</script> 
89 
90<link rel="stylesheet" href="/o/x61tThemeIkasbilWAR-theme/css/scriptVideo.css"> 
91<style type="text/css"> 
92	.play-video-icon{ 
93			position:absolute; 
94			top:50%; 
95			left:50%; 
96			transform:translate(-50%, -50%); 
97			font-size:3rem; 
98			color:white; 
99			cursor:pointer; 
100			opacity:0.9; 
101			text-shadow:0 0 10px rgba(0,0,0,0.7); 
102			transition:transform 0.2s ease; 
103			z-index: 1; 
104	} 
105 
106	.play-video-icon:hover{transform:translate(-50%, -50%) scale(1.1);} 
107	 
108		.card-video div video {   
109	  width: 100%; 
110    height: 100%; 
111    position: relative; 
112    overflow: hidden; 
113		z-index: 1; 
114	} 
115	 
116	.card-video div video {   
117	  width: 100%; 
118    height: 100%; 
119    position: relative; 
120    overflow: hidden; 
121		z-index: 1; 
122	} 
123 
124	.ikasbil .fitxa #deskribapena {text-align: left !important;word-break: break-word;} 
125	.ikasbil .fitxa #deskribapena p{font-size:0.75em;} 
126	#deskribapena figcaption {font-size: .9rem;width: 90%;line-height: normal;} 
127	 
128.fullscreen {z-index: 2789034264 !important; position: absolute !important; width: 80% !important; bottom: 3% !important; left: 10% !important; right: 10% !important; } 
129     .fullscreenBtn { 
130        text-indent: 0px; 
131        color: #fabd48; 
132        background-color: none; 
133        
134        padding: 0px; 
135        font-weight: bold; 
136        padding-bottom: 3px; 
137    } 
138    .exitFullScreenBtn{ 
139        text-indent: 0px; 
140        color: #fabd48; 
141        background-color: none; 
142        padding: 0px; 
143        font-weight: bold; 
144        padding-bottom: 3px; 
145    } 
146     
147	.printhide { 
148		display: none; 
149	} 
150	#trasnkripzioedukia { 
151		padding: 1em; 
152		background-color: #e7e7e7; 
153		color: black !important; 
154		display: none; 
155	} 
156	#transkripzioa { 
157		margin-top: 1em; 
158		margin-bottom: 1em; 
159	} 
160	 
161	#caja-video {float: left;} 
162	#caja-video .botonEnlaceDokuteka {font-size: 16px !important;padding:.5rem;} 
163	.preview-img{object-fit:cover;} 
164	.col img {padding-right: 10px;} 
165	 
166	table {width: 100% !important;} 
167	.videoVertical table {width: 65% !important;} 
168	.videoHorizontal table {width: 100% !important;} 
169	 
170	.bideo-enlaces { 
171		position: relative; 
172		z-index: 1; 
173	} 
174	 
175	@media (max-width: 768px){ 
176		.videoVertical table {width: 100% !important;} 
177		.fitxa #deskribapena img{object-fit:cover;height:200px;} 
178	} 
179</style>			 
180 
181 
182<#assign id = paramUtil.getString(request, "articleId")> 
183<#assign DLAppService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")> 
184<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
185 
186<#assign getterUtil = staticUtil["com.liferay.portal.kernel.util.GetterUtil"] /> 
187 
188 
189 
190<#if id?has_content> 
191 
192    <#if journalArticleLocalService??> 
193        <!-- VISUALIZAR EN PREVIEW --> 
194				<#assign deskribapena = deskribapena.getData() />  
195				<#assign izenburua = izenburua.getData() /> 
196				<#assign laburpena = laburpena.getData() /> 
197				<#assign irudia = irudia.getData() /> 
198				<#assign idMoodle = id_moodle.getData() /> 
199				<#assign idExternalMoodle = id_external_moodle.getData() /> 
200				<#-- <#assign bideoa = bideoa.getData()!"" /> 
201				<#assign youtubeko_bideoa = youtubeko_bideoa.getData()!"" /> 
202				<#assign transkripzioa = transkripzioa.getData()!"" /> 
203				<#assign audio = audioa.getData()!"" />             
204				<#assign irrati_nobela = irratinobelaren_zenbakia.getData()!"" /> --> 
205				 
206				<!-- VISUALIZAR EN PAGINA DETALLE -->	 
207				<#attempt> 
208						<#assign articleById = journalArticleLocalService.getDisplayArticle(groupId?long, id)> 
209						<#assign document = articleById.getDocumentByLocale(locale)>  
210				<#recover> 
211						<#assign articleById = 0> 
212				</#attempt> 
213				 
214				<#if articleById?has_content && document?has_content>		 
215					<#assign izenburua = document.valueOf("//dynamic-element[@field-reference='izenburua']/dynamic-content/text()") /> 
216					<#assign laburpena = document.valueOf("//dynamic-element[@field-reference='laburpena']/dynamic-content/text()") /> 
217					<#assign deskribapena = document.valueOf("//dynamic-element[@field-reference='deskribapena']/dynamic-content/text()") /> 
218					<#assign irudia = document.valueOf("//dynamic-element[@field-reference='irudia']/dynamic-content/text()") /> 
219					<#assign idMoodle = document.valueOf("//dynamic-element[@field-reference='id_moodle']/dynamic-content/text()") /> 
220					<#assign idExternalMoodle = document.valueOf("//dynamic-element[@field-reference='id_external_moodle']/dynamic-content/text()") /> 
221					<#assign bideoa = document.valueOf("//dynamic-element[@field-reference='bideoa2']/dynamic-content/text()") /> 
222					 
223					<#--Si no encuentra bideoa2 al ser de estructura vieja, coger el campo bideo--> 
224					<#if !bideoa?has_content> 
225							<#assign bideoa = document.valueOf("//dynamic-element[@field-reference='bideoa']/dynamic-content/text()") /> 
226					</#if> 
227					 
228					<#assign bertikal = document.valueOf("//dynamic-element[@field-reference='bertikal']/dynamic-content/text()")!"" >  
229					<#assign youtubeko_bideoa = document.valueOf("//dynamic-element[@field-reference='youtubeko_bideoa']/dynamic-content/text()") /> 
230					<#assign transkripzioa = document.valueOf("//dynamic-element[@field-reference='transkripzioa']/dynamic-content/text()") /> 
231					<#assign audio = document.valueOf("//dynamic-element[@field-reference='audioa']/dynamic-content/text()") />             
232					<#assign irrati_nobela = document.valueOf("//dynamic-element[@field-reference='irratinobelaren_zenbakia']/dynamic-content/text()") />  
233				</#if> 
234				 
235			<#assign videoUrl = "" /> 
236			<#assign posterUrl = "" /> 
237			 
238			<#-- Procesar irudia si tiene contenido --> 
239			<#if irudia?has_content && irudia?contains("uuid")> 
240					<#assign irudiaJson = jsonFactoryUtil.createJSONObject(irudia) /> 
241					<#assign posterEntry = DLAppService.getFileEntryByUuidAndGroupId(irudiaJson.getString("uuid"), irudiaJson.getLong("groupId")) /> 
242					<#assign posterUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" 
243							+ posterEntry.getGroupId() + "/" + posterEntry.getFolderId() + "/" + htmlUtil.escapeURL(posterEntry.getTitle()) + "/" + posterEntry.getUuid() 
244							+ "?t=" + posterEntry.getModifiedDate()?long /> 
245			</#if>  
246 
247			<#-- Procesar bideoa si tiene contenido --> 
248			<#if bideoa?has_content && bideoa?contains("uuid")> 
249					<#assign bideoJson = jsonFactoryUtil.createJSONObject(bideoa) />	 
250					<#assign videoEntry = DLAppService.getFileEntryByUuidAndGroupId(bideoJson.getString("uuid"), bideoJson.getLong("groupId")) /> 
251					<#assign videoUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" 
252							+ videoEntry.getGroupId() + "/" + videoEntry.getFolderId() + "/" + htmlUtil.escapeURL(videoEntry.getTitle()) + "/" + videoEntry.getUuid() 
253							+ "?t=" + videoEntry.getModifiedDate()?long /> 
254			</#if> 
255			 
256			<#-- IF AUDIO TIENE CONTENIDO --> 
257			<#if audio?has_content && audio?contains("uuid")> 
258				<#assign audioJson = jsonFactoryUtil.createJSONObject(audio) /> 
259				<#assign posterEntryA = DLAppService.getFileEntryByUuidAndGroupId(audioJson.getString("uuid"), audioJson.getLong("groupId")) /> 
260				<#assign audioUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" 
261						+ posterEntryA.getGroupId() + "/" + posterEntryA.getFolderId() + "/" + htmlUtil.escapeURL(posterEntryA.getTitle()) + "/" + posterEntryA.getUuid() 
262						+ "?t=" + posterEntryA.getModifiedDate()?long /> 
263			</#if>                   
264 
265        <div class="fitxa separadorIzq">  
266			<#if irrati_nobela !=""> 
267				<div id="numCapi"></div> 
268				<#assign articleIrrati = journalArticleLocalService.getDisplayArticle(getterUtil.getLong(groupId), irrati_nobela) /> 
269				<#assign documentIrrati = saxReaderUtil.read(articleIrrati.getContentByLocale(locale)) > 
270				<#assign zenbakiakIrrati = documentIrrati.valueOf("//dynamic-element[@name='zenbakiak']") /> 
271				<#assign numeros = documentIrrati.selectNodes("//dynamic-element[@name='zenbakiak']") /> 
272				<#assign primero= '0' /> 
273				<#assign ultimo= '0' /> 
274				<#assign anterior= '0' /> 
275				<#assign siguiente= '0' /> 
276				 
277				<#assign atzera= '0' /> 
278				<#assign aurrera= '0' /> 
279				<#assign lehena= '0' /> 
280				<#assign azkeana= '0' /> 
281				<#assign atzekoa= '0' /> 
282				<#assign aurkitua= false /> 
283				<#list numeros as numero> 
284					<#assign zenbakia = numero.valueOf("dynamic-content/text()") /> 
285					<#if primero == '0'> 
286					    <#assign primero= zenbakia /> 
287					</#if> 
288					<#if anterior == '0'> 
289					    <#assign anterior= zenbakia /> 
290					</#if> 
291					<#if id == zenbakia> 
292					   <#assign atzera= anterior /> 
293					   <#assign aurkitua= true /> 
294					</#if> 
295			        <#if aurkitua && anterior == id > 
296					   <#assign aurrera= zenbakia /> 
297					   <#assign aurkitua= true /> 
298					</#if> 
299			    	<#if lehena =='0'> 
300			    	    <#assign lehena= id /> 
301			    	</#if> 
302				    <#assign anterior= zenbakia /> 
303				    
304				    <#assign ultimo= zenbakia /> 
305				</#list> 
306		 
307				<#assign url_docuteka_detalle= "/${idioma}/dokutekako-fitxa?articleId=" /> 
308				<div class="paginacion"> 
309					<div id="paginacionMenuIni"> 
310					 
311					<#if primero!=id> 
312						<a id="orriajalehena" href="${url_docuteka_detalle}${primero}" >&lt; &lt; |</a> 
313					<#else> 
314						<span class="aurreraatzerades">&lt; &lt; |</span> 
315			        </#if> 
316			        <#if atzera !='0' > 
317							<a id="orriajaatzera" href="${url_docuteka_detalle}${atzera}" >&lt; |</a> 
318			        <#else> 
319						<span class="aurreraatzerades">&lt; |</span> 
320			        </#if> 
321			            <a href="/${idioma}/irrati-nobelak-fitxa?articleId=${irrati_nobela}"> Irrati Nobeletako Fitxara joan </a> 
322			        <#if aurrera != '0'> 
323						<a id="orriajaaurrera" href="${url_docuteka_detalle}${aurrera}" >| &gt;</a> 
324			        <#else> 
325						<span class="aurreraatzerades">| &gt;</span> 
326			        </#if> 
327        			<#if ultimo != '0'> 
328        						<a id="orriajaazkena" href="${url_docuteka_detalle}${ultimo}" >| &gt; &gt;</a> 
329        			<#else> 
330        						<span class="aurreraatzerades">| &gt; &gt;</span> 
331        			</#if> 
332					</div> 
333				</div> 
334			</#if> 
335			 
336      <#-- <h2>${izenburua}</h2> --> 
337			<h2>${izenburua!""}</h2> 
338	 
339      <div id="impedukia" class="col-xs-12 col-md-12 col-lg-12">  
340         
341             
342      <h3>${laburpena!""}</h3> 
343             
344				<div id="ataza"> 
345					<#if idMoodle !="" || idExternalMoodle !=""> 
346						<a class="jarduerabtn" href="#"><label>${irekijarduera}</label></a> 
347					</#if> 
348		 
349				</div> 
350								 
351			<!--  
352			DESKRIBAPENA - Disenu barria 2026-02-13  
353			--> 
354			<#assign bideoVertikal = bertikal == "true"> 
355			 
356			<div class="deskribapena <#if bideoVertikal && videoUrl?has_content>videoVertical<#elseif !bideoVertikal && videoUrl?has_content>videoHorizontal</#if>" id="deskribapena"> 
357				<div id="caja-video" <#if bideoVertikal && videoUrl?has_content> class="col-12 col-md-4" <#elseif !bideoVertikal && videoUrl?has_content> class="col-12 col-md-5"</#if> > 
358					<#if videoUrl?has_content> 
359						<div id="bideo" class="card-video"> 
360 
361								<#if !videoUrl?contains(".flv")> 
362											<div class="h-100 video-wrapper position-relative"> 
363												<!-- PREVIEW (imagen + play) --> 
364													<div class="h-100 mb-2 video-preview position-relative w-100"> 
365															<img src="${posterUrl}" class="img-fluid w-100 h-100 preview-img"> 
366															<i class="bi bi-play-circle-fill play-video-icon"></i> 
367													</div> 
368 
369													<!-- VIDEO OCULTO --> 
370													<video  
371															class="nireBideoa d-none w-100 h-100" 
372															controls 
373															preload="auto" 
374 
375															playsinline> 
376															<source src="${videoUrl}" type="video/mp4"> 
377													</video> 
378 
379													<#--<video class="nireBideoa d-none w-100 h-100" src="${videoUrl}" controls preload="auto" playsinline></video>--> 
380										 	</div> 
381									</#if>				 
382 
383							</div> 
384 
385							<!-- DESCARGA VIDEO --> 
386							<#if videoUrl?has_content> 
387								<div class="mt-2 bideo-enlaces"> 
388									<a class="botonEnlaceDokuteka" href="${videoUrl}" target="_blank">${bajar} <i class="fa fa-download"></i></a> 
389								</div> 
390							</#if> 
391 
392							<!-- DESCARGA AUDIO --> 
393							<#if audio?has_content> 
394								<a class="botonEnlaceDokuteka" href="${audioUrl}" target="_blank">${bajar} <i class="fa fa-download"></i> </a> 
395								<div style="clear:both"></div> 
396							</#if> 
397					</#if> 
398				</div> 
399				<!-- DESKRIBAPENA --> 
400				<#if videoUrl?has_content> 
401					<#assign deskribapenaSinImg = deskribapena?replace("<img[^>]*>", "", "r")> 
402					<!--Quitar "Irudia: XX" en videos horizontales a peticion de Eider--> 
403					<#assign deskribapenaSinImg = deskribapenaSinImg?replace( 
404						"<p[^>]*>.*Irudia:.*</p>", 
405						"", 
406						"r" 
407					)> 
408				<#else> 
409					<#assign deskribapenaSinImg = deskribapena> 
410				</#if> 
411				 
412				<div class="col">${deskribapenaSinImg}</div>  
413			</div> 
414 
415				<!-- AUDIO CONTROLS --> 
416				<#if audio?has_content> 
417					<a class="botonEnlaceDokuteka" style="margin-top:10px;margin-left:18px" href="${audioUrl}" target="_blank">${bajar} <i class="fa fa-download"></i> </a> 
418					<div id="audio"> 
419						<div> 
420							<audio controls class="anchoAudio"> 
421								<source src="audio.ogg" type="audio/ogg"> 
422								<source src="${audioUrl}" type="audio/mp3"> 
423							</audio> 
424						</div> 
425					</div> 
426				</#if> 
427				 
428				<#if transkripzioa !=""> 
429					<div id="transkripzioa"> 
430						<a id="trasnkripzioazabaldu" class="botonEnlaceDokuteka" href="#"> ${transcripcion}:[+]</a> 
431						<a id="trasnkripzioaestutu" href="#" class="printhide botonEnlaceDokuteka"> ${transcripcion}:[-]</a> 
432						<!-- VER / OCULTAR TRANSCRIPCION --> 
433						<div id="trasnkripzioedukia"> 
434							${transkripzioa} 
435						</div> 
436					</div> 
437				</#if>	 
438			 
439 
440				<#--<#if videoUrl?has_content> 
441						<div id="bideo"> 
442								<a class="botonEnlaceDokuteka" href="${videoUrl}" target="_blank">${bajar} <i class="fa fa-download"></i></a> 
443								<#if !videoUrl?contains(".flv")> 
444										<div> 
445												<video controls width="95%" <#if posterUrl?has_content>poster="${posterUrl}"</#if>> 
446														<source src="${videoUrl}" type="video/mp4"> 
447														Your browser does not support the video tag. 
448												</video> 
449										</div> 
450								</#if> 
451						</div> 
452				</#if>--> 
453				 
454				<!-- YOUTUBE BIDEOA --> 
455				<#if youtubeko_bideoa !=""> 
456					<div id="bideoyoutubeko"> 
457						${youtubeko_bideoa} 
458					</div> 
459				</#if> 
460			 
461				 
462				</div> 
463		</div> 
464		 
465		<div id="embedded-articlenextevents-portlet"> 
466			<@liferay_portlet["runtime"] portletName="x61pRelaContWAR_WAR_x61pRelaContWARportlet" queryString="idArticulo=${id}&visualizacion=${completa}"/> 
467		</div> 
468 
469    </#if> 
470</#if> 
471<#if bideoa?has_content> 
472	<script src="/o/x61tThemeIkasbilWAR-theme/js/scriptVideo9.js"></script> 
473</#if> 
474 
475<script> 
476document.addEventListener("DOMContentLoaded", () => { 
477	const videos = document.querySelectorAll(".nireBideoa"); 
478 
479  videos.forEach(video => { 
480    video.addEventListener("play", () => { 
481      videos.forEach(other => { 
482        if (other !== video) { 
483          other.pause(); 
484        } 
485      }); 
486    }); 
487  }); 
488	 
489 
490    document.querySelectorAll(".video-wrapper").forEach(wrapper => { 
491 
492        const preview = wrapper.querySelector(".video-preview"); 
493        const playIcon = wrapper.querySelector(".play-video-icon"); 
494        const video = wrapper.querySelector(".nireBideoa"); 
495			 
496 
497        if (!preview || !playIcon || !video) return; 
498 
499        playIcon.addEventListener("click", e => { 
500            e.preventDefault(); 
501            e.stopPropagation();       
502 
503            // Ocultar preview del actual 
504            preview.classList.add("d-none"); 
505 
506            // Mostrar vídeo actual 
507            video.classList.remove("d-none"); 
508 
509            // Reproducir actual 
510            video.currentTime = 0; 
511            video.play(); 
512        }); 
513    }); 
514}); 
515</script> 

detalle2

Docuteca

B1
21-01-2004

x61pRelaContWAR

16339790

x61pViewCountWAR

4364

anadir a favorito

x61pAnadirFavoritoWAR