Compactadores de rodillos vibratorios en tándem
Java method "com.sun.proxy.$Proxy85.getClassNameId(String)" threw an exception when invoked on com.sun.proxy.$Proxy85 object "com.liferay.portal.service.impl.ClassNameLocalServiceImpl@1281bb27"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign classNameId = classNameLocalS... [in template "14306307#14306335#14309164" at line 12, column 1]
----
1<#include "${templatesPath}/10241186">
2<#assign objectDefinitionId = 14695654>
3<#assign objectDefinitionService = serviceLocator.findService("com.liferay.object.service.ObjectDefinitionService")>
4<#assign objectEntryLocalService = serviceLocator.findService("com.liferay.object.service.ObjectEntryLocalService")>
5<#assign objectRelationshipService = serviceLocator.findService("com.liferay.object.service.ObjectRelationshipService")>
6<#assign classNameLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.ClassNameLocalService")>
7<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
8<#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")>
9<#assign cpAttachmentFileEntryService = serviceLocator.findService("com.liferay.commerce.product.service.CPAttachmentFileEntryService")>
10<#assign assetCategoryPropertyService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyService")>
11<#assign className = objectDefinitionService.getObjectDefinition(objectDefinitionId).getClassName() />
12<#assign classNameId = classNameLocalService.getClassNameId(className) />
13<#assign groupId = themeDisplay.getScopeGroupId()>
14<#assign companyId = themeDisplay.getCompanyId()>
15<#assign portalURL = themeDisplay.getPortalURL()>
16<section class="grid-productos pt-40 pb-40 m-pt-20 m-pb-20">
17 <#assign allObjectsValues =[] />
18 <div class="cc">
19 <div class="toggle-sys mb-30 tar df aic jce p-20 bg-white" id="metric-imperial-button">
20 <label class="font-12 mr-10 bold"><@liferay_ui["message"] key="finanzauto.products.unidades.medida" />
21 : </label>
22 <div class="dfc mt-0 mb-0">
23 <p onclick="toggleElements('metric')" id="metric"
24 class="cp mt-0 btn-master bg-primary h-40 "><@liferay_ui["message"] key="finanzauto.products.metrico" /></p>
25 <p onclick="toggleElements('imperial')" id="imperial"
26 class="cp mt-0 btn-master ml-10 h-40"><@liferay_ui["message"] key="finanzauto.products.imperial" /></p>
27 </div>
28 <#-- <button onclick="toggleElements()" id="toggleButton" class="btn-master bg-primary h-40 c-white">Imperial</button> -->
29 </div>
30
31 <#assign orderBy = false />
32 <#assign categoryId = assetCategory.categoryId />
33 <#attempt>
34 <#assign categoryProperties = assetCategoryPropertyService.getCategoryProperties(categoryId)/>
35 <#list categoryProperties as categoryProperty>
36 <#assign key=categoryProperty["key"]/>
37 <#assign value=categoryProperty["value"]/>
38 <#if (key == "ORDER_BY" && value!="" && value!="#") >
39 <#assign orderBy = true />
40 </#if>
41 </#list>
42 <#recover>
43 </#attempt>
44 <#-- ------------- Productos de la categoria ------------- -->
45 <!--<#assign hits = assetEntryLocalService.search(companyId,[groupId],0,className,"","","",categoryId+"","",0,true,0,999).getDocs()>-->
46
47
48
49 <#assign allHits = assetEntryLocalService.search(companyId,[groupId],0,className,"","","",categoryId+"","",0,true,0,999).getDocs()>
50 <#assign hits = allHits?filter(
51 hit -> hit.get("companyId")?has_content && hit.get("companyId")?number == companyId
52)>
53
54
55
56
57 <ul class="grid-4 gap-20 t-grid-3 m-grid-2 m-gap-15 product-carousel">
58 <#assign hideLoadCarousel = "" />
59 <#list hits as hit>
60 <#assign objectId = hit.entryClassPK?number />
61 <#-- ------------- Valores del producto ------------- -->
62 <!-- <#assign values = objectEntryLocalService.getValues(objectId) />
63 <#assign values = values + {"objectId": objectId}>
64 <#assign allObjectsValues = allObjectsValues + [values] />-->
65
66
67 <#attempt>
68 <#assign values = objectEntryLocalService.getValues(objectId) />
69
70 <#-- Filtrar solo los objetos de la compañía actual -->
71 <#if values?has_content && values["companyId"]?? && values["companyId"]?number == companyId>
72 <#assign values = values + {"objectId": objectId} />
73 <#assign allObjectsValues = allObjectsValues + [values] />
74 </#if>
75 <#recover>
76 </#attempt>
77
78
79 </#list>
80
81 <#if orderBy>
82 <#assign allObjectsValues = allObjectsValues?sort_by("orderBy")>
83 <#else>
84 <#assign allObjectsValues = allObjectsValues?sort_by("names")>
85 </#if>
86 <#list allObjectsValues as values>
87 <#assign imageList = [] />
88
89 <#-- ------------- Imagen del producto ------------- -->
90 <#assign allAttachmentFiles = cpAttachmentFileEntryService.getCPAttachmentFileEntries(classNameId, values.objectId, 0, 0, -1, -1) />
91
92
93 <#assign attachmentFiles = []>
94 <#attempt>
95 <#list cpAttachmentFileEntryService.getCPAttachmentFileEntries(classNameId, values.objectId, 0, 0, -1, -1) as af>
96 <#if af.getCompanyId() == companyId>
97 <#assign attachmentFiles += [af]>
98 </#if>
99 </#list>
100 <#recover>
101 </#attempt>
102
103
104
105 <#list attachmentFiles as attachmentFile>
106 <#attempt>
107 <#assign image = dlFileEntryLocalService.getFileEntry(attachmentFile.getFileEntryId())/>
108 <#if (image.extension=="jpg"|| image.extension=="jpeg"||image.extension=="png") && !image.fileName?contains("features")
109 && !image.fileName?contains("no2dimage2davailable") && !image.fileName?contains("no-image-available")>
110 <#assign imageList = imageList + [image] />
111 </#if>
112 <#recover>
113 </#attempt>
114 </#list>
115
116 <#assign image = -1>
117 <#assign imageList = imageList?sort_by("fileName")>
118 <#if (imageList?size>0)>
119 <#assign image = imageList[0]>
120 <#else><#-- Fotos personalizadas -->
121 <#assign imagesRelationshipId = objectRelationshipService.getObjectRelationship(objectDefinitionId, "images").getObjectRelationshipId() >
122 <#assign images=objectEntryLocalService.getOneToManyObjectEntries(groupId, imagesRelationshipId, values.objectId, true, -1, -1)>
123 <#list images as image>
124 <#attempt>
125 <#assign fileId = image.getValues()["image"]>
126 <#assign file = dlFileEntryLocalService.getFileEntry(fileId)>
127 <#if (file.extension=="jpg"|| file.extension=="jpeg"||file.extension=="png") && !file.fileName?contains("features")
128 && !file.fileName?contains("no2dimage2davailable") && !file.fileName?contains("no-image-available")>
129 <#assign imageList = imageList + [file]>
130 </#if>
131 <#recover>
132 </#attempt>
133 </#list>
134
135 <#assign imageList = imageList?sort_by("fileName")>
136 <#if (imageList?size>0)>
137 <#assign image = imageList[0]>
138 </#if>
139 </#if>
140 <li class="df w-100 ${hideLoadCarousel}">
141
142 <#assign grupoElectrogenoGas = "">
143 <#assign frecuencia50 = "">
144 <#assign frecuencia60 = "">
145 <#if values.productUrlEs?contains("-gas-") >
146 <#assign grupoElectrogenoGas = "grupo-electrogeno-gas">
147 </#if>
148 <#if values.frecuencia50?? && values.frecuencia50 >
149 <#assign frecuencia50 = "frecuencia50">
150 </#if>
151 <#if values.frecuencia60?? && values.frecuencia60 >
152 <#assign frecuencia60 = "frecuencia60">
153 </#if>
154
155 <#if locale=="es_ES" && values.productUrlEs!="" >
156 <a href="/productos/${values.productUrlEs}" class="w-card w-100 product h-100 ${grupoElectrogenoGas} ${frecuencia50} ${frecuencia60}" data-order="${values.orderBy}">
157 <#elseif values.productUrlEn!="">
158 <a href="/en/products/${values.productUrlEn}"
159 class="w-card w-100 product h-100 ${grupoElectrogenoGas} ${frecuencia50} ${frecuencia60}" data-order="${values.orderBy}">
160 <#else>
161 <a href="/productos/${values.productUrlEs}" class="w-card w-100 product h-100 ${grupoElectrogenoGas} ${frecuencia50} ${frecuencia60}" data-order="${values.orderBy}">
162 </#if>
163 <span class="image p-15">
164 <#if (image?? && (!image?is_number)) >
165 <img class="ofc" loading="lazy"
166 src="${portalURL}/o/adaptive-media/image/${image.getFileEntryId()}/Thumbnail-300x300/${image.fileName}"/>
167 <#else>
168 <img class="ofc" src="/o/finanzauto-theme/images/no-photo.jpg"/>
169 </#if>
170 </span>
171 <span class="container ">
172 <span class="c-title bb-gray2 pt-10 pb-20 mb-10 dfc sb">
173
174 <p class="underline bold font-15">
175 ${getLanguage(values.names)}
176 </p>
177 <span class="card-chevron dfcc w-28 h-28 border-white br-50 circle-white"><i
178 class="bi bi-chevron-right bold"></i></span>
179 </span>
180 <span class="">
181 ${getLanguageSection(values.featuredSpecifications)}
182 </span>
183 </span>
184 <p style="display:none;" class="product-category">${assetCategory.getTitle(locale)}</p>
185 <p style="display:none;" class="product-brand">${values.brand}</p>
186 <p style="display:none;" class="product-id">${values.objectId}</p>
187 </a>
188
189 </li>
190
191 <#if values?index == 4 >
192 <#assign hideLoadCarousel>display:none</#assign>
193 </#if>
194 </#list>
195 </ul>
196
197 </div>
198</section>
199
200
201<#-- Schema listado Productos -->
202<#if allObjectsValues?has_content>
203<script type="application/ld+json">
204{
205 "@context": "https://schema.org",
206 "@type": "ItemList",
207 "name": "${assetCategory.getTitle(locale)?js_string}",
208 "url": "${themeDisplay.getURLCurrent()?js_string}",
209 "numberOfItems": ${allObjectsValues?size},
210 "itemListElement": [
211 <#list allObjectsValues as values>
212 <#-- Ajuste de marca: si es Cat, poner Caterpillar -->
213 <#assign brandName = values.brand!"" >
214 <#if brandName == "Cat">
215 <#assign brandName = "Caterpillar">
216 </#if>
217
218 <#-- Nombre final: producto + marca -->
219 <#assign productName = (getLanguage(values.longnames) + " " + brandName)!"" >
220
221 <#-- Description recortada a 156 caracteres -->
222 <#assign localizedDesc = getLanguage(values.description)!"" />
223 <#assign cleanDesc = localizedDesc?replace("<[^>]*>", "", "r")?replace("\\s+", " ", "r")?trim />
224 <#if cleanDesc?length gt 156>
225 <#assign snippet = cleanDesc?substring(0, 156) />
226 <#assign lastDot = snippet?last_index_of(".") />
227 <#if lastDot != -1>
228 <#assign finalDescription = snippet?substring(0, lastDot + 1) />
229 <#else>
230 <#assign lastSpace = snippet?last_index_of(" ") />
231 <#if lastSpace != -1>
232 <#assign finalDescription = snippet?substring(0, lastSpace) + "..." />
233 <#else>
234 <#assign finalDescription = snippet + "..." />
235 </#if>
236 </#if>
237 <#else>
238 <#assign finalDescription = cleanDesc />
239 </#if>
240
241 <#-- URL del producto según idioma -->
242 <#assign productUrl = "" >
243 <#if locale == "es_ES" && values.productUrlEs?has_content>
244 <#assign productUrl = portalURL + "/productos/" + values.productUrlEs >
245 <#elseif values.productUrlEn?has_content>
246 <#assign productUrl = portalURL + "/en/products/" + values.productUrlEn >
247 </#if>
248
249 {
250 "@type": "ListItem",
251 "position": ${values?index + 1},
252 "item": {
253 "@type": "Product",
254 "name": "${productName?js_string}",
255 "description": "${finalDescription?js_string}",
256 "url": "${productUrl?js_string}",
257 "sku": "${values.objectId?string}",
258 "brand": {
259 "@type": "Brand",
260 "name": "${brandName?js_string}"
261 },
262 "category": "${assetCategory.getTitle(locale)?js_string}"
263 }
264 }<#if values_has_next>,</#if>
265 </#list>
266 ]
267}
268</script>
269</#if>
270
271
272<style>
273 #layout-column_column-1 > .portlet-boundary_com_liferay_journal_content_web_portlet_JournalContentPortlet_:nth-child(2) section.text-columns.pt-40.pb-40 {
274 padding: 0px;
275 }
276
277 #layout-column_column-1 > .portlet-boundary_com_liferay_journal_content_web_portlet_JournalContentPortlet_:nth-child(2) section.text-columns.pt-40.pb-40 h2 + span > p {
278 margin-top: 20px !important;
279 }
280
281 #layout-column_column-1 > .portlet-boundary_com_liferay_journal_content_web_portlet_JournalContentPortlet_:nth-child(2) section.text-columns.pt-40.pb-40 h2 {
282 margin: 0px;
283 }
284
285 .toggle-sys:not(:first-of-type) {
286 display: none;
287 }
288
289 .caterpillar #metric, .caterpillar #imperial {
290 border: 1px solid #fc0;
291 }
292
293 #metric, #imperial {
294 margin-left: 0px;
295 max-height: 30px;
296 border: 1px solid #e4032e;
297 }
298
299 #metric:not(.bg-primary) {
300 font-weight: normal !important;
301 }
302
303 #imperial:not(.bg-primary) {
304 font-weight: normal !important;
305 }
306
307 div.subcategory {
308 display: flex;
309 justify-content: space-between;
310 }
311
312 div.featuredspecifications {
313 }
314
315 div.featuredspecifications div {
316 display: flex;
317 justify-content: space-between;
318 }
319
320 div.featuredspecifications div p.name {
321 color: #333D48;
322 font-size: 0.88rem;
323 line-height: 1.13rem;
324 }
325
326 div.featuredspecifications div p.value {
327 font-weight: bold;
328 margin-top: 0px;
329 font-size: 1rem;
330 line-height: 1.5rem;
331 letter-spacing: 0.5px;
332 text-align: right;
333 }
334
335
336 .product-carousel.tns-carousel > li {
337 display: inline-block !important;
338 }
339
340 .image-selector .tns-nav button {
341 width: 10px;
342 height: 10px;
343 padding: 0px;
344 margin: 0px;
345 }
346
347 .w-card span.image {
348 height: auto !important;
349 max-height: 230px;
350 }
351
352 span.c-info > .grid-2 {
353 grid-template-columns: 60% 1fr;
354 }
355
356 @media (max-width: 430px) {
357 ul.grid-4.m-grid-2.product-carousel {
358 grid-template-columns: 1fr;
359 }
360 }
361</style>
362<script>
363
364</script>
¿Qué son los Rodillos Vibratorios en Tándem?
Los rodillos vibratorios en tándem están diseñados para la compactación de asfalto y otros materiales en superficies planas. El tándem de dos rodillos vibratorios permite una compactación uniforme y de alta calidad, asegurando que las superficies sean lisas y duraderas.
Ventajas de los Rodillos Vibratorios de Caterpillar
Rendimiento Superior
Los compactadores tándem Caterpillar están equipados con tecnología avanzada que maximiza la eficiencia y la productividad. Sus rodillos vibratorios trabajan conjuntamente para ofrecer una compactación homogénea en menos tiempo.
Durabilidad y Fiabilidad
Construidos con los mejores materiales y tecnología punta, estos compactadores garantizan una larga vida útil y un rendimiento consistente, incluso en las condiciones de trabajo más exigentes.
Tecnología Innovadora
Los rodillos en tándem Cat cuentan con sistemas de control de compactación y sensores de vibración que proporcionan datos precisos en tiempo real. Esto permite ajustes instantáneos y asegura la calidad del trabajo.
Versatilidad en Aplicaciones
Ideales para la compactación de asfalto en carreteras, autopistas y proyectos urbanos, los compactadores tándem Caterpillar se adaptan a una amplia gama de aplicaciones y condiciones de trabajo.