Se ha producido un error al procesar la plantilla.
Range start index 0 is out of bounds, because the sliced string has only 0 character(s). (Note that indices are 0-based).
The blamed expression:
==> startUid..endUid  [in template "42020#42061#121944228" at line 161, column 48]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign uid = urlBase[startUid..endUid]  [in template "42020#42061#121944228" at line 161, column 25]
----
1<#-- 
2	Se usa para mostrar el detalle de un proyecto 
3 --> 
4  
5 <style> 
6.swiper-container-free-mode>.swiper-wrapper { 
7    transition-timing-function: ease-out; 
8    margin: 0 auto; 
9    width: 1170px; 
10    display: flex; 
11    justify-content: center; 
12
13 </style> 
14 
15<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
16<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
17<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 
18<#assign AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")> 
19<#assign AssetLinkLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetLinkLocalService")> 
20 
21<#assign statusApproved = 0> 
22<#assign journalArticle = JournalArticleLocalService.fetchLatestArticle(groupId, reserved\-article\-id.data, statusApproved)> 
23<#assign assetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey())> 
24<#assign categories = AssetCategoryLocalService.getEntryCategories(assetEntry.getEntryId())> 
25 
26<#assign DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")> 
27 
28<#assign DLFileEntryMetadataLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryMetadataLocalService")> 
29 
30<#assign DDMStorageLinkLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStorageLinkLocalService")> 
31 
32<#assign DDMContentLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMContentLocalService")> 
33 
34<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
35 
36<#assign allEntries = [] /> 
37 
38<#-- Se añade la home --> 
39<#assign site_default_url = htmlUtil.escape(themeDisplay.getLayout().getGroup().getDisplayURL(themeDisplay, false)) /> 
40<#assign site_name = htmlUtil.escape(themeDisplay.getLayout().getGroup().getDescriptiveName()) /> 
41<#assign allEntries = allEntries + [{'name' : site_name, 'url' : site_default_url }] />	 
42 
43<#-- Se añaden las paginas intermedias --> 
44<#assign entries = themeDisplay.getLayout().getAncestors()?reverse /> 
45<#list entries as itemLayout>  
46	<#assign allEntries = allEntries + [{'name' : itemLayout.getName(locale), 'url' : portalUtil.getLayoutFriendlyURL(itemLayout, themeDisplay) }] />		 
47</#list> 
48 
49<#-- Se añade la propia pagina --> 
50<#assign allEntries = allEntries + [{'name' : titular.getData(), 'url' : currentUrl }] /> 
51 
52<div class="container"> 
53	<div class="breadcrumbs-rrss-container"> 
54		<div class="breadcrumbs-blog">			 
55			<#-- Pinto los elementos del breadcrumb --> 
56			<#assign position = 1>			 
57			<#list allEntries as item>  
58				<#if item?is_last > 
59                    <span>${item.name}</span> 
60                <#else> 
61                    <a href="${item.url}">${item.name}</a>               
62                </#if>				             
63				<#assign position++> 
64			</#list> 
65		</div>         
66		<div class="text-share-rrss text-right"> 
67			<span class="text text-blue hidden-xs hidden-sm">${languageUtil.get(locale, "share")}:</span> 
68			<ul class="share-social js-share-social">				 
69				<li><a class="facebook" href="" onclick="window.open('http://www.facebook.com/sharer.php?u=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Facebook"><span class="icon-sm-facebook"></span></a></li> 
70				<li><a class="twitter" href="" onclick="window.open('https://twitter.com/intent/tweet?text=${titular.getData()}&amp;tw_p=tweetbutton&amp;url=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Twitter"><span class="icon-sm-twitter"></span></a></li> 
71				<li><a class="linkedin" href="" onclick="window.open('http://www.linkedin.com/shareArticle?&amp;title=${titular.getData()}&amp;mini=true&amp;url=${currentUrl}&amp;summary=', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Linkedin"><span class="icon-sm-linkedin"></span></a></li> 
72			</ul> 
73		</div>  
74	</div>        
75</div> 
76 
77 
78<#-- Imagen de fondo --> 
79<div class="bg-image-detail-info" style="background-image: url('');"></div> 
80 
81 
82<#assign VOC_TIPO = "SACYR_GLOBAL_VOC_TIPO_MULTIMEDIA"> 
83<#assign VOC_TAG = "SACYR_VOC_TAGS"> 
84<#assign STR_PAIS = "SACYR_GLOBAL_STR_PAIS"> 
85 
86<#-- Seccion proyecto --> 
87<div class="container"> 
88    <div class="detail-info detail-info--photos"> 
89        <div class="categories-list"> 
90            <ul> 
91                <#list categories as cat> 
92                    <#assign voc = AssetVocabularyLocalService.getAssetVocabulary(cat.getVocabularyId())> 
93                    <#if voc.getName()?lower_case == VOC_TIPO?lower_case> 
94                        <li>${cat.getTitle(locale)}</li> 
95                        <#break> 
96                    </#if> 
97                </#list> 
98            </ul> 
99        </div> 
100        <#-- Titulo --> 
101        <div class="title"> 
102            ${titular.getData()} 
103        </div> 
104        <div class="subtitle"> 
105            ${subtitular.getData()} 
106        </div> 
107        <div class=""> 
108            <#assign fecha_Data = getterUtil.getString(fecha.getData())> 
109            <#if validator.isNotNull(fecha_Data)> 
110                <#assign fecha_DateObj = dateUtil.parseDate("yyyy-MM-dd", fecha_Data, locale)> 
111                ${dateUtil.getDate(fecha_DateObj, "dd MMM yyyy - HH:mm:ss", locale)} 
112            </#if> 
113        </div> 
114 
115        <#-- Sección 2 --> 
116        <div class="main-content"> 
117            <div class="row"> 
118 
119            </div> 
120        </div> 
121    </div> 
122</div> 
123 
124 
125<#-- Carrusel fotos --> 
126<div class="gallery-slider__container js-gallery-slider"> 
127    <div class="container"> 
128        <div class="swiper-container gallery-slider js-gallery-top"> 
129            <div class="swiper-wrapper"> 
130                <#if documento.getSiblings()?has_content> 
131                    <#list documento.getSiblings() as cur_documento> 
132                       <#assign urlBase = cur_documento.getData()/> 
133 
134 
135                        <div class="swiper-slide"> 
136                            <div class="photo-stream"> 
137                                <img class="image" src="${urlBase}"/> 
138                            </div> 
139                            <#--<div class="photo-caption"> 
140                                <p class="photo-title">Titulo</p> 
141                                <p class="photo-description">Descripcio</p> 
142                            </div> --> 
143                        </div> 
144                    </#list> 
145                </#if> 
146            </div> 
147        </div> 
148</div> 
149 
150        <!-- Add Arrows --> 
151        <div class="gallery-slider-next"></div> 
152        <div class="gallery-slider-prev"></div> 
153        <div class="swiper-container gallery-slider-thumbs js-gallery-thumbs"> 
154            <div class="swiper-wrapper"> 
155                <#if documento.getSiblings()?has_content> 
156                    <#assign counter = 0> 
157                    <#list documento.getSiblings() as cur_documento> 
158                        <#assign urlBase = cur_documento.getData()/> 
159                        <#assign startUid = urlBase?last_index_of("/")+1 /> 
160                        <#assign endUid = urlBase?last_index_of("?")-1 /> 
161                        <#assign uid = urlBase[startUid..endUid]/> 
162                        <#assign doc = DLFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(uid,groupId)/> 
163                        <#assign dlFileEntry = doc.getDLFileEntryType() > 
164                        <#assign raw = DLFileEntryMetadataLocalService.getFileVersionFileEntryMetadatas(doc.getFileVersion().fileVersionId)> 
165                        <#assign metadata = raw[0]/> 
166                        <#assign stStart = metadata?last_index_of("DDMStructureId")/> 
167                        <#assign stTemp = metadata[stStart..]/> 
168                        <#assign stEnd = stTemp?index_of(",")-1/> 
169                        <#assign ddmStructureId = stTemp[0..stEnd]?split(":")[1]?trim/> 
170 
171                        <div class="swiper-slide slide_${counter}" id="${(counter == 0)?then('active-thumb','')}"> 
172                            <div class="photo-stream"> 
173                                <img src="${urlBase}"/> 
174                            </div> 
175                        </div> 
176                        <#assign counter = counter + 1> 
177                    </#list> 
178                </#if> 
179            </div> 
180        </div> 
181    </div> 
182</div> 
183 
184<div class="container"> 
185    <div class="gallery-actions"> 
186        <div class="row"> 
187            <div class="col-sm-6"> 
188                <button id="downloadImages" class="btn download-btn"> 
189                    <span class="icon icon--jpg"></span>  
190                    <span class="text">${languageUtil.get(locale, "download")}</span> 
191                </button> 
192            </div> 
193            <div class="col-sm-6"> 
194                <#-- Compartir en Redes sociales parte inferior --> 
195                <div class="text-share-rrss"> 
196                    <span class="text text-blue">${languageUtil.get(locale, "share")}:</span> 
197                    <ul class="share-social">				 
198                        <li><a class="facebook" href="" onclick="window.open('http://www.facebook.com/sharer.php?u=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Facebook"><span class="icon-sm-facebook"></span></a></li> 
199                        <li><a class="twitter" href="" onclick="window.open('https://twitter.com/intent/tweet?text=${titular.getData()}&amp;tw_p=tweetbutton&amp;url=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Twitter"><span class="icon-sm-twitter"></span></a></li> 
200                        <li><a class="linkedin" href="" onclick="window.open('http://www.linkedin.com/shareArticle?&amp;title=${titular.getData()}&amp;mini=true&amp;url=${currentUrl}&amp;summary=', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Linkedin"><span class="icon-sm-linkedin"></span></a></li> 
201                    </ul> 
202                </div>  
203            </div>  
204        </div> 
205    </div> 
206</div> 
207 
208 
209 
210<script> 
211 
212	$('#downloadImages').on( "click", function() { 
213	 
214		var zip = new JSZip();	 
215		 
216		$('.image').each(function( index ) {		   
217		  var imgData = getBase64Image(this); 
218		  var srcArray = this.src.split("/"); 
219		  var name = srcArray[srcArray.length - 2]; 
220		  name = name.replace(/\+/g, " ");		   
221		  zip.file(name, imgData, {base64: true}); 
222		}); 
223															 
224		zip.generateAsync({type:"blob"}) 
225		.then(function(content) {			 
226			saveAs(content, "imagenes.zip"); 
227		}); 
228	}); 
229	 
230	 
231	function getBase64Image(img) { 
232	  var canvas = document.createElement("canvas"); 
233	  canvas.width = img.naturalWidth; 
234	  canvas.height = img.naturalHeight; 
235	  var ctx = canvas.getContext("2d"); 
236	  ctx.drawImage(img, 0, 0); 
237	  var dataURL = canvas.toDataURL("image/png"); 
238	  return dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 
239
240	 
241</script> 
242 
243<@liferay_util["html-top"] outputKey="htmltop" > 
244    <#-- Pinto el marcado enriquecido para el SEO --> 
245    <#assign position=1> 
246    <script type="application/ld+json"> 
247
248        "@context": "http://schema.org", 
249        "@type": "BreadcrumbList", 
250        "itemListElement": [ 
251        <#list allEntries as item>  
252
253                "@type": "ListItem", 
254                "position": ${position}, 
255                "item": { 
256                    "@id": "${item.url}", 
257                    "name": "${item.name}" 
258
259            <#if position < allEntries?size> 
260            }, 
261            <#else> 
262
263            </#if> 
264            <#assign position=position+1> 
265        </#list> 
266        ]} 
267    </script> 
268</@> 

Utilizamos cookies propias y de terceros para fines analíticos. Clica AQUÍ para más información. Puedes aceptar todas las cookies pulsando el botón "Aceptar" o configurarlas o rechazar su uso clicando.

Declaración de cookies

Estas cookies son necesarias para que el sitio web funcione y no se pueden desactivar en nuestros sistemas. Estas cookies no guardan ninguna información personal identificable.

Nombre Proveedor Propósito Caducidad Tipo
LFR_Sesión_STATE_* Liferay Administra la sesión como usuario registrado Session HTTP
GUEST_LANGUAGE_ID Liferay Determina el idioma con el que accede, para mostrar el mismo en la próxima sesión 1 year HTTP
ANONYMOUS_USER_ID Liferay Administra la sesión como usuario no registrado 1 year HTTP
COOKIE_SUPPORT Liferay Identifica que es necesario el uso de cookies para el funcionamiento del portal 1 year HTTP
JSesiónID Liferay Administra el inicio de sesión e indica que está usando el sitio Session HTTP
SACYRGDPR Sacyr Utilizada para gestionar la política de cookies Session HTTP

Estas cookies nos permiten contar las visitas y fuentes de circulación para poder medir y mejorar el desempeño de nuestro sitio. Nos ayudan a saber qué páginas son las más o menos populares, y ver cuántas personas visitan el sitio. Toda la información que recogen estas cookies es agregada y, por lo tanto, anónima.

Nombre Proveedor Propósito Caducidad Tipo
_gat Google Se utiliza con fines estadísticos y analíticos para aumentar el rendimiento de nuespos Servicios Session HTTP
_gid Google Se utiliza para almacenar y actualizar un valor único para cada página visitada Session HTTP
_ga Google Se utiliza con fines estadísticos y analíticos para aumentar el rendimiento de nuespos Servicio Session HTTP