Publicador de contenidos

Se ha producido un error al procesar la plantilla.
No error description was specified for this error; low-level message: java.lang.ClassNotFoundException: com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil cannot be found by com.liferay.portal.template.freemarker_3.0.37

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign journalArticleLocalServiceUti...  [in template "20155#20195#7924243" at line 520, column 1]
----
1<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyADxO5pq3U3jcHoM1SMQ9FFvIPlENolN5k&language=${locale.getLanguage()}&region=${locale.getCountry()}" type="text/javascript"></script> 
2 
3<script type="text/javascript"> 
4     
5     
6	window.onload = function() { 
7      // Se cargan las oficinas 
8        initLoad(); 
9  	    loadCentros(); 
10 
11    }; 
12	 
13	$( window ).resize(function() { 
14		console.log("cambia windows"); 
15	  initLoad(); 
16	}); 
17	 
18	// Variable que guarda los datos de los centros 
19	var centros = []; 
20	 
21	// Variable que guarda el html de los resultados encontrados 
22	var side_bar_html = ""; 
23 
24	// Array para guardar todos los marcadores 
25	var gmarkers = []; 
26	var gmarkersshow = []; 
27 
28	// Variables globales 
29	var map; 
30	var circle = null; 
31	var geocoder; 
32	var busquedaRealizada = false; 
33	var marker_you; 
34	var userMarker; 
35	var directionsService; 
36	var directionsDisplay; 
37	var infowindow; 
38	var defaultCoordinates = {lat: 40.4168508 ,lng:-3.7031067}; 
39	 
40	// Variable global para saber si se tiene o no geolocalizacion 
41	var geoActive = true; 
42	 
43	//Variable para guardar objeto scrollbar 
44	var scrollbar; 
45 
46	//Genera arrays de centros 
47    function addCentros (contador,nombre,direccion,latitud,longitud,enlace,telefono){ 
48        var entryLocation = [nombre,direccion,latitud,longitud,enlace,telefono]; 
49        centros[contador] = entryLocation; 
50
51 
52	//Funcion que muestra error por consola si no se puede utilizar la geolocalizacion del usuario 
53	function showError() { 
54		console.log("Location can't be found"); 
55		geoActive = false; 
56		 
57		if(directionsService == null || directionsService == "undefined"){ 
58			directionsService = new google.maps.DirectionsService(); 
59
60		if(directionsDisplay == null || directionsDisplay == "undefined"){ 
61			directionsDisplay = new google.maps.DirectionsRenderer(); 
62
63		if(infowindow == null || infowindow == "undefined"){ 
64			infowindow = new google.maps.InfoWindow({  
65				size: new google.maps.Size(150,50) 
66			}); 
67
68		map = new google.maps.Map(document.getElementById("map_canvas"), { 
69			zoom: 8, 
70			center: {lat: 40.4169473, lng: -3.7079059} 
71			 
72		}); 
73		 
74		// Crea evento para sacar infoWindows 
75		google.maps.event.addListener(map, 'click', function() { 
76			infowindow.close(); 
77		}); 
78	 
79		// Funcion autocompletar para el campo de texto 
80		var autocomplete = new google.maps.places.Autocomplete(document.getElementById('address')); 
81		autocomplete.bindTo('bounds', map); 
82		 
83		searchRadius(defaultCoordinates); 
84	 
85		// Se hace focus en el campo de texto de la direccion una vez que todo este cargado 
86		$(".js_input_dir").select(); 
87
88	 
89	// Funcion para crear marcadores 
90	function createMarker(latlng, name, html_infow, html_res, indice) { 
91		// Contenido del infoWindow 
92		var contentString = html_infow; 
93 
94		// Marcador 
95		var marker = new google.maps.Marker({ 
96			icon: '/constcaonl-public-theme/images/ovalado_rojo.png', 
97			position: latlng, 
98			title: name, 
99			//	zIndex: Math.round(latlng.lat()*-100000)<<5, 
100			zIndex: Math.round(latlng.lat*-100000)<<5, 
101			info: html_res, 
102			ind: indice 
103		}); 
104	 
105		// Evento para lanzar la infoWdindows al hacer click sobre el marcador 
106		google.maps.event.addListener(marker, 'click', function() { 
107			infowindow.setContent(contentString);  
108			infowindow.open(map,marker); 
109		}); 
110		 
111		// Guarda el marcador en el array global 
112		gmarkers.push(marker); 
113
114	 
115	// Funcion initLoad 
116	function initLoad(){ 
117		console.log("Entramos en la funcion del callback"); 
118		// INICIALIZACION 
119		geocoder = new google.maps.Geocoder(); 
120		if (navigator.geolocation) { 
121		    var options = { 
122		        enableHighAccuracy: true, 
123		        maximumAge: 0 
124
125			navigator.geolocation.getCurrentPosition(initializeMaps, showError, options); 
126
127		else { 
128			console.log("El navegador no soporta geolocalización"); 
129
130	    // FIN INICIALIZACION 
131
132 
133	// Funcion ejecutada al CARGAR LA PÁGINA 
134	function initializeMaps(userPosition) { 
135		// Define las opciones del mapa 
136		userMarker = userPosition; 
137		var myOptions = { 
138			zoom: 8, 
139			center: new google.maps.LatLng(userPosition.coords.latitude, userPosition.coords.longitude), 
140			mapTypeControl: true, 
141			mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}, 
142			navigationControl: true, 
143			mapTypeId: google.maps.MapTypeId.ROADMAP 
144		}; 
145		 
146		// Define el mapa 
147		map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
148	 
149		// Crea evento para sacar infoWindows 
150		google.maps.event.addListener(map, 'click', function() { 
151			infowindow.close(); 
152		}); 
153		 
154		if(directionsService == null || directionsService == "undefined"){ 
155			directionsService = new google.maps.DirectionsService(); 
156
157		if(directionsDisplay == null || directionsDisplay == "undefined"){ 
158			directionsDisplay = new google.maps.DirectionsRenderer(); 
159
160		if(infowindow == null || infowindow == "undefined"){ 
161			infowindow = new google.maps.InfoWindow({  
162				size: new google.maps.Size(150,50) 
163			}); 
164
165	 
166		// Funcion autocompletar para el campo de texto 
167		var autocomplete = new google.maps.places.Autocomplete(document.getElementById('address')); 
168		autocomplete.bindTo('bounds', map); 
169	  
170	    //se crea el marcador de posición del usuario 
171	    //marcador = new google.maps.Marker({   
172        //    position: new google.maps.LatLng(userPosition.coords.latitude, userPosition.coords.longitude), 
173        //    icon: 'http://opendatacon.org/wp-content/uploads/2016/05/Farm-Fresh_star.png', 
174        //    title: "Usted está aquí", 
175        //    map: map 
176        //}); 
177		 
178		searchRadius(); 
179 
180		// Se hace focus en el campo de texto de la direccion una vez que todo este cargado 
181		$(".js_input_dir").select(); 
182
183	 
184	function searchRadius(coordinates){ 
185		//se saca la dirección del usuario según sus coordenadas (si no se encuentra se fija la puerta de sol como punto de partida) 
186		var userPosic = 'Plaza Puerta del Sol, 28013 Madrid'; 
187		var latlng; 
188		 
189		if(coordinates != null){ 
190			latlng = coordinates; 
191		}else{ 
192			var input = (userMarker.coords.latitude+","+userMarker.coords.longitude); 
193	        var latlngStr = input.split(',', 2); 
194	        latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])}; 
195
196		 
197        geocoder.geocode({'location': latlng}, function(results, status) { 
198            if (status === google.maps.GeocoderStatus.OK) { 
199            		console.log(results[0].formatted_address); 
200                if (results[0]) { 
201                    userPosic = results[0].formatted_address; 
202                } else { 
203                    window.alert('No results found'); 
204
205            } else { 
206                window.alert('Geocoder failed due to: ' + status); 
207
208 
209    		//se buscan los centros que estén a menos de 6km del usuario 
210    		var searchAddress = userPosic; 
211    		var radVal = 6; 
212    		var radius = 600000; 
213            $(".rad_err_msg").hide(); 
214    			if(searchAddress != null && searchAddress != ""){ 
215    				// Ejecutamos con timeOut de 200ms para evitar el queryLimit de google 
216    				setTimeout(function(){ 
217    					$(".div_lista").fadeIn(); 
218    					exe_code_address(searchAddress, radius); 
219    				}, 200); 
220
221        }); 
222		 
223
224	 
225	 
226    // Funcion para procesar los centros 
227	function loadCentros(){ 
228		// Para cada centro se genera un marcador y una infoWindow 
229		for(var i = 0; i < centros.length; i++){ 
230			var centroName = centros[i][0]; 
231			var centroAddress = centros[i][1]; 
232			var centroLatitud = centros[i][2]; 
233			var centroLongitud = centros[i][3]; 
234			var enlaceAWeb = centros[i][4]; 
235			var centroTlf = centros[i][5]; 
236 
237			var latlng = {lat: parseFloat(centroLatitud), lng: parseFloat(centroLongitud)}; 
238			 
239			var urlCentro = ""; 
240            if("" != enlaceAWeb && null != enlaceAWeb){ 
241                urlCentro = '<div class="center_url">'+ 
242							'<a class="btn btn-primary" href="'+ enlaceAWeb +'" target="_blank"> Sitio web </a>'+ 
243						'</div>'; 
244
245             
246			var html_inf =  
247				'<div id="content_gmap">'+ 
248					'<div class="center_data_wrapper" onclick="javascript:myclick({index})">'+ 
249						'<div class="evo-form__text-info office_data">'+ 
250							'<p class="center_title">'+centroName+'</p>'+ 
251							'<p class="center_address">'+centroAddress+'</p>'+ 
252							'<p class="center_tlf">'+centroTlf+'</p>'+ 
253						'</div>'+ 
254					'</div>'+ 
255					'<div class="howToGo">'+ 
256						'<a class="btn btn-primary" href="javascript:void(0);" onclick="arriveTo(\'' + centroAddress + '\');"> ${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.como.llegar")} </a>'+ 
257					'</div>'+ 
258					urlCentro + 
259				'</div>'; 
260				 
261		   var html_res =  
262			   '<div id="content_gmap">'+ 
263					'<div class="center_data_wrapper" onclick="javascript:myclick({index})">'+ 
264						'<div class="center_data">'+ 
265							'<p class="center_title">'+centroName+'</p>'+ 
266							'<p class="center_address">'+centroAddress+'</p>'+ 
267							'<p class="center_tlf">'+centroTlf+'</p>'+ 
268						'</div>'+ 
269					'</div>'+ 
270					'<div class="howToGo">'+ 
271						'<a class="btn btn-primary" href="javascript:void(0);" onclick="arriveTo(\'' + centroAddress + '\');"> ${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.como.llegar")} </a>'+ 
272					'</div>'+ 
273					urlCentro + 
274				'</div>'; 
275			//Se crea el marcador en las coordenadas de los centros 
276			var marker = createMarker(latlng, centroName, html_inf, html_res, i); 
277
278
279 
280 
281	var marcador; 
282	// Funcion para atender la direccion introducida en el formulario 
283	function codeAddress() { 
284		//se crea el marcador de posición del usuario con datos por defecto 
285		var latitude = defaultCoordinates.lat; 
286		var longitude = defaultCoordinates.lng; 
287		 
288		if(userMarker != undefined){ 
289			latitude = userMarker.coords.latitude; 
290			longitude = userMarker.coords.longitude; 
291
292		 
293	    marcador = new google.maps.Marker({   
294            position: new google.maps.LatLng(latitude, longitude), 
295            icon: "/tCuida-theme/images/content/pin-position.png", 
296            title: "Usted está aquí", 
297            map: map 
298        }); 
299         
300		//Se resetea el "como llegar",las indicaciones y se cierran la infowindow que hubiese abierta 
301		if(directionsDisplay != null){ 
302			directionsDisplay.setMap(null); 
303
304		$("#map_indications").html(""); 
305		  
306		if(infowindow)infowindow.close(); 
307		var searchAddress = $("#address").val(); 
308		var radVal = $("#radius").val(); 
309		var radius = parseInt($("#radius").val(), 10)*1000; 
310		 
311		if(radVal > 0 && radVal <= 500){ 
312			$(".rad_err_msg").hide(); 
313			if(searchAddress != null && searchAddress != ""){ 
314				// Ejecutamos con timeOut de 200ms para evitar el queryLimit de google 
315				setTimeout(function(){ 
316					$(".div_lista").fadeIn(); 
317					exe_code_address(searchAddress, radius); 
318				}, 200); 
319
320		}else{ 
321			$(".rad_err_msg").show(); 
322
323
324	 
325	function exe_code_address(searchAddress, radius){ 
326		//	Flag de busqueda realizada para evento del input de radio 
327		busquedaRealizada = true; 
328		 
329		// El marcador de la posicion buscada se reinicia en cada busqueda 
330		if(marker_you != null){ 
331			marker_you.setMap(null); 
332
333		 
334		// Se situa un marcador en el mapa con los datos recogidos 
335		geocoder.geocode({ 'address': searchAddress}, function(results, status) { 
336			if (status == google.maps.GeocoderStatus.OK) { 
337				map.setCenter(results[0].geometry.location); 
338				map.setZoom(8); 
339				var searchCenter = results[0].geometry.location; 
340				/* 
341				var searchAddressComponents = results[0].address_components; 
342				var searchPostalCode = ""; 
343				var searchCity = ""; 
344 
345			    $.each(searchAddressComponents, function(){ 
346                    if(this.types[0]=="postal_code"){ 
347                        searchPostalCode=this.short_name; 
348                    } else if (this.types[0]=="locality"){ 
349                        searchCity = this.short_name; 
350
351                }); 
352 
353                // Codigo para enviar a analytics . si hay psotal code se enva CP, si no city 
354                var titleBusqueda=searchPostalCode; 
355                if (titleBusqueda == ""){ 
356                    titleBusqueda=searchCity; 
357
358                ga('send', 'event', 'tCuida', 'busqueda_farmacias', titleBusqueda,{ 'dimension1': 'tCuida' }); 
359                */ 
360                //...... 
361 
362				marker_you = new google.maps.Marker({ 
363					map: map, 
364					position: results[0].geometry.location, 
365					icon: "/tCuida-theme/images/content/pin-position.png", 
366				}); 
367				 
368				// Se crea un circulo con el radio provisto en el formulario 
369				if (circle) circle.setMap(null); 
370				circle = new google.maps.Circle({ 
371					center:searchCenter, 
372					radius: radius, 
373					fillColor: "#999", 
374					strokeWeight: 1, 
375					fillOpacity: 0.2, 
376					map: map 
377				}); 
378				 
379				// Se reinicia la lista de resultados 
380				side_bar_html = ""; 
381				gmarkersshow = []; 
382				 
383				var bounds = new google.maps.LatLngBounds(); 
384				var foundMarkers = 0; 
385				 
386				//Añadimos el marker del sitio buscado al bounds 
387				bounds.extend(marker_you.getPosition()); 
388				 
389				// Se pintan en la lista todos los resultados 
390				for(var i = 0; i < gmarkers.length; i++){ 
391					if (google.maps.geometry.spherical.computeDistanceBetween(gmarkers[i].getPosition(),searchCenter) < radius) { 
392						bounds.extend(gmarkers[i].getPosition()); //Se anade la posicion de todos los markers para expandir la vista y que salgan todos en el mapa 
393						gmarkers[i].setMap(map); 
394						var distanceToCenter = google.maps.geometry.spherical.computeDistanceBetween(gmarkers[i].getPosition(),searchCenter); 
395						gmarkersshow.push({marker: gmarkers[i], dist: distanceToCenter}); 
396						foundMarkers++; 
397					}else{ 
398						gmarkers[i].setMap(null); 
399
400
401				 
402				// Se ordena el array de maracadores visibles por distancia 
403				gmarkersshow = gmarkersshow.sort(function(a,b){return a.dist - b.dist;}); 
404				 
405				// Se pintan en la lista todos los resultados ordenados por distancia 
406				var distance; 
407				side_bar_html +='<div class="info_container">'; 
408				for(var i = 0; i < gmarkersshow.length; i++){ 
409					distance = round((gmarkersshow[i].dist / 1000), 2); 
410					side_bar_html += '<div class="info_fcia_side_bar div_side_bar_' + i + '">'; 
411                    side_bar_html += '<div class="info_fcia_distance"><span class="text-base">' + distance + ' km.</span></div>'; 
412                    side_bar_html += (gmarkersshow[i].marker.info).replace("{index}", i); 
413                    side_bar_html += '</div>'; 
414
415				side_bar_html +='</div>'; 
416				// Si hay resultados que cumplan el criterio del radio, se anaden a la lista 
417				if(foundMarkers > 0){ 
418					if(foundMarkers == 1){ 
419						side_bar_html = "<div class=\"titulosidebar\"><p class=\"title_results_gmaps\"><strong>" + foundMarkers + '</strong> ${languageUtil.get(locale, "com.cofares.liferay.adt.mapa.empresas.resultado")} ${languageUtil.get(locale, "com.cofares.liferay.adt.mapa.empresas.encontrado")}:</p></div>' + side_bar_html; 
420					}else{ 
421						side_bar_html = "<div class=\"titulosidebar\"><p class=\"title_results_gmaps\"><strong>" + foundMarkers + '</strong> ${languageUtil.get(locale, "com.cofares.liferay.adt.mapa.empresas.resultado")}s ${languageUtil.get(locale, "com.cofares.liferay.adt.mapa.empresas.encontrado")}s:</p></div>' + side_bar_html; 
422
423				}else{ 
424					side_bar_html = "<div class=\"p_aviso_side_bar\"><p class=\"evo-form__text-info js_result_no_found\">No se han encontrado resultados. Por favor, busca en otro lugar o amplía el radio de búsqueda.</p></div>"; 
425
426 
427				// Coloca la lista en el sitio que le corresponde 
428				document.getElementById("side_bar").innerHTML = side_bar_html; 
429				if (foundMarkers > 0) { 
430					map.fitBounds(bounds); 
431				} else{ 
432					map.fitBounds(circle.getBounds()); 
433
434
435			$(".info_container").mCustomScrollbar({ 
436                axis:"y" 
437            }); 
438		}); 
439
440	 
441	// Metodo para redondear a los decimales 
442	function round(value, decimals) { 
443		return Number(Math.round(value+'e'+decimals)+'e-'+decimals); 
444
445	 
446	// Evento para lanzar la infoWindow al clickar sobre el marcador 
447	function myclick(i) { 
448		google.maps.event.trigger(gmarkersshow[i].marker, "click"); 
449
450	 
451	//Funcion para utilizar la api de google maps de "cómo llegar" 
452	function arriveTo(address) { 
453		var request; 
454         
455        //eliminamos el marcador de la posición del usuario si se muestra 
456        if (marcador != null  && marcador!=""){ 
457            marcador.setMap(null); 
458
459         
460        //se saca la dirección del usuario según sus coordenadas (si no se encuentra se fija la puerta de sol como punto de partida) 
461		var userPosic = 'Plaza Puerta del Sol, 28013 Madrid'; 
462		var latlng; 
463		 
464		if(userMarker == null){ 
465			latlng = defaultCoordinates; 
466		}else{ 
467			var input = (userMarker.coords.latitude+","+userMarker.coords.longitude); 
468	        var latlngStr = input.split(',', 2); 
469	        latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])}; 
470
471         
472        geocoder.geocode({'location': latlng}, function(results, status) { 
473            if (status === google.maps.GeocoderStatus.OK) { 
474                if (results[0]) { 
475                    userPosic = results[0].formatted_address; 
476                } else { 
477                    window.alert('No results found'); 
478
479            } else { 
480                window.alert('Geocoder failed due to: ' + status); 
481
482 
483    		if(geoActive){ 
484    			request = { 
485    				//origin: new google.maps.LatLng(userMarker.coords.latitude, userMarker.coords.longitude), 
486    				origin: userPosic, 
487    				destination: address, 
488    				travelMode: google.maps.TravelMode.DRIVING, 
489    				unitSystem: google.maps.UnitSystem.METRIC, 
490    				provideRouteAlternatives: true 
491    			}; 
492    		}else{ 
493    			request = { 
494    				origin: userPosic, 
495    				destination: address, 
496    				travelMode: google.maps.TravelMode.DRIVING, 
497    				unitSystem: google.maps.UnitSystem.METRIC, 
498    				provideRouteAlternatives: true 
499    			}; 
500
501     
502    		directionsService.route(request, function(results, status) { 
503    			if (status == google.maps.DirectionsStatus.OK) { 
504    				if (circle) circle.setMap(null); 
505    				if(infowindow)infowindow.close(); 
506    				directionsDisplay.setMap(map); 
507    				directionsDisplay.setPanel($("#map_indications").get(0)); 
508    				directionsDisplay.setDirections(results); 
509    			} else { 
510    				console.log("No existen rutas entre ambos puntos"); 
511
512    		}); 
513        }); 
514
515</script> 
516 
517 
518<#assign getterUtil = staticUtil["com.liferay.portal.kernel.util.GetterUtil"]/> 
519<#assign groupId = themeDisplay.getScopeGroupId()/> 
520<#assign journalArticleLocalServiceUtil = staticUtil["com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil"]/> 
521<#assign structureID = 1907194/>  
522<#assign dDMStructureLocalServiceUtil = staticUtil["com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil"]/> 
523<#assign s = dDMStructureLocalServiceUtil.getDDMStructure(structureID)/> 
524<#assign articulos = journalArticleLocalServiceUtil.getStructureArticles(groupId, s.getStructureKey())/> 
525 
526<#if articulos?has_content> 
527    <#assign contador = 0 /> 
528    <#list articulos as entry> 
529        <#assign latestVersion = journalArticleLocalServiceUtil.getLatestVersion(groupId, entry.getArticleId())/> 
530 
531        <#if latestVersion==entry.getVersion()> 
532            <#assign docXml = saxReaderUtil.read(entry.getContent()) /> 
533            <#assign nombre = entry.getTitle(locale) /> 
534            <#assign direccion = docXml.valueOf("//dynamic-element[@name='Direccion']/dynamic-content/text()") /> 
535            <#assign latitud = docXml.valueOf("//dynamic-element[@name='Latitud']/dynamic-content/text()") /> 
536            <#assign longitud = docXml.valueOf("//dynamic-element[@name='Longitud']/dynamic-content/text()") /> 
537            <#assign enlace = docXml.valueOf("//dynamic-element[@name='Web']/dynamic-content/text()") /> 
538            <#assign telefono = docXml.valueOf("//dynamic-element[@name='Telefono']/dynamic-content/text()") /> 
539 
540            <script> 
541                addCentros('${contador}','${nombre}','${direccion}','${latitud}','${longitud}','${enlace}','${telefono}'); 
542            </script> 
543            <#assign contador = contador + 1 /> 
544        </#if> 
545    </#list> 
546</#if> 
547 
548<div class="tc-map"> 
549    <div class="tc-map-search-ctn"> 
550        <div class="wrapper-ajust"> 
551            <form class="form-inline form-map"> 
552                <div class="tc-form-control"> 
553                    <label class="tc-map-label" for="address"><span class="text-base">${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.direccion")}, CP o ${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.provincia")}:</span></label> 
554                    <input class="field form-control error-field" name="address" id="address" type="textbox" placeholder='${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.direccion")}, ${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.codigo.postal")} o ${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.provincia")}'></input> 
555                </div> 
556                <div class="tc-form-control"> 
557                    <label class="tc-map-label" for="radius"><span class="text-base">${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.radio.busqueda")}:</span></label> 
558                    <input class="field form-control error-field field-small" name="radius" id="radius" type="number" min="1" step="1" value="2" placeholder='${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.radio.busqueda")}'></input> 
559                    <span class="tc-map-text-desc">Km.</span> 
560                    <button type="button" class="btn btn-ico btn-primary" onclick="codeAddress();"><i class="icon-search"></i></button> 
561                </div> 
562                <span class="rad_err_msg">${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.radio.busqueda.error")}</span> 
563            </form> 
564        </div> 
565    </div> 
566    <div class="wrapper-ajust"> 
567        <div class="tc-map-container"> 
568            <div id="map_canvas" class="tc-map-show"></div> 
569            <div class="div_lista"> 
570                <div id="side_bar" class="side_bar"> 
571                    <div class="p_aviso_side_bar"> 
572                        <p class="evo-form__text-info">${languageUtil.get(locale,"com.cofares.liferay.adt.mapa.empresas.realice.una.busqueda")}</p> 
573                    </div> 
574                </div> 
575            </div> 
576        </div> 
577        <div id="map_indications" class="tc-map-indications"></div> 
578    </div> 
579</div> 

Publicador de contenidos

Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> serviceLocator.findService("com.liferay.portlet.asset.service.AssetCategoryLocalService")  [in template "20155#20195#1900805" at line 1, column 38]

----
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: #assign assetCategoryLocalService = s...  [in template "20155#20195#1900805" at line 1, column 1]
----
1<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.portlet.asset.service.AssetCategoryLocalService")> 
2<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.portlet.asset.service.AssetVocabularyLocalService")> 
3 
4<!--Multiidioma--> 
5<#assign seeMore = languageUtil.get(locale, "view-more")/> 
6 
7<!--Buscamos si el contexto es público o privado--> 
8<#if themeDisplay.getLayout().isPrivateLayout()> 
9    <#assign contexto = "/group/canal-online/"/> 
10<#else> 
11	<#assign contexto = "/web/canal-online/"/> 
12</#if> 
13 
14<#if entries?has_content> 
15<div class="company-list"> 
16    <#list entries as curEntry> 
17        <#assign article = curEntry.getAssetRenderer().getArticle() /> 
18	    <#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContentByLocale(locale)) /> 
19	    <#assign titulo = docXml.valueOf("//dynamic-element[@name='Titulo']/dynamic-content/text()") /> 
20	    <#assign cp = docXml.valueOf("//dynamic-element[@name='CP']/dynamic-content/text()") /> 
21	    <#assign localidad = docXml.valueOf("//dynamic-element[@name='Localidad']/dynamic-content/text()") /> 
22	    <#assign provincia = docXml.valueOf("//dynamic-element[@name='Provincia']/dynamic-content/text()") /> 
23	    <#assign textoEnlace = docXml.valueOf("//dynamic-element[@name='TextoEnlace']/dynamic-content/text()") /> 
24	    <#assign urlEnlace = docXml.valueOf("//dynamic-element[@name='UrlEnlace']/dynamic-content/text()") /> 
25	    <div class="company-item"> 
26            <h4 class="title"> ${titulo} </h4> 
27            <#if cp!="null"> 
28				<p class="data"> 
29					${cp} - ${localidad} - ${provincia} 
30				</p> 
31            </#if> 
32            <!--<#if textoEnlace?has_content && textoEnlace!= '' && urlEnlace?has_content && urlEnlace!=''> 
33                <div class="more-information"> 
34                    <a href="${urlEnlace}"> <button class="button" id="seeMore"> ${textoEnlace} </button> </a> 
35                </div> 
36            </#if>--> 
37            <#assign catNameUrl = curEntry.getTitle(locale)?lower_case/> 
38    		<#if catNameUrl?contains(" ")> 
39                <#assign catNameUrl = catNameUrl?replace(" ","-")> 
40            </#if> 
41    		<#if catNameUrl?contains("á")> 
42            <#assign catNameUrl = catNameUrl?replace("á","a")> 
43    		</#if> 
44    		<#if catNameUrl?contains("Á")> 
45    		    <#assign catNameUrl = catNameUrl?replace("Á","A")> 
46    		</#if> 
47    		<#if catNameUrl?contains("é")> 
48    		    <#assign catNameUrl = catNameUrl?replace("é","e")> 
49    		</#if> 
50    		<#if catNameUrl?contains("É")> 
51    		    <#assign catNameUrl = catNameUrl?replace("É","E")> 
52    		</#if> 
53    		<#if catNameUrl?contains("í")> 
54    		    <#assign catNameUrl = catNameUrl?replace("í","i")> 
55    		</#if> 
56    		<#if catNameUrl?contains("Í")> 
57    		    <#assign catNameUrl = catNameUrl?replace("Í","I")> 
58    		</#if> 
59    		<#if catNameUrl?contains("ó")> 
60    		    <#assign catNameUrl = catNameUrl?replace("ó","o")> 
61    		</#if> 
62    		<#if catNameUrl?contains("Ó")> 
63    		    <#assign catNameUrl = catNameUrl?replace("Ó","O")> 
64    		</#if> 
65    		<#if catNameUrl?contains("ú")> 
66    		    <#assign catNameUrl = catNameUrl?replace("ú","u")> 
67    		</#if> 
68    		<#if catNameUrl?contains("Ú")> 
69    		    <#assign catNameUrl = catNameUrl?replace("Ú","U")> 
70    		</#if> 
71             
72            <div class="text-right"> 
73                <#if urlEnlace?has_content> 
74                    <a href='${urlEnlace}' class="link"> 
75                    <#if textoEnlace?has_content> 
76                        <span id="seeMore"> ${textoEnlace} </span>  
77                    <#else> 
78                        <span id="seeMore"> ${seeMore} <i class="icon-angle-right"></i></span>  
79                    </#if> 
80                    </a> 
81                <#else> 
82                    <!--<a href='/web/canalonline/fundacion-cofares/-/asset_publisher/7wm2IPFLlRuS/content/${catNameUrl}'>--> 
83                    <#assign visorId = "56_INSTANCE_j23b5kT7qr4p" /> 
84                    <#assign article = curEntry.getAssetRenderer().getArticle() /> 
85                    <#assign articleId = article.getArticleId() /> 
86                    <#assign groupId = themeDisplay.getScopeGroupId() /> 
87                    <#assign urlGo = "${contexto}"+"/detalle-empresa/-/journal_content/"+visorId+"/${groupId}/${articleId}?" /> 
88                    <a href="${urlGo}" class="link"> 
89                        <span id="seeMore"> ${seeMore} <i class="icon-angle-right"></i></span>  
90                    </a> 
91                </#if> 
92            </div> 
93        </div> 
94    </#list> 
95</div> 
96</#if>