Unsere Pro IQ-Serie ist eine Symbiose aus Premiumqualität und minimalistischem Design.
Die Pro IQ Töpfe und Pfannen werden in unserem Werk in Dänemark aus Recyclingaluminium von Hand gegossen, wobei eine Stahlschicht in den Boden des Kochgeschirrs eingearbeitet wird. Dadurch eignet sich die Serie für alle Herdarten - einschließlich Induktion.
Error compiling template "Designs/Scanpan/eCom/Productlist/productlist-blog-post.cshtml" Line 336: '"Price.GetDoublePriceFormatted(double, Currency, bool)" ist veraltet: "Use overload with currency and country instead." Line 402: Der Name "nonStickCoatingCategory" ist im aktuellen Kontext nicht vorhanden. Line 403: Der Name "inductionCategory" ist im aktuellen Kontext nicht vorhanden. Line 404: Der Name "withoutNonStickCoatingCategory" ist im aktuellen Kontext nicht vorhanden. Line 452: Der Name "nonStickCoatingCategory" ist im aktuellen Kontext nicht vorhanden. Line 452: Der Name "withoutNonStickCoatingCategory" ist im aktuellen Kontext nicht vorhanden. Line 463: Der Name "inductionCategory" ist im aktuellen Kontext nicht vorhanden. Line 388: Die Variable "imageHandlerFallback" ist zugewiesen, ihr Wert wird aber nie verwendet. Line 400: Die Variable "variantSeries" ist zugewiesen, ihr Wert wird aber nie verwendet.
1 //------------------------------------------------------------------------------ 2 // <auto-generated> 3 // This code was generated by a tool. 4 // Runtime Version:4.0.30319.42000 5 // 6 // Changes to this file may cause incorrect behavior and will be lost if 7 // the code is regenerated. 8 // </auto-generated> 9 //------------------------------------------------------------------------------ 10 11 namespace CompiledRazorTemplates.Dynamic { 12 using System; 13 using System.Collections.Generic; 14 using System.Linq; 15 16 #line 81 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 17 using System.Text.RegularExpressions; 18 19 #line default 20 #line hidden 21 22 #line 79 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 23 using Dynamicweb.Content; 24 25 #line default 26 #line hidden 27 28 #line 80 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 29 using Dynamicweb.Content.Items; 30 31 #line default 32 #line hidden 33 34 35 public class RazorEngine_4fb4b0f49b484b32bfb207e5f3a006f0 : Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> { 36 37 #line hidden 38 39 #line 1 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 40 41 bool hasSymbol(List<string> list, string feature) { 42 return list.Any(x => x == feature); 43 } 44 45 #line default 46 #line hidden 47 48 49 #line 85 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 50 51 52 /** 53 * Custom date format from string input 54 * String needs to be in a date format, though 55 * @param {String} d 56 */ 57 string FormatDate(string d) { 58 string output = d; 59 // Language 60 string lang = GetGlobalValue("Global:Area.Lang"); 61 // Date format 62 string dateFormat = (lang == "da") ? "d. MMM. yyyy" : "MMM d yyyy"; 63 // Try parsing string as DateTime 64 DateTime dateValue; 65 if (DateTime.TryParse(d, out dateValue)) { 66 output = dateValue.ToString(dateFormat); 67 } 68 // Format date input 69 // Return formatted date 70 return output; 71 } 72 73 /** 74 * Format number form string input 75 * Returns a clean number to be used in sorting loops 76 * @param {String} s 77 */ 78 string FormatNumber(string s) { 79 Regex rgx = new Regex(@"[^0-9.,]"); // match everything but numbers, comma and period 80 // Replace all letters with whitespace 81 s = rgx.Replace(s, " "); 82 // Remove everything after the first space 83 // This takes care of values like "28 x 28 cm" and "20 l" 84 return s.Split(new[]{" "}, StringSplitOptions.None)[0]; 85 } 86 87 /** 88 * Custom number formatting from string input 89 * @param {String} s 90 */ 91 decimal NumberFromString(String s) { 92 decimal output = decimal.Parse("0"); // fallback 93 string inputFormatted = FormatNumber(s); // strip input of anything but numbers 94 // Check if item has a value in the field 95 if( !string.IsNullOrEmpty(inputFormatted) ) { 96 decimal parsed; 97 // Try parsing formatted input as a decimal 98 if (decimal.TryParse(inputFormatted, out parsed)) { 99 output = parsed; 100 } 101 } 102 return output; 103 } 104 105 /** 106 * Order product loop by size field 107 * @param {LoopItem} v 108 */ 109 decimal OrderProductsBySize(LoopItem v) { 110 return NumberFromString(v.GetString("Ecom:Product:Field.SIZ")); 111 } 112 113 /** 114 * Order product loop by volume field 115 * @param {LoopItem} v 116 */ 117 decimal OrderProductsByVolume(LoopItem v) { 118 return NumberFromString(v.GetString("Ecom:Product:Field.VOL")); 119 } 120 121 /** 122 * Check wether a product id exists in a list of ids 123 * @param {List<string>} list 124 * @param {String} productId 125 */ 126 bool HasProduct(List<string> list, string productId) { 127 string productIdFormatted = "p_" + productId; 128 return list.Any(x => x == productIdFormatted); 129 } 130 131 /** 132 * Check wether a blog post page has a product selected 133 * in its related products field 134 * @param {Dynamicweb.Content.Page} blogPostAsPage 135 * @param {String} productId 136 */ 137 bool BlogPostHasRelatedProduct(Page blogPostAsPage, string productId) { 138 // Get page item 139 Item blogItem = ItemManager.Storage.GetById("BlogPost", blogPostAsPage.ItemId.ToString()); 140 // Get products from blog post fields 141 List<string> blogProducts = blogItem["Products"].ToString() 142 .Split(',') 143 .ToList(); 144 // Test wether provided product number matches any in the field 145 return HasProduct(blogProducts, productId); 146 } 147 148 bool BlogPostIsRelated(List<LoopItem> currentPageCategories, List<LoopItem> compareCategories) { 149 150 foreach(var i in compareCategories) { 151 if(currentPageCategories.Any(x => (x.GetInteger("ItemPublisher:Item.Categories.Id") == i.GetInteger("ItemPublisher:Item.Categories.Id")))) { 152 return true; 153 } 154 } 155 156 // No match 157 return false; 158 } 159 160 string ConvertPriceToSouthAfricanFormat(string price, int areaId) 161 { 162 if (areaId == 28) 163 { 164 int place = price.LastIndexOf(','); 165 166 if (place == -1) 167 return price; 168 169 string result = price.Remove(place, 1).Insert(place, "."); 170 return result; 171 } 172 return price; 173 } 174 175 176 #line default 177 #line hidden 178 179 180 public RazorEngine_4fb4b0f49b484b32bfb207e5f3a006f0() { 181 } 182 183 public override void Execute() { 184 WriteLiteral("\n"); 185 186 187 #line 7 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 188 189 var NIQSymbols = GetString("Ecom:Product:Field.NIQSymbols").Split(',').ToList(); 190 191 /** 192 * Product features 193 * @type Dictionary 194 */ 195 Dictionary<string, string> features = new Dictionary<string, string>() { 196 {"CERAMIC", "Glaskeramik"}, 197 {"GAS", "Gas"}, 198 {"HALOGEN", "Halogen"}, 199 {"DISHWASHER", "Spülmaschinengeeignet"}, 200 {"OVENPROOF", "Backofengeeignet"}, 201 {"RADIANTRIN", "Radiantrin"}, 202 {"SOLIDPLATE", "Elektro"}, 203 {"INDUCTION", "Induktion"} 204 }; 205 206 /** 207 * Product splats 208 * @type Dictionary 209 */ 210 Dictionary<string, string> splats = new Dictionary<string, string>() { 211 {"BESTSELLER", "Best Seller"}, 212 {"JUL", "Christmas price"}, 213 {"BIT", "Test winner"} 214 }; 215 216 217 #line default 218 #line hidden 219 WriteLiteral("\n\n\n\n"); 220 221 WriteLiteral("\n\n"); 222 223 224 #line 43 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 225 226 // Whether eCom features should be hidden in the frontend 227 bool disableEcommerce = Boolean.Parse(Pageview.Area.Item["DisableEcommerce"].ToString()); 228 229 // Get list of products selected on the blog item (current page item) 230 List<string> blogProducts = Pageview.Item["Products"] 231 .ToString() 232 .Replace(":", "") 233 .Split(',') 234 .ToList(); 235 236 // Used inside "product-item.cshtml" (since IncludeFile just inserts the content directly into this context) 237 // Loop is filtered by products that match those selected on the blog item 238 // 239 // FIXME: 240 // Maybe find a better way to get these products than looping all products?? 241 var productsLoop = GetLoop("Products") 242 .Where(p => HasProduct(blogProducts, p.GetString("Ecom:Product.ID"))); 243 244 // This will be used inside the "product-item.cshtml" partial to determine 245 // whether the variant should be displayed or not - to prevent variants from looping out 246 // its sibling variants (variant combinations). However, since we want all variants 247 // for a normal product list, this string should just stay empty and may not be deleted 248 var pickedVariantIds = ""; 249 250 // This is also used inside the "product-item.cshtml" partial for building custom product links. 251 // However, for native eCom product lists this is not needed, but this variable has to stay as null here. 252 string productDetailPageId = null; 253 254 255 #line default 256 #line hidden 257 WriteLiteral("\n\n<div"); 258 259 WriteLiteral(" class=\"section\""); 260 261 WriteLiteral(">\n <div"); 262 263 WriteLiteral(" class=\"product-list\""); 264 265 WriteLiteral(" id=\"products\""); 266 267 WriteLiteral(">\n"); 268 269 270 #line 75 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 271 272 273 #line default 274 #line hidden 275 WriteLiteral("\n\n"); 276 277 WriteLiteral("\n\n"); 278 279 WriteLiteral("\n\n"); 280 281 282 #line 213 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 283 284 // Rendered variants - for storing what variants already are shown 285 // to avoid duplicate variants shown in the frontend 286 List<String> renderedVariants = new List<String>(); 287 int sortOrder = 0; 288 289 290 #line default 291 #line hidden 292 WriteLiteral("\n"); 293 294 295 #line 219 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 296 foreach (LoopItem p in productsLoop) 297 { 298 var variants = p.GetLoop("VariantCombinations") 299 .OrderBy(v => OrderProductsBySize(v)) 300 .ThenBy(v => OrderProductsByVolume(v)) 301 .ThenBy(v => v.GetString("Ecom:Product:Field.COL")) 302 .ToList(); 303 foreach (LoopItem v in variants.Where(v => (disableEcommerce && !String.IsNullOrEmpty(v.GetString("Ecom:Product.Name"))) || (v.GetString("Ecom:Product.Price.Price") != "0" && v.GetString("Ecom:Product.Price.Price") != "0,00" && !String.IsNullOrEmpty(v.GetString("Ecom:Product.Name"))))) 304 { 305 var productId = v.GetString("Ecom:Product.ID"); 306 var variantId = v.GetString("Ecom:VariantCombination.VariantID"); 307 var variantIdCompare = v.GetString("Ecom:Product.CompareID"); 308 309 310 // Continue if the variant is already rendered 311 if (renderedVariants.Any(str => str.Contains(variantIdCompare))) 312 { 313 continue; 314 } 315 316 // Continue if this variant ain't one of the one we actually want to render 317 if (pickedVariantIds.Length > 0 && !pickedVariantIds.Contains(variantId)) 318 { 319 continue; 320 } 321 322 // Register this variant in the "already rendered" list 323 renderedVariants.Add(variantIdCompare); 324 325 var productName = v.GetString("Ecom:Product.Name"); 326 string productNumber = v.GetString("Ecom:Product.Number"); 327 328 var symbolsLoop = v.GetLoop("NZNIQSymbols"); 329 330 var price = v.GetDouble("Ecom:Product.Price.PriceWithoutVAT"); 331 var oldPrice = v.GetDouble("Ecom:Product:Field.UnitListPrice"); 332 string priceFormatted = v.GetString("Ecom:Product.Price"); 333 priceFormatted = ConvertPriceToSouthAfricanFormat(priceFormatted, Pageview.Area.ID); 334 335 /* See http://developer.dynamicweb-cms.com/api8/#Dynamicweb~Dynamicweb.Ecommerce.Prices.Price~GetDoublePriceFormatted.html */ 336 string oldPriceFormatted = Dynamicweb.Ecommerce.Prices.Price.GetDoublePriceFormatted(oldPrice, Dynamicweb.Ecommerce.Common.Context.Currency, true); 337 oldPriceFormatted = ConvertPriceToSouthAfricanFormat(oldPriceFormatted, Pageview.Area.ID); 338 339 double discountPercentage = Math.Round(100 - (100 / oldPrice * price)); 340 string discountPercentageFormatted = discountPercentage.ToString() + "%"; 341 342 string imagePath = "/Files/Templates/Designs/Scanpan/assets/images/noimage.gif"; 343 344 string imageUrl = imagePath; 345 string imageUrl2x = imagePath; 346 347 var stockStatus = v.GetString("Ecom:Product:Stock.ID"); 348 var stockStatusText = v.GetString("Ecom:Product:Stock.Text"); 349 var stockDeliveryText = string.Format("{0} {1}", v.GetString("Ecom:Product:Stock.DeliveryText"), v.GetString("Ecom:Product:Stock.DeliveryUnit")); 350 bool isOutOfStock = false; 351 string stockClassModifier = string.Empty; 352 string stockItemPropContent = string.Empty; 353 switch (stockStatus) 354 { 355 case "STOCKSTASTUSLINEID1": 356 case "LANGUAGEVALUE2": 357 stockClassModifier = "product__stock--in-stock"; 358 stockItemPropContent = "in_stock"; 359 break; 360 case "STOCKSTASTUSLINEID2": 361 case "LANGUAGEVALUE3": 362 stockClassModifier = "product__stock--limited-stock"; 363 stockItemPropContent = "in_stock"; 364 break; 365 case "STOCKSTASTUSLINEID3": 366 case "LANGUAGEVALUE4": 367 stockClassModifier = "product__stock--sold-out"; 368 stockItemPropContent = "out_of_stock"; 369 isOutOfStock = true; 370 break; 371 } 372 373 if (Pageview.Area.ID == 1 || Pageview.Area.ID == 22 || Pageview.Area.ID == 30 || Pageview.Area.ID == 33 || Pageview.Area.ID == 34) 374 { 375 // Media product images 376 string mainImage = v.GetString("Ecom:Product:Field.ProductImage"); 377 378 if (!string.IsNullOrEmpty(mainImage)) 379 { 380 imagePath = string.Format("https://cdn.scanpan.dk/Perfion/Image.aspx?id={0}", mainImage); 381 imageUrl = imagePath + "&size=250x160"; 382 imageUrl2x = imagePath + "&size=500x320"; 383 } 384 } 385 else 386 { 387 var imageHandlerUrl = "/Files/Billeder/MediaDB/Originals/ProductImage/"; 388 var imageHandlerFallback = "&altFmImage_path=/Files/Templates/Designs/Scanpan/assets/images/noimage.gif"; 389 var imageHandlerSettings = "?height=160&mode=boxpad&format=jpg&quality=80"; 390 var imageHandlerSettings2x = "?height=320&mode=boxpad&format=jpg&quality=80"; 391 392 imageUrl = imageHandlerUrl + productNumber + ".jpg" + imageHandlerSettings; 393 imageUrl2x = imageHandlerUrl + productNumber + ".jpg" + imageHandlerSettings2x; 394 } 395 396 string productLink = v.GetString("Ecom:VariantCombination.Link.Clean"); 397 398 // For filter data 399 string variantCategories = ""; 400 string variantSeries = ""; 401 string variantFeatures = ""; 402 bool isNonStick = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == nonStickCoatingCategory.Replace("g_", "")); 403 bool isInduction = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == inductionCategory.Replace("g_", "")); 404 bool isNotNonStick = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == withoutNonStickCoatingCategory.Replace("g_", "")); 405 406 // Decide whether we need to build our own product link (with variant) due to missing features in Dynamicweb "Product" item property. 407 // This only happens for products shown through the custom "products block" item type 408 if (!string.IsNullOrEmpty(productDetailPageId)) 409 { 410 productLink = "/Default.aspx?ID=" + productDetailPageId + "&ProductID=" + productId + "&VariantID=" + variantId; 411 } 412 413 // Build custom variant text due to some variants missing variant text 414 List<string> variantTexts = new List<string>() { 415 v.GetString("Ecom:Product:Field.SIZ"), 416 v.GetString("Ecom:Product:Field.VOL"), 417 v.GetString("Ecom:Product:Field.COL") 418 }; 419 420 var variantText = string.Join(", ", variantTexts.Where(item => !string.IsNullOrEmpty(item))); 421 sortOrder++; 422 423 var productCategory = v.GetString("Ecom:Product:Field.ProductCategory"); 424 var productPrice = v.GetDouble("Ecom:Product.Price.PriceWithVAT.Value"); 425 var vatPercentage = (v.GetDouble("Ecom:Product.Price.VATPercent") / 100) + 1; 426 var productPriceBefore = v.GetDouble("Ecom:Product:Field.ProductPriceBefore"); 427 var productDiscount = productPriceBefore > 0 ? (productPriceBefore * vatPercentage) - productPrice : 0; 428 429 430 431 #line default 432 #line hidden 433 WriteLiteral(" <article"); 434 435 WriteLiteral(" class=\"product-list__item js-filter-product\""); 436 437 WriteLiteral("\n data-sort=\""); 438 439 440 #line 353 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 441 Write(sortOrder); 442 443 444 #line default 445 #line hidden 446 WriteLiteral("\""); 447 448 WriteLiteral("\n data-non-stick=\""); 449 450 451 #line 354 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 452 Write(isNonStick ? nonStickCoatingCategory : isNotNonStick ? withoutNonStickCoatingCategory : "-"); 453 454 455 #line default 456 #line hidden 457 WriteLiteral("\""); 458 459 WriteLiteral("\n data-induction=\""); 460 461 462 #line 355 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 463 Write(isInduction ? inductionCategory + ";-" : "-"); 464 465 466 #line default 467 #line hidden 468 WriteLiteral("\""); 469 470 WriteLiteral("\n data-produced=\""); 471 472 473 #line 356 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 474 Write(v.GetString("Ecom:Product.CategoryField.specsList.specsCountry.Value.Clean")); 475 476 477 #line default 478 #line hidden 479 WriteLiteral("\""); 480 481 WriteLiteral("\n data-series=\""); 482 483 484 #line 357 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 485 Write(v.GetString("Ecom:Product:Field.Series")); 486 487 488 #line default 489 #line hidden 490 WriteLiteral("\""); 491 492 WriteLiteral("\n data-category=\""); 493 494 495 #line 358 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 496 Write(variantCategories); 497 498 499 #line default 500 #line hidden 501 WriteLiteral("\""); 502 503 WriteLiteral("\n data-size=\""); 504 505 506 #line 359 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 507 Write(productCategory == "SAUCEPAN" || productCategory == "POT" ? v.GetString("Ecom:Product:Field.VOL") + " " + Translate("Liters", "liters") : v.GetString("Ecom:Product:Field.SIZ")); 508 509 510 #line default 511 #line hidden 512 WriteLiteral("\""); 513 514 WriteLiteral("\n data-volume=\""); 515 516 517 #line 360 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 518 Write(v.GetString("Ecom:Product:Field.VOL")); 519 520 521 #line default 522 #line hidden 523 WriteLiteral("\""); 524 525 WriteLiteral("\n data-price=\""); 526 527 528 #line 361 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 529 Write(Regex.Replace(v.GetString("Ecom:Product.Price.Price").Replace(".", ""), @"\s+", "")); 530 531 532 #line default 533 #line hidden 534 WriteLiteral("\""); 535 536 WriteLiteral("\n data-color=\""); 537 538 539 #line 362 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 540 Write(v.GetString("Ecom:Product:Field.COL")); 541 542 543 #line default 544 #line hidden 545 WriteLiteral("\""); 546 547 WriteLiteral("\n data-offer=\""); 548 549 550 #line 363 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 551 Write(v.GetString("Ecom:Product:Field.ProductDiscounted")); 552 553 554 #line default 555 #line hidden 556 WriteLiteral("\""); 557 558 WriteLiteral("\n data-features=\""); 559 560 561 #line 364 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 562 Write(variantFeatures); 563 564 565 #line default 566 #line hidden 567 WriteLiteral("\""); 568 569 WriteLiteral("\n data-variantid=\""); 570 571 572 #line 365 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 573 Write(variantId); 574 575 576 #line default 577 #line hidden 578 WriteLiteral("\""); 579 580 WriteLiteral("\n data-variantcount=\""); 581 582 583 #line 366 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 584 Write(v.GetInteger("Ecom:Product.VariantCount")); 585 586 587 #line default 588 #line hidden 589 WriteLiteral("\""); 590 591 WriteLiteral(">\n\n <div"); 592 593 WriteLiteral(" style=\"display:none\""); 594 595 WriteLiteral(" class=\"js-ga-four-product\""); 596 597 WriteLiteral("\n data-itemprice=\""); 598 599 600 #line 369 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 601 Write(v.GetDouble("Ecom:Product.Price.PriceWithVAT").ToString().Replace(",", ".")); 602 603 604 #line default 605 #line hidden 606 WriteLiteral("\""); 607 608 WriteLiteral("\n data-itemvat=\""); 609 610 611 #line 370 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 612 Write(v.GetDouble("Ecom:Product.Price.VATPercent").ToString().Replace(",", ".")); 613 614 615 #line default 616 #line hidden 617 WriteLiteral("\""); 618 619 WriteLiteral("\n data-itempriceold=\""); 620 621 622 #line 371 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 623 Write(v.GetDouble("Ecom:Product:Field.ProductPriceBefore").ToString().Replace(",", ".")); 624 625 626 #line default 627 #line hidden 628 WriteLiteral("\""); 629 630 WriteLiteral("\n data-item_name=\""); 631 632 633 #line 372 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 634 Write(v.GetString("Ecom:Product.Name")); 635 636 637 #line default 638 #line hidden 639 WriteLiteral("\""); 640 641 WriteLiteral("\n data-item_id=\""); 642 643 644 #line 373 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 645 Write(productNumber); 646 647 648 #line default 649 #line hidden 650 WriteLiteral("\""); 651 652 WriteLiteral("\n data-currency=\""); 653 654 655 #line 374 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 656 Write(v.GetString("Ecom:Product.Currency.Code")); 657 658 659 #line default 660 #line hidden 661 WriteLiteral("\""); 662 663 WriteLiteral(">\n </div>\n\n <a"); 664 665 WriteLiteral(" class=\"js-ga-four-select-item product-list__image-container\""); 666 667 WriteAttribute("href", Tuple.Create(" href=\"", 15735), Tuple.Create("\"", 15754) 668 669 #line 377 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 670 , Tuple.Create(Tuple.Create("", 15742), Tuple.Create<System.Object, System.Int32>(productLink 671 672 #line default 673 #line hidden 674 , 15742), false) 675 ); 676 677 WriteLiteral(">\n <img"); 678 679 WriteLiteral(" class=\"product-list__image\""); 680 681 WriteAttribute("srcset", Tuple.Create(" srcset=\"", 15805), Tuple.Create("\"", 15839) 682 683 #line 378 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 684 , Tuple.Create(Tuple.Create("", 15814), Tuple.Create<System.Object, System.Int32>(imageUrl 685 686 #line default 687 #line hidden 688 , 15814), false) 689 , Tuple.Create(Tuple.Create("", 15823), Tuple.Create(",", 15823), true) 690 691 #line 378 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 692 , Tuple.Create(Tuple.Create(" ", 15824), Tuple.Create<System.Object, System.Int32>(imageUrl2x 693 694 #line default 695 #line hidden 696 , 15825), false) 697 , Tuple.Create(Tuple.Create(" ", 15836), Tuple.Create("2x", 15837), true) 698 ); 699 700 WriteAttribute("alt", Tuple.Create(" alt=\"", 15840), Tuple.Create("\"", 15858) 701 702 #line 378 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 703 , Tuple.Create(Tuple.Create("", 15846), Tuple.Create<System.Object, System.Int32>(productName 704 705 #line default 706 #line hidden 707 , 15846), false) 708 ); 709 710 WriteLiteral(">\n <div"); 711 712 WriteLiteral(" class=\"product-list__badge-container\""); 713 714 WriteLiteral(">\n"); 715 716 717 #line 380 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 718 719 720 #line default 721 #line hidden 722 723 #line 380 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 724 if (discountPercentage > 0) 725 { 726 727 728 #line default 729 #line hidden 730 WriteLiteral(" <span"); 731 732 WriteLiteral(" class=\"badge badge-red\""); 733 734 WriteLiteral(">-"); 735 736 737 #line 382 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 738 Write(discountPercentageFormatted); 739 740 741 #line default 742 #line hidden 743 WriteLiteral("</span>\n"); 744 745 746 #line 383 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 747 } 748 749 750 #line default 751 #line hidden 752 WriteLiteral(" "); 753 754 755 #line 384 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 756 if (symbolsLoop.FirstOrDefault(item => item.GetInteger("NZPriority") == 1) != null) 757 { 758 var splash = symbolsLoop.FirstOrDefault(item => item.GetInteger("NZPriority") == 1); 759 if (splash != null) 760 { 761 string badgeText = ""; 762 var badgeCssClass = "badge-default"; 763 764 var splashId = splash.GetString("NZNavId"); 765 switch (splashId) 766 { 767 case "NYHED": 768 case "NYHET": 769 case "NIEUW": 770 case "NEU": 771 case "NEW": 772 badgeText = splashId; 773 badgeCssClass = "badge-gold"; 774 break; 775 case "BLACKFRIDAY": 776 badgeText = Translate("Black Friday"); 777 badgeCssClass = "badge-black"; 778 break; 779 case "LIMITED_EDITION": 780 badgeText = Translate("Limited Edition"); 781 badgeCssClass = "badge-black"; 782 break; 783 case "POWERPRIS": 784 badgeText = Translate("Power price"); 785 badgeCssClass = "badge-black"; 786 break; 787 case "PAKKEPRIS_1": 788 badgeText = Translate("Package price"); 789 badgeCssClass = "badge-black"; 790 break; 791 case "JULEHIT": 792 badgeText = Translate("Christmas deal"); 793 badgeCssClass = "badge-dark-red"; 794 break; 795 case "FAA_PAA_LAGER": 796 badgeText = Translate("Few in stock"); 797 badgeCssClass = "badge-black"; 798 break; 799 default: 800 badgeText = Translate(splashId); 801 badgeCssClass = "badge-black"; 802 break; 803 } 804 805 806 #line default 807 #line hidden 808 WriteLiteral(" <span"); 809 810 WriteAttribute("class", Tuple.Create(" class=\"", 18782), Tuple.Create("\"", 18810) 811 , Tuple.Create(Tuple.Create("", 18790), Tuple.Create("badge", 18790), true) 812 813 #line 432 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 814 , Tuple.Create(Tuple.Create(" ", 18795), Tuple.Create<System.Object, System.Int32>(badgeCssClass 815 816 #line default 817 #line hidden 818 , 18796), false) 819 ); 820 821 WriteLiteral(">"); 822 823 824 #line 432 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 825 Write(badgeText.ToUpper()); 826 827 828 #line default 829 #line hidden 830 WriteLiteral("</span>\n"); 831 832 833 #line 433 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 834 } 835 } 836 837 838 #line default 839 #line hidden 840 WriteLiteral(" </div>\n </a>\n\n\n <h3"); 841 842 WriteLiteral(" class=\"product-list__name\""); 843 844 WriteAttribute("title", Tuple.Create(" title=\"", 18972), Tuple.Create("\"", 18992) 845 846 #line 439 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 847 , Tuple.Create(Tuple.Create("", 18980), Tuple.Create<System.Object, System.Int32>(productName 848 849 #line default 850 #line hidden 851 , 18980), false) 852 ); 853 854 WriteLiteral(">"); 855 856 857 #line 439 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 858 Write(productName); 859 860 861 #line default 862 #line hidden 863 WriteLiteral("</h3>\n <div"); 864 865 WriteLiteral(" class=\"product-list__offer\""); 866 867 WriteLiteral(">\n"); 868 869 870 #line 441 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 871 872 873 #line default 874 #line hidden 875 876 #line 441 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 877 if (!disableEcommerce) 878 { 879 880 881 #line default 882 #line hidden 883 WriteLiteral(" <div"); 884 885 WriteLiteral(" class=\"product-list__price\""); 886 887 WriteLiteral(">\n\n"); 888 889 890 #line 445 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 891 892 893 #line default 894 #line hidden 895 896 #line 445 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 897 if (oldPrice > 0 && oldPrice > price && oldPriceFormatted != priceFormatted) 898 { 899 900 901 #line default 902 #line hidden 903 WriteLiteral(" <div"); 904 905 WriteLiteral(" class=\"product-list__price__current discounted\""); 906 907 WriteLiteral(">"); 908 909 910 #line 447 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 911 Write(priceFormatted); 912 913 914 #line default 915 #line hidden 916 WriteLiteral("</div>\n"); 917 918 WriteLiteral(" <div"); 919 920 WriteLiteral(" class=\"product-list__price__old\""); 921 922 WriteLiteral(">"); 923 924 925 #line 448 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 926 Write(oldPriceFormatted); 927 928 929 #line default 930 #line hidden 931 WriteLiteral("</div>\n"); 932 933 934 #line 449 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 935 } 936 else 937 { 938 939 940 #line default 941 #line hidden 942 WriteLiteral(" <div"); 943 944 WriteLiteral(" class=\"product-list__price__current\""); 945 946 WriteLiteral(">"); 947 948 949 #line 452 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 950 Write(priceFormatted); 951 952 953 #line default 954 #line hidden 955 WriteLiteral("</div>\n"); 956 957 WriteLiteral(" <div"); 958 959 WriteLiteral(" class=\"product-list__price-spacer\""); 960 961 WriteLiteral("> </div>\n"); 962 963 964 #line 454 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 965 } 966 967 968 #line default 969 #line hidden 970 WriteLiteral("\n </div>\n"); 971 972 973 #line 457 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 974 } 975 976 977 #line default 978 #line hidden 979 WriteLiteral("\n <span"); 980 981 WriteLiteral(" class=\"product-list__sizes\""); 982 983 WriteLiteral(">"); 984 985 986 #line 459 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 987 Write(variantText); 988 989 990 #line default 991 #line hidden 992 WriteLiteral("</span>\n </div>\n\n"); 993 994 995 #line 462 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 996 997 998 #line default 999 #line hidden 1000 1001 #line 462 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1002 if (!disableEcommerce) 1003 { 1004 var ShippingInfoPage = Pageview.Area.Item["ShippingInfoPage"]; 1005 1006 1007 #line default 1008 #line hidden 1009 1010 #line 465 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1011 1012 if (ShippingInfoPage != null && !string.IsNullOrEmpty(ShippingInfoPage.ToString())) 1013 { 1014 1015 1016 #line default 1017 #line hidden 1018 WriteLiteral(" <p"); 1019 1020 WriteLiteral(" class=\"product-list__extra-text\""); 1021 1022 WriteLiteral(" style=\"font-size: 0.8em\""); 1023 1024 WriteLiteral(">inkl. MwSt. zzgl. <a"); 1025 1026 WriteAttribute("href", Tuple.Create(" href=\"", 20450), Tuple.Create("\"", 20474) 1027 1028 #line 468 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1029 , Tuple.Create(Tuple.Create("", 20457), Tuple.Create<System.Object, System.Int32>(ShippingInfoPage 1030 1031 #line default 1032 #line hidden 1033 , 20457), false) 1034 ); 1035 1036 WriteLiteral("> Versandkosten</a></p>\n"); 1037 1038 1039 #line 469 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1040 } 1041 1042 1043 #line default 1044 #line hidden 1045 WriteLiteral(" <form"); 1046 1047 WriteLiteral(" class=\"js-product\""); 1048 1049 WriteLiteral(">\n <input"); 1050 1051 WriteLiteral(" type=\"hidden\""); 1052 1053 WriteLiteral(" name=\"CartCmd\""); 1054 1055 WriteLiteral(" value=\"add\""); 1056 1057 WriteLiteral(" />\n <input"); 1058 1059 WriteLiteral(" type=\"hidden\""); 1060 1061 WriteLiteral(" class=\"js-product-id\""); 1062 1063 WriteLiteral(" name=\"ProductID\""); 1064 1065 WriteAttribute("value", Tuple.Create(" value=\"", 20709), Tuple.Create("\"", 20727) 1066 1067 #line 472 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1068 , Tuple.Create(Tuple.Create("", 20717), Tuple.Create<System.Object, System.Int32>(productId 1069 1070 #line default 1071 #line hidden 1072 , 20717), false) 1073 ); 1074 1075 WriteLiteral(" />\n <input"); 1076 1077 WriteLiteral(" type=\"hidden\""); 1078 1079 WriteLiteral(" class=\"js-variant-id\""); 1080 1081 WriteLiteral(" name=\"VariantID\""); 1082 1083 WriteAttribute("value", Tuple.Create(" value=\"", 20811), Tuple.Create("\"", 20829) 1084 1085 #line 473 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1086 , Tuple.Create(Tuple.Create("", 20819), Tuple.Create<System.Object, System.Int32>(variantId 1087 1088 #line default 1089 #line hidden 1090 , 20819), false) 1091 ); 1092 1093 WriteLiteral(" />\n <input"); 1094 1095 WriteLiteral(" type=\"hidden\""); 1096 1097 WriteLiteral(" class=\"js-quantity\""); 1098 1099 WriteLiteral(" name=\"Quantity\""); 1100 1101 WriteLiteral(" value=\"1\""); 1102 1103 WriteLiteral(" />\n <input"); 1104 1105 WriteLiteral(" type=\"hidden\""); 1106 1107 WriteLiteral(" class=\"js-product-name\""); 1108 1109 WriteLiteral(" name=\"ProductName\""); 1110 1111 WriteAttribute("value", Tuple.Create(" value=\"", 21007), Tuple.Create("\"", 21027) 1112 1113 #line 475 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1114 , Tuple.Create(Tuple.Create("", 21015), Tuple.Create<System.Object, System.Int32>(productName 1115 1116 #line default 1117 #line hidden 1118 , 21015), false) 1119 ); 1120 1121 WriteLiteral(" />\n <input"); 1122 1123 WriteLiteral(" type=\"hidden\""); 1124 1125 WriteLiteral(" class=\"js-product-price\""); 1126 1127 WriteLiteral(" name=\"ProductPrice\""); 1128 1129 WriteAttribute("value", Tuple.Create(" value=\"", 21117), Tuple.Create("\"", 21138) 1130 1131 #line 476 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1132 , Tuple.Create(Tuple.Create("", 21125), Tuple.Create<System.Object, System.Int32>(productPrice 1133 1134 #line default 1135 #line hidden 1136 , 21125), false) 1137 ); 1138 1139 WriteLiteral(" />\n <input"); 1140 1141 WriteLiteral(" type=\"hidden\""); 1142 1143 WriteLiteral(" class=\"js-product-discount\""); 1144 1145 WriteLiteral(" name=\"ProductDiscount\""); 1146 1147 WriteAttribute("value", Tuple.Create(" value=\"", 21234), Tuple.Create("\"", 21258) 1148 1149 #line 477 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1150 , Tuple.Create(Tuple.Create("", 21242), Tuple.Create<System.Object, System.Int32>(productDiscount 1151 1152 #line default 1153 #line hidden 1154 , 21242), false) 1155 ); 1156 1157 WriteLiteral(" />\n <input"); 1158 1159 WriteLiteral(" type=\"hidden\""); 1160 1161 WriteLiteral(" class=\"js-product-number\""); 1162 1163 WriteLiteral(" name=\"ProductNumber\""); 1164 1165 WriteAttribute("value", Tuple.Create(" value=\"", 21350), Tuple.Create("\"", 21372) 1166 1167 #line 478 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1168 , Tuple.Create(Tuple.Create("", 21358), Tuple.Create<System.Object, System.Int32>(productNumber 1169 1170 #line default 1171 #line hidden 1172 , 21358), false) 1173 ); 1174 1175 WriteLiteral(" />\n <div"); 1176 1177 WriteLiteral(" class=\"product__add-to-cart-container\""); 1178 1179 WriteLiteral(">\n "); 1180 1181 WriteLiteral("\n"); 1182 1183 1184 #line 481 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1185 1186 1187 #line default 1188 #line hidden 1189 1190 #line 481 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1191 if (isOutOfStock) 1192 { 1193 1194 1195 #line default 1196 #line hidden 1197 WriteLiteral(" <p"); 1198 1199 WriteLiteral(" class=\"product-list__out-of-stock-text\""); 1200 1201 WriteLiteral(">"); 1202 1203 1204 #line 483 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1205 Write(Translate("Temporarily out of stock")); 1206 1207 1208 #line default 1209 #line hidden 1210 WriteLiteral("</p>\n"); 1211 1212 1213 #line 484 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1214 } 1215 else 1216 { 1217 1218 1219 #line default 1220 #line hidden 1221 WriteLiteral(" <button"); 1222 1223 WriteLiteral(" class=\"product__add-to-cart product__form-submit js-ga-four-add-to-cart js-add-t" + 1224 "o-cart\""); 1225 1226 WriteLiteral(" onclick=\"productListAddToCart(event)\""); 1227 1228 WriteLiteral(" type=\"submit\""); 1229 1230 WriteLiteral(">In den Warenkorb</button>\n"); 1231 1232 1233 #line 488 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1234 } 1235 1236 1237 #line default 1238 #line hidden 1239 WriteLiteral(" </div>\n <div"); 1240 1241 WriteLiteral(" class=\"product-list__see-details-btn-container\""); 1242 1243 WriteLiteral(">\n <a"); 1244 1245 WriteLiteral(" class=\"js-ga-four-select-item product-list__see-details-btn\""); 1246 1247 WriteAttribute("href", Tuple.Create(" href=\"", 22226), Tuple.Create("\"", 22245) 1248 1249 #line 491 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1250 , Tuple.Create(Tuple.Create("", 22233), Tuple.Create<System.Object, System.Int32>(productLink 1251 1252 #line default 1253 #line hidden 1254 , 22233), false) 1255 ); 1256 1257 WriteLiteral(" style=\"white-space: normal;\""); 1258 1259 WriteLiteral(">Details anzeigen und kaufen</a>\n </div>\n </for" + 1260 "m>\n"); 1261 1262 1263 #line 494 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1264 } 1265 1266 1267 #line default 1268 #line hidden 1269 WriteLiteral(" </article>"); 1270 1271 WriteLiteral("<!-- .product-list__item -->\n"); 1272 1273 1274 #line 496 "E:\dynamicweb.net\Solutions\scanpan-live\Files\Templates\Designs\Scanpan\eCom\Productlist\productlist-blog-post.cshtml" 1275 } 1276 } 1277 1278 1279 #line default 1280 #line hidden 1281 WriteLiteral("\n<script>\n window.addEventListener(\"load\", function (event) {\n window.N" + 1282 "zApp.GA4.trackViewItemList(\".product-list__item\")\n window.NzApp.GA4.track" + 1283 "SelectItem(\".product-list__item\")\n })\n</script>\n </div>\n</div>\n"); 1284 1285 } 1286 } 1287 } 1288
1 @functions { 2 bool hasSymbol(List<string> list, string feature) { 3 return list.Any(x => x == feature); 4 } 5 } 6 7 @{ 8 var NIQSymbols = GetString("Ecom:Product:Field.NIQSymbols").Split(',').ToList(); 9 10 /** 11 * Product features 12 * @type Dictionary 13 */ 14 Dictionary<string, string> features = new Dictionary<string, string>() { 15 {"CERAMIC", "Glaskeramik"}, 16 {"GAS", "Gas"}, 17 {"HALOGEN", "Halogen"}, 18 {"DISHWASHER", "Spülmaschinengeeignet"}, 19 {"OVENPROOF", "Backofengeeignet"}, 20 {"RADIANTRIN", "Radiantrin"}, 21 {"SOLIDPLATE", "Elektro"}, 22 {"INDUCTION", "Induktion"} 23 }; 24 25 /** 26 * Product splats 27 * @type Dictionary 28 */ 29 Dictionary<string, string> splats = new Dictionary<string, string>() { 30 {"BESTSELLER", "Best Seller"}, 31 {"JUL", "Christmas price"}, 32 {"BIT", "Test winner"} 33 }; 34 } 35 36 37 38 @* 39 Requires HasProduct() from CustomCode/GlobalFunctions.cshtml 40 Assuming it's already been imported in eCom/partials/product-item.cshtml 41 *@ 42 43 @{ 44 // Whether eCom features should be hidden in the frontend 45 bool disableEcommerce = Boolean.Parse(Pageview.Area.Item["DisableEcommerce"].ToString()); 46 47 // Get list of products selected on the blog item (current page item) 48 List<string> blogProducts = Pageview.Item["Products"] 49 .ToString() 50 .Replace(":", "") 51 .Split(',') 52 .ToList(); 53 54 // Used inside "product-item.cshtml" (since IncludeFile just inserts the content directly into this context) 55 // Loop is filtered by products that match those selected on the blog item 56 // 57 // FIXME: 58 // Maybe find a better way to get these products than looping all products?? 59 var productsLoop = GetLoop("Products") 60 .Where(p => HasProduct(blogProducts, p.GetString("Ecom:Product.ID"))); 61 62 // This will be used inside the "product-item.cshtml" partial to determine 63 // whether the variant should be displayed or not - to prevent variants from looping out 64 // its sibling variants (variant combinations). However, since we want all variants 65 // for a normal product list, this string should just stay empty and may not be deleted 66 var pickedVariantIds = ""; 67 68 // This is also used inside the "product-item.cshtml" partial for building custom product links. 69 // However, for native eCom product lists this is not needed, but this variable has to stay as null here. 70 string productDetailPageId = null; 71 } 72 73 <div class="section"> 74 <div class="product-list" id="products"> 75 @using System.Text.RegularExpressions 76 @* Note that this file will be inserted directly into another one by Dynamicweb IncludeFile 77 before evaluating the Razor code, so keep the syntax right *@ 78 79 @using Dynamicweb.Content; 80 @using Dynamicweb.Content.Items; 81 @using System.Text.RegularExpressions; 82 @* Note that this file will be inserted directly into another one by Dynamicweb IncludeFile 83 before evaluating the Razor code, so keep the syntax right *@ 84 85 @functions { 86 87 /** 88 * Custom date format from string input 89 * String needs to be in a date format, though 90 * @param {String} d 91 */ 92 string FormatDate(string d) { 93 string output = d; 94 // Language 95 string lang = GetGlobalValue("Global:Area.Lang"); 96 // Date format 97 string dateFormat = (lang == "da") ? "d. MMM. yyyy" : "MMM d yyyy"; 98 // Try parsing string as DateTime 99 DateTime dateValue; 100 if (DateTime.TryParse(d, out dateValue)) { 101 output = dateValue.ToString(dateFormat); 102 } 103 // Format date input 104 // Return formatted date 105 return output; 106 } 107 108 /** 109 * Format number form string input 110 * Returns a clean number to be used in sorting loops 111 * @param {String} s 112 */ 113 string FormatNumber(string s) { 114 Regex rgx = new Regex(@"[^0-9.,]"); // match everything but numbers, comma and period 115 // Replace all letters with whitespace 116 s = rgx.Replace(s, " "); 117 // Remove everything after the first space 118 // This takes care of values like "28 x 28 cm" and "20 l" 119 return s.Split(new[]{" "}, StringSplitOptions.None)[0]; 120 } 121 122 /** 123 * Custom number formatting from string input 124 * @param {String} s 125 */ 126 decimal NumberFromString(String s) { 127 decimal output = decimal.Parse("0"); // fallback 128 string inputFormatted = FormatNumber(s); // strip input of anything but numbers 129 // Check if item has a value in the field 130 if( !string.IsNullOrEmpty(inputFormatted) ) { 131 decimal parsed; 132 // Try parsing formatted input as a decimal 133 if (decimal.TryParse(inputFormatted, out parsed)) { 134 output = parsed; 135 } 136 } 137 return output; 138 } 139 140 /** 141 * Order product loop by size field 142 * @param {LoopItem} v 143 */ 144 decimal OrderProductsBySize(LoopItem v) { 145 return NumberFromString(v.GetString("Ecom:Product:Field.SIZ")); 146 } 147 148 /** 149 * Order product loop by volume field 150 * @param {LoopItem} v 151 */ 152 decimal OrderProductsByVolume(LoopItem v) { 153 return NumberFromString(v.GetString("Ecom:Product:Field.VOL")); 154 } 155 156 /** 157 * Check wether a product id exists in a list of ids 158 * @param {List<string>} list 159 * @param {String} productId 160 */ 161 bool HasProduct(List<string> list, string productId) { 162 string productIdFormatted = "p_" + productId; 163 return list.Any(x => x == productIdFormatted); 164 } 165 166 /** 167 * Check wether a blog post page has a product selected 168 * in its related products field 169 * @param {Dynamicweb.Content.Page} blogPostAsPage 170 * @param {String} productId 171 */ 172 bool BlogPostHasRelatedProduct(Page blogPostAsPage, string productId) { 173 // Get page item 174 Item blogItem = ItemManager.Storage.GetById("BlogPost", blogPostAsPage.ItemId.ToString()); 175 // Get products from blog post fields 176 List<string> blogProducts = blogItem["Products"].ToString() 177 .Split(',') 178 .ToList(); 179 // Test wether provided product number matches any in the field 180 return HasProduct(blogProducts, productId); 181 } 182 183 bool BlogPostIsRelated(List<LoopItem> currentPageCategories, List<LoopItem> compareCategories) { 184 185 foreach(var i in compareCategories) { 186 if(currentPageCategories.Any(x => (x.GetInteger("ItemPublisher:Item.Categories.Id") == i.GetInteger("ItemPublisher:Item.Categories.Id")))) { 187 return true; 188 } 189 } 190 191 // No match 192 return false; 193 } 194 195 string ConvertPriceToSouthAfricanFormat(string price, int areaId) 196 { 197 if (areaId == 28) 198 { 199 int place = price.LastIndexOf(','); 200 201 if (place == -1) 202 return price; 203 204 string result = price.Remove(place, 1).Insert(place, "."); 205 return result; 206 } 207 return price; 208 } 209 210 } 211 212 213 @{ 214 // Rendered variants - for storing what variants already are shown 215 // to avoid duplicate variants shown in the frontend 216 List<String> renderedVariants = new List<String>(); 217 int sortOrder = 0; 218 } 219 @foreach (LoopItem p in productsLoop) 220 { 221 var variants = p.GetLoop("VariantCombinations") 222 .OrderBy(v => OrderProductsBySize(v)) 223 .ThenBy(v => OrderProductsByVolume(v)) 224 .ThenBy(v => v.GetString("Ecom:Product:Field.COL")) 225 .ToList(); 226 foreach (LoopItem v in variants.Where(v => (disableEcommerce && !String.IsNullOrEmpty(v.GetString("Ecom:Product.Name"))) || (v.GetString("Ecom:Product.Price.Price") != "0" && v.GetString("Ecom:Product.Price.Price") != "0,00" && !String.IsNullOrEmpty(v.GetString("Ecom:Product.Name"))))) 227 { 228 var productId = v.GetString("Ecom:Product.ID"); 229 var variantId = v.GetString("Ecom:VariantCombination.VariantID"); 230 var variantIdCompare = v.GetString("Ecom:Product.CompareID"); 231 232 233 // Continue if the variant is already rendered 234 if (renderedVariants.Any(str => str.Contains(variantIdCompare))) 235 { 236 continue; 237 } 238 239 // Continue if this variant ain't one of the one we actually want to render 240 if (pickedVariantIds.Length > 0 && !pickedVariantIds.Contains(variantId)) 241 { 242 continue; 243 } 244 245 // Register this variant in the "already rendered" list 246 renderedVariants.Add(variantIdCompare); 247 248 var productName = v.GetString("Ecom:Product.Name"); 249 string productNumber = v.GetString("Ecom:Product.Number"); 250 251 var symbolsLoop = v.GetLoop("NZNIQSymbols"); 252 253 var price = v.GetDouble("Ecom:Product.Price.PriceWithoutVAT"); 254 var oldPrice = v.GetDouble("Ecom:Product:Field.UnitListPrice"); 255 string priceFormatted = v.GetString("Ecom:Product.Price"); 256 priceFormatted = ConvertPriceToSouthAfricanFormat(priceFormatted, Pageview.Area.ID); 257 258 /* See http://developer.dynamicweb-cms.com/api8/#Dynamicweb~Dynamicweb.Ecommerce.Prices.Price~GetDoublePriceFormatted.html */ 259 string oldPriceFormatted = Dynamicweb.Ecommerce.Prices.Price.GetDoublePriceFormatted(oldPrice, Dynamicweb.Ecommerce.Common.Context.Currency, true); 260 oldPriceFormatted = ConvertPriceToSouthAfricanFormat(oldPriceFormatted, Pageview.Area.ID); 261 262 double discountPercentage = Math.Round(100 - (100 / oldPrice * price)); 263 string discountPercentageFormatted = discountPercentage.ToString() + "%"; 264 265 string imagePath = "/Files/Templates/Designs/Scanpan/assets/images/noimage.gif"; 266 267 string imageUrl = imagePath; 268 string imageUrl2x = imagePath; 269 270 var stockStatus = v.GetString("Ecom:Product:Stock.ID"); 271 var stockStatusText = v.GetString("Ecom:Product:Stock.Text"); 272 var stockDeliveryText = string.Format("{0} {1}", v.GetString("Ecom:Product:Stock.DeliveryText"), v.GetString("Ecom:Product:Stock.DeliveryUnit")); 273 bool isOutOfStock = false; 274 string stockClassModifier = string.Empty; 275 string stockItemPropContent = string.Empty; 276 switch (stockStatus) 277 { 278 case "STOCKSTASTUSLINEID1": 279 case "LANGUAGEVALUE2": 280 stockClassModifier = "product__stock--in-stock"; 281 stockItemPropContent = "in_stock"; 282 break; 283 case "STOCKSTASTUSLINEID2": 284 case "LANGUAGEVALUE3": 285 stockClassModifier = "product__stock--limited-stock"; 286 stockItemPropContent = "in_stock"; 287 break; 288 case "STOCKSTASTUSLINEID3": 289 case "LANGUAGEVALUE4": 290 stockClassModifier = "product__stock--sold-out"; 291 stockItemPropContent = "out_of_stock"; 292 isOutOfStock = true; 293 break; 294 } 295 296 if (Pageview.Area.ID == 1 || Pageview.Area.ID == 22 || Pageview.Area.ID == 30 || Pageview.Area.ID == 33 || Pageview.Area.ID == 34) 297 { 298 // Media product images 299 string mainImage = v.GetString("Ecom:Product:Field.ProductImage"); 300 301 if (!string.IsNullOrEmpty(mainImage)) 302 { 303 imagePath = string.Format("https://cdn.scanpan.dk/Perfion/Image.aspx?id={0}", mainImage); 304 imageUrl = imagePath + "&size=250x160"; 305 imageUrl2x = imagePath + "&size=500x320"; 306 } 307 } 308 else 309 { 310 var imageHandlerUrl = "/Files/Billeder/MediaDB/Originals/ProductImage/"; 311 var imageHandlerFallback = "&altFmImage_path=/Files/Templates/Designs/Scanpan/assets/images/noimage.gif"; 312 var imageHandlerSettings = "?height=160&mode=boxpad&format=jpg&quality=80"; 313 var imageHandlerSettings2x = "?height=320&mode=boxpad&format=jpg&quality=80"; 314 315 imageUrl = imageHandlerUrl + productNumber + ".jpg" + imageHandlerSettings; 316 imageUrl2x = imageHandlerUrl + productNumber + ".jpg" + imageHandlerSettings2x; 317 } 318 319 string productLink = v.GetString("Ecom:VariantCombination.Link.Clean"); 320 321 // For filter data 322 string variantCategories = ""; 323 string variantSeries = ""; 324 string variantFeatures = ""; 325 bool isNonStick = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == nonStickCoatingCategory.Replace("g_", "")); 326 bool isInduction = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == inductionCategory.Replace("g_", "")); 327 bool isNotNonStick = v.GetLoop("AssociatedGroups").Any(ag => ag.GetString("Ecom:Group.ID") == withoutNonStickCoatingCategory.Replace("g_", "")); 328 329 // Decide whether we need to build our own product link (with variant) due to missing features in Dynamicweb "Product" item property. 330 // This only happens for products shown through the custom "products block" item type 331 if (!string.IsNullOrEmpty(productDetailPageId)) 332 { 333 productLink = "/Default.aspx?ID=" + productDetailPageId + "&ProductID=" + productId + "&VariantID=" + variantId; 334 } 335 336 // Build custom variant text due to some variants missing variant text 337 List<string> variantTexts = new List<string>() { 338 v.GetString("Ecom:Product:Field.SIZ"), 339 v.GetString("Ecom:Product:Field.VOL"), 340 v.GetString("Ecom:Product:Field.COL") 341 }; 342 343 var variantText = string.Join(", ", variantTexts.Where(item => !string.IsNullOrEmpty(item))); 344 sortOrder++; 345 346 var productCategory = v.GetString("Ecom:Product:Field.ProductCategory"); 347 var productPrice = v.GetDouble("Ecom:Product.Price.PriceWithVAT.Value"); 348 var vatPercentage = (v.GetDouble("Ecom:Product.Price.VATPercent") / 100) + 1; 349 var productPriceBefore = v.GetDouble("Ecom:Product:Field.ProductPriceBefore"); 350 var productDiscount = productPriceBefore > 0 ? (productPriceBefore * vatPercentage) - productPrice : 0; 351 352 <article class="product-list__item js-filter-product" 353 data-sort="@sortOrder" 354 data-non-stick="@(isNonStick ? nonStickCoatingCategory : isNotNonStick ? withoutNonStickCoatingCategory : "-")" 355 data-induction="@(isInduction ? inductionCategory + ";-" : "-")" 356 data-produced="@v.GetString("Ecom:Product.CategoryField.specsList.specsCountry.Value.Clean")" 357 data-series="@v.GetString("Ecom:Product:Field.Series")" 358 data-category="@variantCategories" 359 data-size="@(productCategory == "SAUCEPAN" || productCategory == "POT" ? v.GetString("Ecom:Product:Field.VOL") + " " + Translate("Liters", "liters") : v.GetString("Ecom:Product:Field.SIZ"))" 360 data-volume="@v.GetString("Ecom:Product:Field.VOL")" 361 data-price="@(Regex.Replace(v.GetString("Ecom:Product.Price.Price").Replace(".", ""), @"\s+", ""))" 362 data-color="@v.GetString("Ecom:Product:Field.COL")" 363 data-offer="@v.GetString("Ecom:Product:Field.ProductDiscounted")" 364 data-features="@variantFeatures" 365 data-variantid="@variantId" 366 data-variantcount="@v.GetInteger("Ecom:Product.VariantCount")"> 367 368 <div style="display:none" class="js-ga-four-product" 369 data-itemprice="@v.GetDouble("Ecom:Product.Price.PriceWithVAT").ToString().Replace(",", ".")" 370 data-itemvat="@v.GetDouble("Ecom:Product.Price.VATPercent").ToString().Replace(",", ".")" 371 data-itempriceold="@v.GetDouble("Ecom:Product:Field.ProductPriceBefore").ToString().Replace(",", ".")" 372 data-item_name="@v.GetString("Ecom:Product.Name")" 373 data-item_id="@productNumber" 374 data-currency="@v.GetString("Ecom:Product.Currency.Code")"> 375 </div> 376 377 <a class="js-ga-four-select-item product-list__image-container" href="@productLink"> 378 <img class="product-list__image" srcset="@imageUrl, @imageUrl2x 2x" alt="@productName"> 379 <div class="product-list__badge-container"> 380 @if (discountPercentage > 0) 381 { 382 <span class="badge badge-red">-@discountPercentageFormatted</span> 383 } 384 @if (symbolsLoop.FirstOrDefault(item => item.GetInteger("NZPriority") == 1) != null) 385 { 386 var splash = symbolsLoop.FirstOrDefault(item => item.GetInteger("NZPriority") == 1); 387 if (splash != null) 388 { 389 string badgeText = ""; 390 var badgeCssClass = "badge-default"; 391 392 var splashId = splash.GetString("NZNavId"); 393 switch (splashId) 394 { 395 case "NYHED": 396 case "NYHET": 397 case "NIEUW": 398 case "NEU": 399 case "NEW": 400 badgeText = splashId; 401 badgeCssClass = "badge-gold"; 402 break; 403 case "BLACKFRIDAY": 404 badgeText = Translate("Black Friday"); 405 badgeCssClass = "badge-black"; 406 break; 407 case "LIMITED_EDITION": 408 badgeText = Translate("Limited Edition"); 409 badgeCssClass = "badge-black"; 410 break; 411 case "POWERPRIS": 412 badgeText = Translate("Power price"); 413 badgeCssClass = "badge-black"; 414 break; 415 case "PAKKEPRIS_1": 416 badgeText = Translate("Package price"); 417 badgeCssClass = "badge-black"; 418 break; 419 case "JULEHIT": 420 badgeText = Translate("Christmas deal"); 421 badgeCssClass = "badge-dark-red"; 422 break; 423 case "FAA_PAA_LAGER": 424 badgeText = Translate("Few in stock"); 425 badgeCssClass = "badge-black"; 426 break; 427 default: 428 badgeText = Translate(splashId); 429 badgeCssClass = "badge-black"; 430 break; 431 } 432 <span class="badge @badgeCssClass">@badgeText.ToUpper()</span> 433 } 434 } 435 </div> 436 </a> 437 438 439 <h3 class="product-list__name" title="@productName">@productName</h3> 440 <div class="product-list__offer"> 441 @if (!disableEcommerce) 442 { 443 <div class="product-list__price"> 444 445 @if (oldPrice > 0 && oldPrice > price && oldPriceFormatted != priceFormatted) 446 { 447 <div class="product-list__price__current discounted">@priceFormatted</div> 448 <div class="product-list__price__old">@oldPriceFormatted</div> 449 } 450 else 451 { 452 <div class="product-list__price__current">@priceFormatted</div> 453 <div class="product-list__price-spacer"> </div> 454 } 455 456 </div> 457 } 458 459 <span class="product-list__sizes">@variantText</span> 460 </div> 461 462 @if (!disableEcommerce) 463 { 464 var ShippingInfoPage = Pageview.Area.Item["ShippingInfoPage"]; 465 @* Alin -> TODO: Add translation and link to the Shipping terms page @Translate(InklMwStZzgl, "inkl. MwSt. Zzgl.", global) Translate(VersandKosten, "Versandkosten", global) *@ 466 if (ShippingInfoPage != null && !string.IsNullOrEmpty(ShippingInfoPage.ToString())) 467 { 468 <p class="product-list__extra-text" style="font-size: 0.8em">inkl. MwSt. zzgl. <a href="@ShippingInfoPage"> Versandkosten</a></p> 469 } 470 <form class="js-product"> 471 <input type="hidden" name="CartCmd" value="add" /> 472 <input type="hidden" class="js-product-id" name="ProductID" value="@productId" /> 473 <input type="hidden" class="js-variant-id" name="VariantID" value="@variantId" /> 474 <input type="hidden" class="js-quantity" name="Quantity" value="1" /> 475 <input type="hidden" class="js-product-name" name="ProductName" value="@productName" /> 476 <input type="hidden" class="js-product-price" name="ProductPrice" value="@productPrice" /> 477 <input type="hidden" class="js-product-discount" name="ProductDiscount" value="@productDiscount" /> 478 <input type="hidden" class="js-product-number" name="ProductNumber" value="@productNumber" /> 479 <div class="product__add-to-cart-container"> 480 @*<input class="product__quantity" type="number" name="Quantity" value="1" />*@ 481 @if (isOutOfStock) 482 { 483 <p class="product-list__out-of-stock-text">@Translate("Temporarily out of stock")</p> 484 } 485 else 486 { 487 <button class="product__add-to-cart product__form-submit js-ga-four-add-to-cart js-add-to-cart" onclick="productListAddToCart(event)" type="submit">In den Warenkorb</button> 488 } 489 </div> 490 <div class="product-list__see-details-btn-container"> 491 <a class="js-ga-four-select-item product-list__see-details-btn" href="@productLink" style="white-space: normal;">Details anzeigen und kaufen</a> 492 </div> 493 </form> 494 } 495 </article><!-- .product-list__item --> 496 } 497 } 498 499 <script> 500 window.addEventListener("load", function (event) { 501 window.NzApp.GA4.trackViewItemList(".product-list__item") 502 window.NzApp.GA4.trackSelectItem(".product-list__item") 503 }) 504 </script> 505 </div> 506 </div> 507