Liferay Code Generator Professional License - ProductDetails
Product Details
An error occurred while processing the template.
The following has evaluated to null or missing:
==> curCPCatalogEntry.getUrl() [in template "84465#84493#1093610" at line 330, column 30]
----
Tip: If the failing expression is known to 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 Url = curCPCatalogEntry.getUrl() [in template "84465#84493#1093610" at line 330, column 17]
----
1<#-- ---- ADT-ProductDetail ver. 1.6 ---- -->
2<#-- ------ copyright ACSoftware ------- -->
3<#-- -- written by Mattia Giovinazzo --- -->
4
5<#assign
6is_login_redirect_required = portalUtil.isLoginRedirectRequired(request)
7is_signed_in = themeDisplay.isSignedIn()
8portal_url = themeDisplay.getPortalURL()
9/>
10<style>
11 .portlet-body {
12 padding:2rem;
13 }
14
15 #productDetails.bg-prod {
16 padding: 1rem;
17 background: #fafafa;
18 border-radius: 20px;
19 box-shadow: 2px 2px 10px rgb(0 0 0 / 20%);
20 margin-bottom: 1rem;
21 position:relative;
22 }
23
24 #productDetails .nav-tabs {
25 border-bottom: 1px solid #eee;
26 width: calc(100% - 64px);
27 padding: 0 1rem;
28 margin: 0 auto;
29 }
30
31 #productDetails .nav-tabs .nav-link.active {
32 background-color: transparent;
33 border-color: transparent transparent #f1f2f5;
34 color: #272833;
35 border-radius: 10px 10px 0 0;
36 padding: 0.5rem 1rem;
37 box-shadow: 0px -2px 6px rgb(0 0 0 / 10%);
38 }
39
40 /*
41 #productDetails .card-top:before {
42 content: "";
43 background-position: top;
44 display: block;
45 position: absolute;
46 bottom: 0;
47 left: -40px;
48 top: -40px;
49 border-radius: 20px;
50 z-index: 1;
51 height: calc(100% + 80px);
52 width: 100%;
53 max-width: 1440px;
54 clip-path: circle(100% at 0% 0%);
55 min-height: 150px;
56 background-color: #393a4a;
57 overflow: hidden;
58 }
59
60 #productDetails .card-top:after {
61 content: '';
62 position: absolute;
63 box-shadow: 2px 2px 10px rgb(0 0 0 / 20%);
64 border-radius: 20px;
65 padding: 2rem;
66 background-color: #64c7ff55;
67 top: -40px;
68 left: -40px;
69 width: calc(100% + 20px);
70 height: calc(100% + 80px);
71 z-index: 1;
72 }
73 */
74 #productDetails .card-img {
75 flex-shrink: 0;
76 width: 100%;
77 z-index: 2;
78 position: relative;
79 left: -20px;
80 top: -20px;
81 }
82
83 #productDetails .name {
84 margin: 2rem 0;
85 }
86
87 #productDetails .name h1 {
88 font-weight: normal;
89 font-size: 64px;
90 line-height: 60px;
91 }
92
93 @media (max-width:1440px) {
94 #productDetails .name h1 {
95 font-size: 52px;
96 line-height: 50px;
97 }
98 }
99
100 @media (max-width:1180px) {
101 #productDetails .name h1 {
102 font-size: 44px;
103 line-height: 42px;
104 }
105 }
106
107 #productDetails .price {
108 font-size: 44px;
109 text-align: right;
110 margin-bottom: 1rem;
111 }
112
113 .product-price {
114 z-index: 2;
115 position: relative;
116 color: white;
117 right: 2rem;
118 }
119
120 .product-promo-price {
121 color: #0033B4;
122 padding-right: 1rem;
123 z-index: 2;
124 position: relative;
125 font-size: 30px;
126 }
127
128 .product-promo-price ~ .product-price {
129 right: 0;
130 }
131
132 .priceBand {
133 position: absolute;
134 height: 80px;
135 right: -14px;
136 margin-top: -4px;
137 z-index: 1;
138 filter: drop-shadow(0px 0px 4px rgba(0,0,0, 0.2));
139 }
140
141 .imgBand {
142 position: absolute;
143 left: -22px;
144 margin-top: -4px;
145 z-index: 1;
146 filter: drop-shadow(0px 0px 4px rgba(0,0,0, 0.2));
147 }
148
149 @media (max-width:1280px) {
150 .imgBand {
151 left: -19px;
152 }
153 }
154
155 @media (max-width:1024px) {
156 .imgBand {
157 left: -16px;
158 }
159 }
160
161 @media (max-width:767px) {
162 #productDetails .mt-5 {
163 margin-top: 1rem !important;
164 }
165
166 .imgBand {
167 left: -20px;
168 }
169 }
170
171 .msg-login {
172 width: 100%;
173 text-align: right;
174 margin-top: 1rem;
175 padding: 1rem;
176 border-top: 1px solid #eee;
177 }
178
179 @keyframes grow {
180 from {
181 transform: scale(0, 0);
182 opacity: 1;
183 }
184 to {
185 transform: scale(1.5, 1.5);
186 opacity: 0;
187 }
188 }
189
190 #productDetails .addCart > div{
191 display: flex;
192 width: auto;
193 justify-content: flex-end;
194 gap: 2rem;
195 align-items: end;
196 flex-direction: row;
197 right: 2rem;
198 position: relative;
199 }
200
201 #productDetails .btnLG, #productDetails .taglib-add-to-cart {
202 font-size: 15px;
203 line-height: 1.5;
204 color: #fff;
205 text-transform: uppercase;
206 width: auto;
207 min-width: 140px;
208 height: 50px;
209 background: #006EB4;
210 display: -webkit-box;
211 display: -moz-box;
212 display: -ms-flexbox;
213 display: -webkit-flex;
214 display: flex;
215 justify-content: center;
216 align-items: center;
217 padding: 0 1rem;
218 -webkit-transition: all 0.5s;
219 -o-transition: all 0.5s;
220 -moz-transition: all 0.5s;
221 transition: all 0.5s;
222 border-radius: 25px;
223 border: 0;
224 overflow:hidden;
225 text-align:center;
226 text-decoration:none;
227 position:relative;
228 box-shadow:rgba(0,0,0,.15) 0 1px 2px;
229 outline:none;
230 z-index:3;
231 }
232 .btnLG:hover, .taglib-add-to-cart:hover {
233 box-shadow:rgba(0,0,0,.3) 0 8px 25px, rgba(0,0,0,.2)0 1px;
234 text-shadow:#fff 0 0 12px;
235 text-decoration:none;
236 }
237 .btnLG:active, .taglib-add-to-cart:active {
238 box-shadow:rgba(0,0,0,.2) 0 8px 25px;
239 transition: all 0s;
240 }
241 .btnLG span, .taglib-add-to-cart span {
242 position:relative;
243 z-index:9;
244 }
245 .btnLG:before, .btnLG:after, .taglib-add-to-cart:before, .taglib-add-to-cart:after {
246 position:absolute;
247 top:0;
248 left:0;
249 display:block;
250 content:" ";
251 }
252 .btnLG:before, .taglib-add-to-cart:before {
253 z-index:2;
254 }
255
256 .btnLG:after, .taglib-add-to-cart:after {
257 z-index:1;
258 }
259
260 .btnLG:after, .taglib-add-to-cart:after {
261 height:100%;
262 width:2000px;
263 transition: all .8s;
264 background: linear-gradient(135deg, #31a0e3 0%,#0d5682 19%,#2a79ca 37%,#ffffff 50%,#c2c2c2 66%,#2a7aca 75%,#64c7ff 100%);
265 mix-blend-mode: overlay;
266 }
267 .btnLG:before, .taglib-add-to-cart:before {
268 height:26px;
269 width:100%;
270 top:-50px;
271 opacity:0;
272 background-color:rgba(255,255,255,.15);
273 transition: all .5s;
274 }
275 .btnLG:hover:before, .taglib-add-to-cart:hover:before {
276 top:0;
277 opacity:1;
278 }
279 .btnLG:hover:after, .taglib-add-to-cart:hover:after {
280 left:-1750px;
281 }
282 .btnLG:active:before, .taglib-add-to-cart:active:before {
283 height:100%;
284 background-color:rgba(255,255,255,.8);
285 box-shadow:inset rgba(255,255,255,.5)0 0 25px;
286 transition: all 0s;
287 }
288
289 .nav-tabs + .tab-content .tab-pane {
290 background-color: transparent;
291 }
292
293 #productDetails .btnLG.circle {
294 height: 50px;
295 width: 50px;
296 padding: 0;
297 min-width: 50px;
298 position: absolute;
299 text-align: right;
300 right: 1rem;
301 }
302
303 svg.share {
304 z-index: 9;
305 position: relative;
306 color: white;
307 fill: currentColor;
308 }
309
310 .commerce-quantity-container {
311 width:0!important;
312 heigth:0!important;
313 display:none;
314 }
315
316
317</style>
318<div id="productDetails" class="contBox-1440 bg-prod">
319 <button class="btnLG circle" onclick="copyToClipboard()" title="Copy and Share Link">
320 <svg class="share" style="width:24px;height:24px" viewBox="0 0 24 24">
321 <path d="M18,16.08C17.24,16.08 16.56,16.38 16.04,16.85L8.91,12.7C8.96,12.47 9,12.24 9,12C9,11.76 8.96,11.53 8.91,11.3L15.96,7.19C16.5,7.69 17.21,8 18,8A3,3 0 0,0 21,5A3,3 0 0,0 18,2A3,3 0 0,0 15,5C15,5.24 15.04,5.47 15.09,5.7L8.04,9.81C7.5,9.31 6.79,9 6,9A3,3 0 0,0 3,12A3,3 0 0,0 6,15C6.79,15 7.5,14.69 8.04,14.19L15.16,18.34C15.11,18.55 15.08,18.77 15.08,19C15.08,20.61 16.39,21.91 18,21.91C19.61,21.91 20.92,20.61 20.92,19A2.92,2.92 0 0,0 18,16.08Z" />
322 </svg>
323 </button>
324
325 <#if entries?has_content>
326 <#list entries as curCPCatalogEntry>
327 <#if curCPCatalogEntry?has_content>
328 <#assign Image=curCPCatalogEntry.getDefaultImageFileUrl() />
329 <#assign Name=curCPCatalogEntry.getName() />
330 <#assign Url=curCPCatalogEntry.getUrl() />
331 <#assign SKUs=curCPCatalogEntry.CPSkus[0] />
332 <#assign DefinitionID=curCPCatalogEntry.getCPDefinitionId() />
333 <#assign InstanceId=SKUs.getCPInstanceId() />
334
335
336 <div class="row mt-5">
337 <div class="col-md-6 card-top">
338 <img class="card-img" title="" alt="" src="${Image}" />
339 <svg class="imgBand" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 400" xml:space="preserve">
340 <g>
341 <path fill="#005F82" d="M14.8,350.5V399C7.4,399,0,394.8,0,388.8v-38h14.8V350.5z"/>
342 <path fill="#005F82" d="M14.8,49.5V1C7.4,1,0,6.3,0,12.2v37.3H14.8L14.8,49.5z"/>
343 <path fill="#009FE3" d="M511.5,379.4L580,19.6c-80.1,0-564.9,0-564.9,0S0,21.7,0,12.5c0-0.4,0,377.4,0,375c0-8,15.1-8.1,15.1-8.1 s417.5,0,498.1,0H511.5z"/>
344 </g>
345 </svg>
346
347 </div>
348 <div class="col-md-6 card-details">
349 <div class="name">
350 <h1>${Name}</h1>
351 </div>
352 <div class="price">
353 <@liferay_commerce["price"]
354 CPDefinitionId=curCPCatalogEntry.getCPDefinitionId()
355 CPInstanceId=curCPCatalogEntry.CPSkus[0].getCPInstanceId()
356 showDiscount=true
357 />
358 <svg class="priceBand" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 100" >
359 <g>
360 <path fill="#005F82" d="M308,16.1V-0.1c7.4,0,12,3.6,12,5.3v10.8H308L308,16.1z"/>
361 <path fill="#005F82" d="M308,83.8v16.1c7.4,0,12-3.6,12-5.3V83.8H308L308,83.8z"/>
362 <path fill="#009FE3" d="M16.6,9.7L0,89.9c19.4,0,307.8,0,307.8,0s12.2,0,12.2,5.3c0,0.1,0-91.2,0-90.6c0,4.6-12.2,5-12.2,5v0.1 C288.3,9.7,36.1,9.7,16.6,9.7L16.6,9.7z"/>
363 </g>
364 </svg>
365 </div>
366 <div class="addCart">
367 <#if is_signed_in>
368 <div>
369<#--
370 <div class="quantity-input">
371 <@liferay_commerce["quantity-input"] key="com.liferay.commerce.taglib.servlet.taglib.QuantityInputTag"
372 CPDefinitionId=curCPCatalogEntry.getCPDefinitionId()
373 _allowedOrderQuantities=true
374 useSelect=false
375 updateOnChange=true
376 />
377 </div>
378 -->
379 <@liferay_util["dynamic-include"] key="com.liferay.commerce.product.content.web#/add_to_cart#" />
380
381<#--
382 <@liferay_util["dynamic-include"] key="com.liferay.commerce.product.content.web#/add_to_cart#pre" />
383 <div id="${request}">
384 <button class="taglib-add-to-cart btnLG" id="${request}" cp-definition-id="${InstanceId}" cp-instance-id="${DefinitionID}" type="button" onclick=" null " href="${portal_url}/cart" title="Add to Cart"><span>Add to Cart</span></button>
385 </div>
386 <@liferay_util["dynamic-include"] key="com.liferay.commerce.product.content.web#/add_to_cart#post" />
387 -->
388
389
390 </div>
391
392 <#else>
393 <div>
394<#--
395 <div class="quantity-input">
396 <@liferay_commerce["quantity-input"] key="com.liferay.commerce.taglib.servlet.taglib.QuantityInputTag"
397 CPDefinitionId=curCPCatalogEntry.getCPDefinitionId()
398 _allowedOrderQuantities=true
399 useSelect=false
400 updateOnChange=true
401 />
402 </div>
403 -->
404 <a id="addCart" cp-definition-id="${InstanceId}" cp-instance-id="${DefinitionID}" class="taglib-add-to-cart btnLG" href="${portal_url}/c/portal/login" title="Add to Cart"><span>Add to Cart</span></a>
405 </div>
406
407 <div class="msg-login" >
408 <span class="title-light small txt-c">To complete the purchase procedure you need to
409 <a href="${portal_url}/c/portal/login"><b>login</b></a>
410 <br/> If you are a new customer,
411 <a href="${portal_url}/web/guest/home?p_p_id=com_liferay_login_web_portlet_LoginPortlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&saveLastPath=false&_com_liferay_login_web_portlet_LoginPortlet_mvcRenderCommandName=%2Flogin%2Fcreate_account"><b>crea un nuovo account</b>,</a>
412 register and proceed with the purchase.
413 </span>
414 </div>
415 </#if>
416 </div>
417 </div>
418
419 </div>
420 <div class="row mt-5 block">
421 <ul class="nav nav-tabs" id="myTab" role="tablist">
422 <li class="nav-item">
423 <a class="nav-link lead active" role="tab" data-toggle="tab" href="#tabDescription" key="">Description</a>
424 </li>
425 </ul>
426 <div class="tab-content" id="myTabContent">
427 <div class="card-desc tab-pane pt-4 active" role="tabpanel" id="tabDescription">
428 <p>${curCPCatalogEntry.description}</p>
429 </div>
430 </div>
431 </div>
432
433 <#else>
434 </#if>
435 </#list>
436 </#if>
437</div>
438<@liferay_aui["script"]>
439 Liferay.after(
440 'commerce:productAddedToCart',
441 function(event) {
442 Liferay.Portlet.refresh('#p_p_id<@portlet.namespace />');
443 }
444 );
445</@>
446
447<script>
448 var cartUrl = "${portal_url}/cart";
449 $('.taglib-add-to-cart').click(function() {
450 setTimeout(function ()
451 { window.location.reload(true);
452 window.location.href = cartUrl;
453 }, 500);
454 });
455</script>
456<script>
457 function copyToClipboard(text) {
458 var inputc = document.body.appendChild(document.createElement("input"));
459 inputc.value = window.location.href;
460 inputc.focus();
461 inputc.select();
462 document.execCommand('copy');
463 inputc.parentNode.removeChild(inputc);
464 alert("URL Copied.");
465 }
466</script>