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()}&tw_p=tweetbutton&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?&title=${titular.getData()}&mini=true&url=${currentUrl}&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()}&tw_p=tweetbutton&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?&title=${titular.getData()}&mini=true&url=${currentUrl}&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</@>