Go to top
Error executing template "Designs/Dwsimple/eCom/Productlist/SearchResultList.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_c16c6a0472a74e1997bbb031fad58a52.Execute() in D:\web\hounisen\Hounisen.Website\Files\Templates\Designs\Dwsimple\eCom\Productlist\SearchResultList.cshtml:line 1206
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @using Dynamicweb.Content 2 @using VestjyskMarketing.Models 3 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 4 5 @using System.Globalization 6 @using Dynamicweb.Content 7 @using Dynamicweb.Ecommerce 8 @using Dynamicweb.Ecommerce.Products 9 @using Dynamicweb.Security.UserManagement 10 @using Hounisen.Website.Helpers 11 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 12 13 @using System.Text.RegularExpressions 14 @using System.Web 15 16 17 @functions{ 18 public class WrapMethods 19 { 20 //Gets the contrasting color 21 public static string getContrastYIQ(string hexcolor) 22 { 23 if (hexcolor != "") 24 { 25 hexcolor = Regex.Replace(hexcolor, "[^0-9a-zA-Z]+", ""); 26 27 int r = Convert.ToByte(hexcolor.Substring(0, 2), 16); 28 int g = Convert.ToByte(hexcolor.Substring(2, 2), 16); 29 int b = Convert.ToByte(hexcolor.Substring(4, 2), 16); 30 int yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; 31 32 if (yiq >= 128) 33 { 34 return "black"; 35 } 36 else 37 { 38 return "white"; 39 } 40 } 41 else 42 { 43 return "black"; 44 } 45 } 46 47 48 //Truncate text 49 public static string Truncate (string value, int count, bool strip=true) 50 { 51 if (strip == true){ 52 value = StripHtmlTagByCharArray(value); 53 } 54 55 if (value.Length > count) 56 { 57 value = value.Substring(0, count - 1) + "..."; 58 } 59 60 return value; 61 } 62 63 64 //Strip text from HTML 65 public static string StripHtmlTagByCharArray(string htmlString) 66 { 67 char[] array = new char[htmlString.Length]; 68 int arrayIndex = 0; 69 bool inside = false; 70 71 for (int i = 0; i < htmlString.Length; i++) 72 { 73 char let = htmlString[i]; 74 if (let == '<') 75 { 76 inside = true; 77 continue; 78 } 79 if (let == '>') 80 { 81 inside = false; 82 continue; 83 } 84 if (!inside) 85 { 86 array[arrayIndex] = let; 87 arrayIndex++; 88 } 89 } 90 return new string(array, 0, arrayIndex); 91 } 92 93 //Make the correct count of columns 94 public static string ColumnMaker(int Col, string ScreenSize) 95 { 96 string Columns = ""; 97 98 switch (Col) 99 { 100 case 1: 101 Columns = "col-"+ScreenSize+"-12"; 102 break; 103 104 case 2: 105 Columns = "col-"+ScreenSize+"-6"; 106 break; 107 108 case 3: 109 Columns = "col-"+ScreenSize+"-4"; 110 break; 111 112 case 4: 113 Columns = "col-"+ScreenSize+"-3"; 114 break; 115 116 default: 117 Columns = "col-"+ScreenSize+"-3"; 118 break; 119 } 120 121 return Columns; 122 } 123 124 125 private string Custom(string firstoption, string secondoption) 126 { 127 if (firstoption == "custom") 128 { 129 return secondoption; 130 } 131 else 132 { 133 return firstoption; 134 } 135 } 136 } 137 } 138 139 140 141 142 143 144 @helper GetProductList(dynamic Loop, int ColMD = 3, int ColSM = 3, int ColXS = 1) 145 { 146 int Count = 0; 147 148 int index = 1; 149 150 var embeddedScript = GetString("Ecom:Group:Field.ProductEmbeddedScript"); 151 var embedIndex = GetInteger("Ecom:Group:Field.EmbedScriptStartingIndex"); 152 153 IFormatProvider jsNumberFormat = new NumberFormatInfo() { NumberDecimalSeparator = ".", NumberGroupSeparator = "" }; 154 155 156 var groupService = new GroupService(); 157 var productService = new ProductService(); 158 var pageService = new PageService(); 159 160 // SKI AND Region H 161 bool hasSkiDeal = false; 162 bool hasRegionHDeal = false; 163 bool activateLimitedProducts = false; 164 string limitedProductNumbers = ""; 165 var currentUser = User.GetCurrentExtranetUser(); 166 if (currentUser != null) 167 { 168 var skiGroup = currentUser.Groups.FirstOrDefault(e => e.Name == "SKI"); 169 if (skiGroup != null && !string.IsNullOrEmpty(skiGroup.Name)) 170 { 171 hasSkiDeal = true; 172 } 173 174 hasRegionHDeal = Dynamicweb.Core.Converter.ToBoolean(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_RegionH").Value); 175 activateLimitedProducts = Dynamicweb.Core.Converter.ToBoolean(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_ActivateLimitedProducts").Value); 176 limitedProductNumbers = Dynamicweb.Core.Converter.ToString(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_LimitedProductNumbers").Value); 177 } 178 179 List<string> limitedProductNumbersList = new List<string>(); 180 if (!String.IsNullOrWhiteSpace(limitedProductNumbers) && activateLimitedProducts) 181 { 182 limitedProductNumbersList = limitedProductNumbers.Split(',').ToList(); 183 } 184 185 186 foreach (LoopItem product in Loop) 187 { 188 string GroupLink = "/Default.aspx?ID=" + product.GetString("Ecom:Product.PrimaryOrCurrentPageID") + "&groupid=" + product.GetString("Ecom:Product.PrimaryOrFirstGroupID") + "&productid=" + product.GetString("Ecom:Product.ID"); 189 // string GroupLink = product.GetString("Ecom:Product.LinkGroup.Clean"); 190 int stock = product.GetInteger("Ecom:Product.Stock"); 191 string Name = product.GetString("Ecom:Product.Name"); 192 string Description = product.GetString("Ecom:Product.ShortDescription"); 193 string prodID = product.GetString("Ecom:Product.ID"); 194 string prodVariantID = product.GetString("Ecom:Product.VariantID"); 195 string prodLanguageID = product.GetString("Ecom:Product.LanguageID"); 196 string Image = "/Admin/Public/GetImage.ashx?Image=/Files/Images/Ecom/Products/" + prodID + ".jpg&format=webp&quality=85"; 197 198 //prices and units 199 string defaultUnitId = product.GetString("Ecom:Product.DefaultUnitID"); 200 var prices = product.GetLoop("Product.Prices"); 201 List<string> pricesHtmlList = Hounisen.Website.Helpers.Helpers.PricesListMakeListString(prices); 202 List<Hounisen.Website.Models.Unit> unitsDropdown = Hounisen.Website.Helpers.Helpers.PopulateUnitsDropdown(prices); 203 var unitDefault = unitsDropdown.Where(x => x.Id.Equals(defaultUnitId)).FirstOrDefault(); 204 int minOrder = unitDefault != null ? unitDefault.MinOrder : 1; 205 206 if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product.SelectedVariantComboID"))) 207 { 208 prodID = product.GetString("Ecom:Product.ID") + "&" + product.GetString("Ecom:Product.SelectedVariantComboID"); 209 } 210 211 212 GroupHelper gh = new GroupHelper(); 213 var masterPage = pageService.GetPage(product.GetInteger("Ecom:Product.PrimaryOrCurrentPageID")); 214 masterPage.GetDisplayName(); 215 216 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(product.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 217 var groups = ""; 218 if (group != null) 219 { 220 var groupNames = gh.GetParentsRecursively(group, new List<string>()); 221 groupNames = gh.Format(groupNames, masterPage.GetDisplayName(), group); 222 groups = gh.ListToString(groupNames); 223 } 224 225 // should the button for adding to cart be disabled and show different text 226 bool showLimitedProduct = false; 227 if (activateLimitedProducts) 228 { 229 showLimitedProduct = true; 230 if (limitedProductNumbersList.Count > 0 && limitedProductNumbersList.Contains(product.GetString("Ecom:Product.Number"))) 231 { 232 showLimitedProduct = false; 233 } 234 } 235 236 <div class="product-list__item"> 237 <div class="col-xs-12"> 238 <div class="product-list__item-inner"> 239 <div class="col-xs-12 col-sm-4 col-flex"> 240 241 <div class="product-list-item__primary-image"> 242 @if (currentUser != null) 243 { 244 <a href="@GroupLink" title="@Name"> 245 <img class="product-list-item__image lazy" alt="@Name" data-src="@Image&width=300" class="img-responsive img-center"> 246 </a> 247 <a class="fancybox" data-fancybox href="@Image&width=1000" title="@Name"> 248 <svg class="product-list-item__image-icon"> 249 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/dist/icons/icons.svg#fullscreen"></use> 250 </svg> 251 </a> 252 } 253 else 254 { 255 <a href="@GroupLink" title="@Name"> 256 <img class="product-list-item__image lazy" alt="@Name" data-src="@Image&width=300" class="img-responsive img-center"> 257 </a> 258 <a class="fancybox" data-fancybox href="@Image&width=1000" title="@Name"> 259 <svg class="product-list-item__image-icon"> 260 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/dist/icons/icons.svg#fullscreen"></use> 261 </svg> 262 </a> 263 } 264 265 266 </div> 267 @{ 268 var productObj = productService.GetProductById(prodID, prodVariantID, prodLanguageID); 269 var overlayNameAndColors = new ProductImageOverlayHelper().GetTextAndColor(productObj); 270 271 <div class="product__primary-image__overlay-container"> 272 @foreach (var overlayNameAndColo in overlayNameAndColors) 273 { 274 <div style="background-color: @overlayNameAndColo.Value" class="product__primary-image__overlay-container__item"> 275 @overlayNameAndColo.Key 276 </div> 277 } 278 </div>} 279 </div> 280 <div class="col-xs-12 col-sm-8"> 281 <div class="product-list-item__info js-product-info"> 282 <div class="row"> 283 @*Title & Number*@ 284 <div class="col-xs-12"> 285 <h4 data-name="@Name" data-product_id="@prodID" data-categories="@groups" class="product-list-item__title"> 286 <a class="product-list-item__title-link" href="@GroupLink">@Name</a> 287 </h4> 288 </div> 289 </div> 290 <div class="row"> 291 <div class="col-xs-12 col-sm-5"> 292 293 <div class="product-list-item__attributes"> 294 <p> 295 <strong>Varenummer:</strong> @product.GetString("Ecom:Product.Number") 296 </p> 297 <p> 298 <strong>@product.GetString("Ecom:Product:Field.Attribut1A"):</strong><br />@product.GetString("Ecom:Product:Field.Attribut1B") 299 </p> 300 <p> 301 <strong>@product.GetString("Ecom:Product:Field.Attribut2A"):</strong> @product.GetString("Ecom:Product:Field.Attribut2B") 302 </p> 303 </div> 304 305 <div class="hidden-xs"> 306 <div class=""> 307 @* IKONER *@ 308 <div class="product-list-item__icons"> 309 @{ 310 foreach (var c in product.GetString("Ecom:Product:Field.Certificates").Split(',')) 311 { 312 if (!string.IsNullOrEmpty(c)) 313 { 314 string src = "/Admin/Public/GetImage.ashx?Image=/Files/Images/Ecom/Certificates/" + @c + ".jpg&format=webp&quality=85&width=100"; 315 <img class="product-list-item__icon lazy" alt="@Translate("Cert_" + c, c)" title="@Translate("Cert_" + c, c)" data-src=@src src=@src> 316 } 317 } 318 } 319 </div> 320 </div> 321 </div> 322 </div> 323 324 <div class="col-xs-12 col-sm-7"> 325 @if (Dynamicweb.Core.Converter.ToBoolean(GetGlobalValue("Global:Extranet.UserName"))) 326 { 327 <ul class="product-list-item__prices"> 328 @foreach (var priceHtml in pricesHtmlList) 329 { 330 <li> 331 @priceHtml 332 </li> 333 } 334 </ul> 335 } 336 </div> 337 </div> 338 339 <div class="row"> 340 <div class="col-xs-12 col-sm-4 col-lg-5"> 341 @* LAGERBEHOLDNING *@ 342 <div class="product-list-item__stock"> 343 @{ 344 if (stock > 0) 345 { 346 <p class="product-list-item__stock-text"> 347 <span class="product-list-item__stock-circle product-list-item__stock-circle--green"></span> På lager 348 </p> 349 } 350 else 351 { 352 <p class="product-list-item__stock-text"> 353 <span class="product-list-item__stock-circle product-list-item__stock-circle--yellow"></span> Kontakt os for leveringstid: 86210800 eller salg@hounisen.com 354 </p> 355 } 356 } 357 </div> 358 359 <div class="product-list-item__see-product"> 360 <a class="product-list-item__link" href="@GroupLink" class="">@Translate("See product", "Se produkt")</a> 361 </div> 362 </div> 363 <div class="col-xs-12 col-sm-8 col-lg-7"> 364 @if (Dynamicweb.Core.Converter.ToBoolean(GetGlobalValue("Global:Extranet.UserName"))) 365 { 366 <div class="row"> 367 @if (showLimitedProduct) 368 { 369 <div class="col-xs-12"> 370 <button class="btn btn--ghost product__button disabled"> 371 @Translate("Kan bestilles på fritekstordre", "Kan bestilles på fritekstordre") 372 </button> 373 </div> 374 } 375 else 376 { 377 <div class="col-xs-7"> 378 <div class="product__addtocart-input js-addtocart-input"> 379 <input type="button" value="-" class="product-list-item__quantity-button product-list-item__quantity-button--minus qtyminus" field="quantity" /> 380 <input type="number" class="product__quantity-input product-list-item__quantity-input quantity" data-name="quantity" name="quantity" value="@minOrder" field="quantity" /> 381 <input type="button" value="+" class="product-list-item__quantity-button product-list-item__quantity-button--plus qtyplus" field="quantity" /> 382 </div> 383 <div class="product__unit-selector" style="display: inline-block;"> 384 @{ 385 int counter = 0; 386 } 387 @foreach (var unitDropdown in unitsDropdown) 388 { 389 var currentUnitPrice = prices[counter].Values["Ecom:Product.Prices.Amount"]; 390 <input type="radio" data-id="@index" data-price="@currentUnitPrice" class="unit-type" id="@(unitDropdown.Id + prodID)" name="UnitID@(product.GetString("Ecom:Product.Number"))" value="@unitDropdown.Id" required data-lot-size="@unitDropdown.LotSize" data-min-order="@unitDropdown.MinOrder" @(unitsDropdown.Count == 1 ? "checked='checked'" : "")> 391 <label for="@(unitDropdown.Id + prodID)">@unitDropdown.Name</label> 392 counter++; 393 } 394 </div> 395 <p class="product__unit-selector-error-message"> 396 @Translate("unit-error-message", "* Du mangler at vælge type") 397 </p> 398 </div> 399 <div class="col-xs-5"> 400 <div class="product__addtocart-button"> 401 <button data-id="@index" type="submit" name="submit" onclick="AddToCart(event, '@prodID', $(this).parent().parent().prev().find('input.quantity').val(), $(this).parent().parent().prev().find('input[name=\'UnitID@(product.GetString("Ecom:Product.Number"))\']:checked').val());" class="btn btn-primary product__button"> 402 @Translate("Add to cart", "Add to cart") 403 <svg class="product__button-icon hidden-xs"> 404 <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/dist/icons/icons.svg#basket"></use> 405 </svg> 406 </button> 407 408 <div class="product-list-item__favorite-list popup-wrap favorite"> 409 410 @if (hasRegionHDeal == false) 411 { 412 <button class="popup-show" data-popup="favorite-list" type="button" title="@Translate("Add to favorites", "Add to favorites")"> 413 <i class="fa fa-star-o"></i> <span>Tilføj til liste</span> 414 </button> 415 <div id="favorite-list" class="popup-form"> 416 <div class="close"> 417 <i class="fa fa-times"></i> 418 </div> 419 <h3>@Translate("Choose list", "Choose list")</h3> 420 <ul> 421 @{ 422 var lists = Dynamicweb.Ecommerce.CustomerCenter.CustomerProductList.GetListsByUserCustomerNumber(currentUser.CustomerNumber); 423 } 424 425 @foreach (var list in lists) 426 { 427 if (list.Products.Where(p => p.ProductId.ToString() == prodID).Count() > 0) 428 { 429 <li> 430 <a href="@(System.Web.HttpContext.Current.Request.Url)&CCRemoveFromMyLists=@prodID&CCAddToListVariantID=&CCAddToListLanguageID=LANG1&CCAddToListID=@list.ListId&CCListType="> 431 <i class="fa fa-star"></i> @list.Name 432 </a> 433 </li> 434 } 435 else 436 { 437 <li> 438 <a href="@(System.Web.HttpContext.Current.Request.Url)&CCAddToMyLists=@prodID&CCAddToListVariantID=&CCAddToListLanguageID=LANG1&CCAddToListID=@list.ListId&CCListType="> 439 <i class="fa fa-star-o"></i> @list.Name 440 </a> 441 </li> 442 } 443 } 444 <li> 445 <a href="/mine-favoritter/opret-favoritliste?ProdID=@prodID"> 446 <i class="fa fa-plus"></i>@Translate("Add new list", "Add new list") 447 </a> 448 </li> 449 </ul> 450 </div> 451 } 452 453 </div> 454 </div> 455 </div> 456 } 457 458 </div> 459 } 460 else 461 { 462 <div class="not-loggedin"> 463 <p class="not-loggedin-text"><a data-toggle="modal" data-target="#login" href="">@Translate("Login", "Login")</a> eller <a href="/kontakt/opret-brugerprofil">Bliv kunde</a> for at se priser og købe på Hounisen.com</p> 464 <a data-toggle="modal" data-target="#login" href="" class="btn btn-primary not-loggedin-button"> 465 <span>Log ind</span> 466 </a> 467 </div> 468 } 469 </div> 470 </div> 471 </div> 472 473 474 </div> 475 </div> 476 </div> 477 </div> 478 479 if (index == embedIndex) 480 { 481 <div class="product-list__item"> 482 <div class="col-xs-12"> 483 @embeddedScript 484 </div> 485 </div> 486 } 487 488 489 Count++; 490 index++; 491 492 if (Count == ColMD) 493 { 494 <div class="row"></div> 495 Count = 0; 496 } 497 } 498 } 499 500 <script> 501 502 document.addEventListener("DOMContentLoaded", function () { 503 504 var addToCartButtons = document.querySelectorAll('.product__button'); 505 var unitTypes = document.getElementsByClassName("unit-type"); 506 var product_names = document.getElementsByClassName("product-list-item__title"); 507 508 addToCartButtons.forEach(function (item) { 509 510 item.addEventListener('click', function () { 511 512 var product_name = product_names[this.dataset.id - 1].dataset.name; 513 var product_id = product_names[this.dataset.id - 1].dataset.product_id; 514 var initialCategories = product_names[this.dataset.id - 1].dataset.categories; 515 var categories = initialCategories.split("_"); 516 var quantity = document.getElementsByClassName("quantity")[this.dataset.id - 1].value; 517 var unitPrice; 518 var variantIsNull = true; 519 var unitTypeName = null; 520 521 //Get unittype price 522 for (const unitType of unitTypes) { 523 524 if (unitType.dataset.id == this.dataset.id) { 525 526 if (unitType.checked == true) { 527 528 var tempPrice = unitType.dataset.price.replace(".", ""); 529 tempPrice = tempPrice.replace(",", "."); 530 unitPrice = parseFloat(tempPrice); 531 variantIsNull = false; 532 unitTypeName = unitType.value; 533 534 unitTypeName = unitTypeName.toString().split("_")[1]; 535 536 } 537 } 538 } 539 540 if (!variantIsNull) { 541 dataLayer.push({ ecommerce: null }); 542 dataLayer.push({ 543 'event': 'add_to_cart', 544 "ecommerce": { 545 "currency": "DKK", 546 "value": unitPrice * parseInt(quantity).toFixed(2), 547 "items": [ 548 { 549 "item_name": product_name + " - " + unitTypeName, 550 'item_id': product_id, 551 'price': unitPrice, 552 "item_brand": "", 553 "item_category": (categories[0] != null ? categories[0] : ""), 554 "item_category2": (categories[1] != null ? categories[1] : ""), 555 "item_category3": (categories[2] != null ? categories[2] : ""), 556 "item_category4": (categories[3] != null ? categories[3] : ""), 557 "item_category5": (categories[4] != null ? categories[4] : ""), 558 "quantity": parseInt(quantity), 559 } 560 ] 561 }, 562 563 }); 564 } 565 }); 566 }) 567 }); 568 569 </script> 570 @using System.Globalization 571 @using Dynamicweb.Content 572 @using Dynamicweb.Ecommerce.Products 573 @using Dynamicweb.Security.UserManagement 574 @using Hounisen.Website.Helpers 575 @using System.Text.RegularExpressions; 576 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 577 578 @helper GetProductGalleryList(dynamic Loop, int ColMD = 3, int ColSM = 3, int ColXS = 1) 579 { 580 int index = 1; 581 var pageService = new PageService(); 582 583 // SKI AND Region H 584 bool hasRegionHDeal = false; 585 bool activateLimitedProducts = false; 586 string limitedProductNumbers = ""; 587 var currentUser = User.GetCurrentExtranetUser(); 588 if (currentUser != null) 589 { 590 hasRegionHDeal = Dynamicweb.Core.Converter.ToBoolean(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_RegionH").Value); 591 activateLimitedProducts = Dynamicweb.Core.Converter.ToBoolean(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_ActivateLimitedProducts").Value); 592 limitedProductNumbers = Dynamicweb.Core.Converter.ToString(currentUser.CustomFieldValues.Find(f => f.CustomField.SystemName == "AccessUser_LimitedProductNumbers").Value); 593 594 } 595 596 var request = HttpContext.Current.Request; 597 bool isOverlay = request.QueryString["Overlay"] == "true"; 598 599 List<string> limitedProductNumbersList = new List<string>(); 600 if (!String.IsNullOrWhiteSpace(limitedProductNumbers) && activateLimitedProducts) 601 { 602 limitedProductNumbersList = limitedProductNumbers.Split(',').ToList(); 603 } 604 605 foreach (LoopItem product in Loop) 606 { 607 string GroupLink = "/Default.aspx?ID=" + product.GetString("Ecom:Product.PrimaryOrCurrentPageID") + "&groupid=" + product.GetString("Ecom:Product.PrimaryOrFirstGroupID") + "&productid=" + product.GetString("Ecom:Product.ID"); 608 // string GroupLink = product.GetString("Ecom:Product.LinkGroup.Clean"); 609 int stock = product.GetInteger("Ecom:Product.Stock"); 610 string name = product.GetString("Ecom:Product.Name"); 611 string formattedName = name.Length > 60 ? name.Substring(0, 60).TrimEnd() : name; 612 string attribute1B = product.GetString("Ecom:Product:Field.Attribut1B"); 613 string description = attribute1B.Length > 25 ? attribute1B.Substring(0, 25).TrimEnd() + "..." : attribute1B; 614 615 string prodID = product.GetString("Ecom:Product.ID"); 616 string Image = "/Admin/Public/GetImage.ashx?Image=/Files/Images/Ecom/Products/" + prodID + ".jpg&format=webp&quality=85"; 617 618 //prices and units 619 string defaultUnitId = product.GetString("Ecom:Product.DefaultUnitID"); 620 var prices = product.GetLoop("Product.Prices"); 621 var price = prices.OrderBy(x => x.GetDouble("Ecom:Product.Prices.BaseUnitPrice")).FirstOrDefault(); 622 string baseUnitPrice = price != null ? price.GetString("Ecom:Product.Prices.BaseUnitPrice") : string.Empty; 623 624 List<Hounisen.Website.Models.Unit> unitsDropdown = Helpers.PopulateUnitsDropdown(prices); 625 var unitDefault = unitsDropdown.Where(x => x.Id.Equals(defaultUnitId)).FirstOrDefault(); 626 int minOrder = unitDefault != null ? unitDefault.MinOrder : 1; 627 628 if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product.SelectedVariantComboID"))) 629 { 630 prodID = product.GetString("Ecom:Product.ID") + "&" + product.GetString("Ecom:Product.SelectedVariantComboID"); 631 } 632 633 GroupHelper gh = new GroupHelper(); 634 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(product.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 635 var masterPage = pageService.GetPage(product.GetInteger("Ecom:Product.PrimaryOrCurrentPageID")); 636 masterPage.GetDisplayName(); 637 var groupNames = gh.GetParentsRecursively(group, new List<string>()); 638 groupNames = gh.Format(groupNames, masterPage.GetDisplayName(), group); 639 var groups = gh.ListToString(groupNames); 640 641 // should the button for adding to cart be disabled and show different text 642 bool showLimitedProduct = false; 643 if (activateLimitedProducts) 644 { 645 showLimitedProduct = true; 646 if (limitedProductNumbersList.Count > 0 && limitedProductNumbersList.Contains(product.GetString("Ecom:Product.Number"))) 647 { 648 showLimitedProduct = false; 649 } 650 } 651 652 <div class="product-list__wrap col-xs-12 col-sm-4"> 653 <div class="product-list__item product-list__item--gallery col-xs-12 @(isOverlay ? "is-overlay" : "") @(currentUser == null ? "not-signed-in" : "")"> 654 <div class="product-list__item-inner product-list__item-inner--gallery"> 655 <div class="col-12 col-flex"> 656 <div class="product-list-item__primary-image product-list-item__primary-image--gallery"> 657 658 @{ 659 660 string imageString = Image + "&width=300"; 661 } 662 663 @if (currentUser != null) 664 { 665 <a href="@GroupLink" title="@name"> 666 <img src="@(isOverlay ? imageString : "")" class="product-list-item__image lazy" alt="@name" data-src="@Image&width=300" class="img-responsive img-center"> 667 </a> 668 } 669 else 670 { 671 <a href="@GroupLink" title="@name"> 672 <img src="@(isOverlay ? imageString : "")" class="product-list-item__image lazy" alt="@name" data-src="@Image&width=300" class="img-responsive img-center"> 673 </a> 674 } 675 </div> 676 </div> 677 <div class="col-12"> 678 <div class="product-list-item__info product-list-item__info--gallery js-product-info"> 679 <div class="row"> 680 @*Title & Number*@ 681 <div class="col-12"> 682 <h5 data-name="@name" data-product_id="@prodID" data-categories="@groups" class="product-list-item__title product-list-item__title--gallery"> 683 <a class="product-list-item__title-link" href="@GroupLink">@formattedName</a> 684 </h5> 685 </div> 686 </div> 687 <div class="row"> 688 <div class="col-12"> 689 690 <div class="product-list-item__attributes product-list-item__attributes--gallery"> 691 <p> 692 <strong>Varenummer:</strong> @product.GetString("Ecom:Product.Number") 693 </p> 694 695 696 @if (isOverlay == false) 697 { 698 699 <p> 700 <strong>@product.GetString("Ecom:Product:Field.Attribut1A"): </strong> @description 701 </p> 702 } 703 704 705 </div> 706 </div> 707 </div> 708 709 <div class="row"> 710 <div class="product-list-item__info__container"> 711 <div class="product-list-item__info__container__item"> 712 @* LAGERBEHOLDNING *@ 713 <div class="product-list-item__stock"> 714 @{ 715 if (stock > 0) 716 { 717 <p class="product-list-item__stock-text"> 718 <span class="product-list-item__stock-circle product-list-item__stock-circle--green"></span> På lager 719 </p> 720 } 721 else 722 { 723 <p class="product-list-item__stock-text"> 724 <span class="product-list-item__stock-circle product-list-item__stock-circle--yellow"></span> Kontakt os 725 </p> 726 } 727 } 728 </div> 729 <div class="product-list-item__see-product"> 730 <a class="product-list-item__link product-list-item__link--gallery" href="@GroupLink" class="">@Translate("See product", "Se produkt")</a> 731 </div> 732 </div> 733 @if (!string.IsNullOrEmpty(baseUnitPrice)) 734 { 735 <div class="product-list-item__info__container__item product-list-item__info__container__item--text"> 736 <div class="product-list-item__info__container__item--grey"><b>Priser fra </b></div><b>@baseUnitPrice</b> kr./stk. 737 </div> 738 } 739 </div> 740 741 <div class="product-list-item__info__control"> 742 @if (Dynamicweb.Core.Converter.ToBoolean(GetGlobalValue("Global:Extranet.UserName"))) 743 { 744 <div class="row"> 745 @if (showLimitedProduct) 746 { 747 <div class="col-xs-12"> 748 <div class="product-list-item__addtocart-button--gallery" style="width: auto !important"> 749 <button class="btn btn--ghost product__button product__button--gallery disabled"> 750 @Translate("Kan bestilles på fritekstordre", "Kan bestilles på fritekstordre") 751 </button> 752 </div> 753 754 </div> 755 } 756 else 757 { 758 <div class="col-xs-6 col-lg-8"> 759 <div class="product__addtocart-input js-addtocart-input"> 760 <input type="button" value="-" class="product-list-item__quantity-button product-list-item__quantity-button--gallery product-list-item__quantity-button--minus qtyminus" field="quantity" /> 761 <input class="product__quantity-input product-list-item__quantity-input product-list-item__quantity-input--gallery quantity" data-name="quantity" name="quantity" value="@minOrder" field="quantity" /> 762 <input type="button" value="+" class="product-list-item__quantity-button product-list-item__quantity-button--gallery product-list-item__quantity-button--plus qtyplus" field="quantity" /> 763 </div> 764 </div> 765 <div class="col-xs-6 col-lg-4"> 766 <div class="product__addtocart-button product-list-item__addtocart-button product-list-item__addtocart-button--gallery"> 767 <button data-id="@index" type="submit" name="submit" onclick="AddToCart(event, '@prodID', $(this).parent().parent().prev().find('input.quantity').val(), $(this).parent().parent().prev().parent().parent().find('input[name=\'UnitID@(product.GetString("Ecom:Product.Number"))\']:checked').val());" class="btn btn-primary product__button product__button--gallery"> 768 @Translate("Add to cart", "Add to cart") 769 </button> 770 <div class="product-list-item__favorite-list product-list-item__favorite-list--gallery popup-wrap favorite"> 771 772 @if (hasRegionHDeal == false) 773 { 774 <button class="popup-show" data-popup="favorite-list" type="button" title="@Translate("Add to favorites", "Add to favorites")"> 775 <i class="fa fa-star-o"></i> <span>Tilføj til liste</span> 776 </button> 777 <div id="favorite-list" class="popup-form"> 778 <div class="close"> 779 <i class="fa fa-times"></i> 780 </div> 781 <h3>@Translate("Choose list", "Choose list")</h3> 782 <ul> 783 @{ 784 var lists = Dynamicweb.Ecommerce.CustomerCenter.CustomerProductList.GetListsByUserCustomerNumber(currentUser.CustomerNumber); 785 } 786 787 @foreach (var list in lists) 788 { 789 if (list.Products.Where(p => p.ProductId.ToString() == prodID).Count() > 0) 790 { 791 <li> 792 <a href="@(System.Web.HttpContext.Current.Request.Url)&CCRemoveFromMyLists=@prodID&CCAddToListVariantID=&CCAddToListLanguageID=LANG1&CCAddToListID=@list.ListId&CCListType="> 793 <i class="fa fa-star"></i> @list.Name 794 </a> 795 </li> 796 } 797 else 798 { 799 <li> 800 <a href="@(System.Web.HttpContext.Current.Request.Url)&CCAddToMyLists=@prodID&CCAddToListVariantID=&CCAddToListLanguageID=LANG1&CCAddToListID=@list.ListId&CCListType="> 801 <i class="fa fa-star-o"></i> @list.Name 802 </a> 803 </li> 804 } 805 } 806 <li> 807 <a href="/mine-favoritter/opret-favoritliste?ProdID=@prodID"> 808 <i class="fa fa-plus"></i>@Translate("Add new list", "Add new list") 809 </a> 810 </li> 811 </ul> 812 </div> 813 } 814 815 </div> 816 </div> 817 </div> 818 } 819 </div> 820 if (!showLimitedProduct){ 821 <div class="row"> 822 <div class="col-xs-12"> 823 <div class="product__unit-selector" style="margin: 0;"> 824 @{ 825 int counter = 0; 826 } 827 @foreach (var unitDropdown in unitsDropdown) 828 { 829 var currentUnitPrice = prices[counter].Values["Ecom:Product.Prices.Amount"]; 830 <input type="radio" data-id="@index" data-price="@currentUnitPrice" class="unit-type" id="@(unitDropdown.Id + prodID)" name="UnitID@(product.GetString("Ecom:Product.Number"))" value="@unitDropdown.Id" required data-lot-size="@unitDropdown.LotSize" data-min-order="@unitDropdown.MinOrder" @(unitsDropdown.Count == 1 ? "checked='checked'" : "")> 831 <label for="@(unitDropdown.Id + prodID)" style="font-size: 14px;">@unitDropdown.Name</label> 832 counter++; 833 } 834 </div> 835 <p class="product__unit-selector-error-message"> 836 @Translate("unit-error-message", "* Du mangler at vælge type") 837 </p> 838 </div> 839 </div> 840 } 841 } 842 else 843 { 844 <div class="not-loggedin not-loggedin--gallery"> 845 846 <a data-toggle="modal" data-target="#login" href="" class="btn btn-primary not-loggedin-button"> 847 <span>Log ind</span> 848 </a> 849 </div> 850 } 851 </div> 852 </div> 853 </div> 854 </div> 855 </div> 856 </div> 857 </div> 858 859 index++; 860 } 861 } 862 863 <script> 864 865 document.addEventListener("DOMContentLoaded", function () { 866 867 var addToCartButtons = document.querySelectorAll('.product__button'); 868 var unitTypes = document.getElementsByClassName("unit-type"); 869 var product_names = document.getElementsByClassName("product-list-item__title"); 870 871 addToCartButtons.forEach(function (item) { 872 873 item.addEventListener('click', function () { 874 875 var product_name = product_names[this.dataset.id - 1].dataset.name; 876 var product_id = product_names[this.dataset.id - 1].dataset.product_id; 877 var initialCategories = product_names[this.dataset.id - 1].dataset.categories; 878 var categories = initialCategories.split("_"); 879 var quantity = document.getElementsByClassName("quantity")[this.dataset.id - 1].value; 880 var unitPrice; 881 var variantIsNull = true; 882 var unitTypeName = null; 883 884 //Get unittype price 885 for (const unitType of unitTypes) { 886 887 if (unitType.dataset.id == this.dataset.id) { 888 889 if (unitType.checked == true) { 890 891 var tempPrice = unitType.dataset.price.replace(".", ""); 892 tempPrice = tempPrice.replace(",", "."); 893 unitPrice = parseFloat(tempPrice); 894 variantIsNull = false; 895 unitTypeName = unitType.value; 896 897 unitTypeName = unitTypeName.toString().split("_")[1]; 898 899 } 900 } 901 } 902 903 if (!variantIsNull) { 904 dataLayer.push({ ecommerce: null }); 905 dataLayer.push({ 906 'event': 'add_to_cart', 907 "ecommerce": { 908 "currency": "DKK", 909 "value": unitPrice * parseInt(quantity).toFixed(2), 910 "items": [ 911 { 912 "item_name": product_name + " - " + unitTypeName, 913 'item_id': product_id, 914 'price': unitPrice, 915 "item_brand": "", 916 "item_category": (categories[0] != null ? categories[0] : ""), 917 "item_category2": (categories[1] != null ? categories[1] : ""), 918 "item_category3": (categories[2] != null ? categories[2] : ""), 919 "item_category4": (categories[3] != null ? categories[3] : ""), 920 "item_category5": (categories[4] != null ? categories[4] : ""), 921 "quantity": parseInt(quantity), 922 } 923 ] 924 }, 925 926 }); 927 } 928 }); 929 }) 930 }); 931 932 </script> 933 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 934 935 @helper GetB2BProductList(dynamic Loop) 936 { 937 <form name="multiForm" id="multiForm" method="post"> 938 <input type="hidden" name="CartCmd" id="CartCmd" value="addMulti" /> 939 <table class="table table-striped"> 940 <thead> 941 <tr> 942 <th></th> 943 <th class="item-no"> 944 <a href="@GetSortingUrl("Number")"><span title="@Translate("Item no", "Item no")">@Translate("Item no", "Item no").</span></a> 945 </th> 946 <th> 947 <a href="@GetSortingUrl("Name")"><span title="@Translate("Item name", "Item name")">@Translate("Item name", "Item name")</span></a> 948 </th> 949 <th class="group-text"> 950 <a href="@GetSortingUrl("CustomField_House")"><span title="@Translate("Category", "Category")">@Translate("Category", "Category")</span></a> 951 </th> 952 <th class="stock-title" style="width: 60px"> 953 <span title="@Translate("Stock", "Stock")">@Translate("Stock", "Stock")</span> 954 </th> 955 <th class="price-title"> 956 <span title="@Translate("Price", "Price")">@Translate("Price", "Price")</span> 957 </th> 958 <th> 959 <span title="@Translate("Quantity", "Quantity")">@Translate("Quantity", "Quantity")</span> 960 </th> 961 <th class="button-title">&nbsp;</th> 962 </tr> 963 </thead> 964 <tbody class="table-row"> 965 966 @foreach (LoopItem product in Loop) 967 { 968 var n = product.GetString("Ecom:Product.LoopCounter"); 969 var productId = product.GetString("Ecom:Product.ID"); 970 var variantId = product.GetString("Ecom:Product.VariantID"); 971 string Image = product.GetString("Ecom:Product.ImageLarge.Default.Clean"); 972 string GroupLink = "/Default.aspx?ID=" + product.GetString("Ecom:Product.PrimaryOrCurrentPageID") + "&groupid=" + product.GetString("Ecom:Product.PrimaryOrFirstGroupID") + "&productid=" + product.GetString("Ecom:Product.ID"); 973 // string GroupLink = product.GetString("Ecom:Product.LinkGroup.Clean"); 974 string Name = product.GetString("Ecom:Product.Name"); 975 string postinggroup = product.GetString("Ecom:Product:Field.House"); 976 string Description2 = product.GetString("Ecom:Product:Field.Description2"); 977 string Discount = product.GetString("Ecom:Product.Discount.Price"); 978 string Price = product.GetString("Ecom:Product.Price"); 979 string number = product.GetString("Ecom:Product.Number"); 980 string unit = product.GetString("Ecom:Product:Field.Unit"); 981 string qtyprparcel = product.GetString("Ecom:Product:Field.QtyPrParcel"); 982 string storestock = product.GetString("Ecom:Product.Stock"); 983 int quantitystock = product.GetInteger("Ecom:Product.Stock"); 984 string disabled = ""; 985 string disabledinput = ""; 986 foreach (LoopItem stockUnit in product.GetLoop("StockLocations")) 987 { 988 if (stockUnit.GetInteger("Ecom:StockLocation.ID") == product.GetInteger("Ecom:ContextStockLocation.ID")) 989 { 990 quantitystock = stockUnit.GetInteger("Ecom:StockLocation.Quantity"); 991 } 992 } 993 994 if (@quantitystock <= 0) 995 { 996 disabled = "noStock"; 997 disabledinput = "disabled"; 998 } 999 1000 if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product.SelectedVariantComboID"))) 1001 { 1002 productId = product.GetString("Ecom:Product.ID") + "&" + product.GetString("Ecom:Product.SelectedVariantComboID"); 1003 } 1004 1005 <tr class="clickable-row" data-href="@GroupLink"> 1006 <td class="image-title"> 1007 <figure style="" class="productfigure"> 1008 <img alt="" src="/Admin/Public/Getimage.ashx?width=40&amp;height=40&amp;compression=85&amp;Crop=5&amp;image=@Image&format=WebP&Quality=90" width="40" height="40" class="img-responsive img-center lazy"> 1009 </figure> 1010 <div class="big-hover-image" style="display: none"> 1011 <img alt="" src="/Admin/Public/Getimage.ashx?width=300&amp;height=300&amp;compression=85&amp;Crop=5&amp;image=@Image&format=WebP&Quality=90" width="300" height="300" class="img-responsive img-center lazy"> 1012 </div> 1013 </td> 1014 <td class="item-no">@number</td> 1015 <td class="desc"><span title="@Name" class="click">@Name</span></td> 1016 <td class="group-text">@postinggroup</td> 1017 <td class="stock-title" align="right">@quantitystock.ToString()</td> 1018 <td class="retai-price" align="right">@Price</td> 1019 <td class="quanity-title"> 1020 @if (!string.IsNullOrWhiteSpace(qtyprparcel)) 1021 { 1022 <input id="@("Quantity" + @n)" type="number" class="quantity form-control hidden-print" @disabledinput name="@("Quantity" + @n)" value="0" min="0" max="@quantitystock" step="@qtyprparcel"> 1023 } 1024 else 1025 { 1026 <input id="@("Quantity" + @n)" type="number" class="quantity form-control hidden-print" @disabledinput name="@("Quantity" + @n)" value="0" min="0" max="@quantitystock" step="1"> 1027 } 1028 </td> 1029 <td class="button-title"> 1030 <input type="hidden" name="@("ProductLoopCounter" + @n)" value="@n" /> 1031 <input type="hidden" name="@("ProductID" + @n)" value="@productId" /> 1032 <input type="hidden" name="@("VariantID" + @n)" value="@variantId" /> 1033 <button type="button" name="submit" onclick="AddToCart(event, '@productId', document.getElementById('@("Quantity" + @n)').value);" class="btn btn-sm btn-dw-cart"><strong>@Translate("Buy")</strong></button> 1034 </td> 1035 </tr> 1036 } 1037 </tbody> 1038 </table> 1039 <div class=""> 1040 <input type="submit" class="btn btn-dw-cart pull-right hidden-print" value="@Translate("productlist_BuyAll", "Buy all")" /> 1041 </div> 1042 </form> 1043 } 1044 1045 1046 @functions { 1047 string GetSortingUrl(string sortBy) { 1048 try 1049 { 1050 var url = GetString("Global:Pageview.Url.Raw"); 1051 1052 var uri = new Uri(url); 1053 var newQueryString = HttpUtility.ParseQueryString(uri.Query); 1054 newQueryString.Remove("SortBy"); 1055 newQueryString.Remove("SortOrder"); 1056 newQueryString.Add("SortBy", sortBy); 1057 newQueryString.Add("SortOrder", "ASC"); 1058 var pagePathWithoutQueryString = uri.GetLeftPart(UriPartial.Path); 1059 1060 return newQueryString.Count > 0 1061 ? String.Format("{0}?{1}", pagePathWithoutQueryString, newQueryString) 1062 : pagePathWithoutQueryString; 1063 } 1064 catch (Exception) 1065 { 1066 //throw; 1067 return string.Empty; 1068 } 1069 } 1070 } 1071 1072 @SnippetStart("JavaScriptBottom") 1073 <script> 1074 document.addEventListener("DOMContentLoaded", function (event) { 1075 var group = document.getElementsByClassName('image-title'); 1076 for (var i = 0; i < group.length; i++) { 1077 var figure = group[i].getElementsByClassName("productfigure")[0]; 1078 figure.addEventListener('mouseover', function(e) { 1079 this.parentNode.getElementsByClassName("big-hover-image")[0].style.display = 'block'; 1080 }); 1081 figure.addEventListener('mouseout', function(e) { 1082 this.parentNode.getElementsByClassName("big-hover-image")[0].style.display = 'none'; 1083 }); 1084 }; 1085 }); 1086 </script> 1087 @SnippetEnd("JavaScriptBottom") 1088 @using Dynamicweb.Security.UserManagement 1089 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 1090 1091 @helper GetProductListRelated(dynamic Loop, int ColMD = 3, int ColSM = 3, int ColXS = 1) 1092 { 1093 var currentUser = User.GetCurrentExtranetUser(); 1094 1095 <ul class="shop-list__list"> 1096 1097 @foreach (LoopItem product in Loop) 1098 { 1099 1100 string GroupLink = "/Default.aspx?ID=" + product.GetString("Ecom:Product.PrimaryOrCurrentPageID") + "&groupid=" + product.GetString("Ecom:Product.PrimaryOrFirstGroupID") + "&productid=" + product.GetString("Ecom:Product.ID"); 1101 string Name = product.GetString("Ecom:Product.Name"); 1102 string Description = product.GetString("Ecom:Product.ShortDescription"); 1103 string prodID = product.GetString("Ecom:Product.ID"); 1104 string Image = "/Admin/Public/GetImage.ashx?Image=/Files/Images/Ecom/Products/" + prodID + ".jpg&format=webp&quality=85"; 1105 1106 <li class="shop-list__item col-xs-12"> 1107 <a class="shop-list__link" href="@GroupLink" title="@Name"> 1108 <figure class="shop-list__figure"> 1109 <img class="shop-list__image lazy" style="width: 213px;" alt="@Name" data-src="@Image&width=213"> 1110 </figure> 1111 <h4 class="shop-list__title">@Name</h4> 1112 <div class="shop-list__text"> 1113 @if (String.IsNullOrEmpty(product.GetString("Ecom:Product.LongDescription"))) 1114 { 1115 var gr = Dynamicweb.Ecommerce.Products.Group.GetGroupById(product.GetString("Ecom:Product.PrimaryOrFirstGroupID")); 1116 1117 @gr.Description.Replace("<a ", "<span ").Replace("</a>", "</span>").Replace("<h2>", "<p>").Replace("</h2>", "</p>") 1118 } 1119 else 1120 { 1121 @product.GetString("Ecom:Product.LongDescription").Replace("<a ", "<span ").Replace("</a>", "</span>").Replace("<h2>", "<p>").Replace("</h2>", "</p>") 1122 } 1123 1124 </div> 1125 <div class="shop-list__price"> 1126 @if (currentUser != null) 1127 { 1128 string baseUnitPrice = String.Empty; 1129 var price = product.GetLoop("Product.Prices").OrderBy(x => x.GetDouble("Ecom:Product.Prices.BaseUnitPrice")).FirstOrDefault(); 1130 if (price != null) 1131 { 1132 baseUnitPrice = price.GetString("Ecom:Product.Prices.BaseUnitPrice"); 1133 } 1134 <span class="shop-list__price-from">Priser fra</span> 1135 <span class="shop-list__price-value">@baseUnitPrice</span> 1136 <span class="shop-list__price-unit">kr./stk.</span> 1137 } 1138 </div> 1139 </a> 1140 </li> 1141 1142 } 1143 </ul> 1144 } 1145 1146 1147 1148 @{ 1149 string grouplink = ""; 1150 1151 if (!string.IsNullOrWhiteSpace(GetString("Ecom:ProductList:Page.GroupID"))) 1152 { 1153 grouplink = "/Default.aspx?ID=" + GetValue("Ecom:ProductList:Page.ID") + "&amp;GroupID=" + GetValue("Ecom:ProductList:Page.GroupID"); 1154 } 1155 else 1156 { 1157 grouplink = "/Default.aspx?ID=" + GetValue("Ecom:ProductList:Page.ID") + "&amp;eComQuery=" + GetValue("Ecom:ProductList:Search.Query"); 1158 } 1159 1160 1161 var id = Dynamicweb.Context.Current.Request.QueryString["ID"]; 1162 var search = Dynamicweb.Context.Current.Request.QueryString["Search"]; 1163 var request = HttpContext.Current.Request; 1164 var listView = request.QueryString["ListView"]; 1165 var isOverlay = request.QueryString["Overlay"] == "true"; 1166 } 1167 1168 1169 <div class="row"> 1170 <div class="col-md-3 hidden-sm hidden-xs" style="padding-right: 30px"> 1171 <aside> 1172 @{ 1173 var queryService = Dynamicweb.Extensibility.ServiceLocator.Current.GetInstance<Dynamicweb.Indexing.Querying.IQueryService>(); 1174 1175 //settings for the query 1176 Dynamicweb.Indexing.Querying.QuerySettings querySettings = new Dynamicweb.Indexing.Querying.QuerySettings(); 1177 querySettings.Take = 10; 1178 Dictionary<string, object> parameters = new Dictionary<string, object>(); 1179 parameters.Add("Search", search); 1180 querySettings.Parameters = parameters; 1181 1182 Dynamicweb.Indexing.Querying.IQueryResult groups = queryService.Query(queryService.LoadQuery("Hounisen", "Hounisen Group Query.query"), querySettings); 1183 Dynamicweb.Indexing.Querying.IQueryResult contents = queryService.Query(queryService.LoadQuery("Hounisen", "Hounisen Content.query"), querySettings); 1184 1185 if (groups.Count > 0) 1186 { 1187 <h3>Grupper</h3> 1188 1189 foreach (var queryResult in groups.QueryResult.Take(6)) 1190 { 1191 IDictionary<string, object> props = queryResult as IDictionary<string, object>; 1192 string linkGroup = props["GroupMetaPrimaryPage"].ToString() + "&GroupID=" + props["GroupID"].ToString(); 1193 1194 string image = (string)props["GroupSmallImage"]; 1195 1196 <div class="tt-suggestion js-selectable"> 1197 <a href="@linkGroup" title=""> 1198 <img class="tt-img" src="/Admin/Public/Getimage.ashx?width=300&height=300&compression=85&Crop=5&image=@image"/> 1199 <span class="name">@props["GroupName"].ToString()</span> 1200 <div class="clearfix"></div> 1201 </a> 1202 </div> 1203 } 1204 } 1205 1206 if (contents.Count > 0) 1207 { 1208 <h3 style="margin-top: 80px">Indhold</h3> 1209 List<string> itemTypes = new List<string> { "UniverseArticlePage" }; 1210 List<Dynamicweb.Content.Page> pages = new List<Dynamicweb.Content.Page>(); 1211 List<string> itemIds = new List<string> { "UniverseCategoryPage" }; 1212 var pageService = new PageService(); 1213 var categoryPages = pageService.GetPagesForItems(new List<string> { "UniverseCategoryPage" }); 1214 1215 1216 foreach (var queryResult in contents.QueryResult) 1217 { 1218 IDictionary<string, object> props = queryResult as IDictionary<string, object>; 1219 string pageID = props["PageID"].ToString(); 1220 var page = new PageService().GetPage(int.Parse(pageID)); 1221 1222 if (page.ItemType != null && page.ItemType != "" && itemTypes.Contains(page.ItemType) && pages.Count < 3) 1223 { 1224 pages.Add(page); 1225 } 1226 } 1227 1228 foreach (var page in pages) 1229 { 1230 var image = (string)page.Item["Image"]; 1231 var header = (string)page.Item["Header"]; 1232 var mainCategory = (string)page.Item["MainCategory"]; 1233 1234 if (string.IsNullOrEmpty(mainCategory)) 1235 { 1236 break; 1237 } 1238 1239 var categoryPage = categoryPages.Where(p => p.Item["Name"].ToString() == mainCategory).FirstOrDefault(); 1240 1241 if (categoryPage == null) 1242 { 1243 continue; 1244 } 1245 1246 var tagColor = categoryPage.Item["TagColor"]; 1247 var textColor = categoryPage.Item["TextColor"]; 1248 1249 string articleUrl = "/Default.aspx?ID=" + page.ID; 1250 1251 //truncate value 1252 if (header.Length > 40) 1253 { 1254 header = header.Substring(0, 35) + "..."; 1255 } 1256 1257 // Each item consists of an image, a tag, some text, and a "read more" link 1258 <div class="uarticles-livesearch__container__item"> 1259 <a href="@articleUrl"> 1260 <img class="uarticles-livesearch__container__item__image" src="@image"> 1261 </a> 1262 <div style="background-color: @tagColor; color: @textColor" class="uarticles-livesearch__container__item__tag">@mainCategory</div> 1263 <div class="uarticles-livesearch__container__item__text-container"> 1264 <a href="@articleUrl" class="uarticles-livesearch__container__item__text-container__header">@header</a> 1265 </div> 1266 <a href="@articleUrl" class="uarticles-livesearch__container__item__readmore"> 1267 Læs mere 1268 <img class="uarticles-livesearch__container__item__readmore__image" src="/Files/Images/vidensunivers/RedCircle_arrow.svg"/> 1269 </a> 1270 </div> 1271 } 1272 } 1273 } 1274 </aside> 1275 </div> 1276 1277 1278 <div class="col-md-9 col-sm-12 col-xs-12"> 1279 1280 1281 @{ 1282 string seeAllResultsUrl = Dynamicweb.Context.Current.Request.RawUrl; 1283 seeAllResultsUrl = System.Text.RegularExpressions.Regex.Replace(seeAllResultsUrl, @"&PageSize=\d+", ""); 1284 seeAllResultsUrl = System.Text.RegularExpressions.Regex.Replace(seeAllResultsUrl, @"&Overlay=\w+", ""); 1285 seeAllResultsUrl = System.Text.RegularExpressions.Regex.Replace(seeAllResultsUrl, @"[?&]LayoutTemplate=[^&]*", ""); 1286 seeAllResultsUrl = System.Text.RegularExpressions.Regex.Replace(seeAllResultsUrl, @"(\?|&)$", ""); 1287 } 1288 1289 <div class="row"> 1290 <div class="col-xs-12" style="margin-top: 20px;"> 1291 1292 1293 1294 <p class="text-center" style="color: #AAAAAA !important; font-size: 14px !important">Din søgning gav @GetValue("Ecom:ProductList.PageProdCnt") resultater</p> 1295 @if (isOverlay == false) 1296 { 1297 <div class="list-view"> 1298 1299 <div class="list-view__control" style="@(listView == "gallery" ? "margin-right: 8px" : "")"> 1300 <button onclick="Hounisen.product.listProductsByView('list')"> 1301 <span class="glyphicon glyphicon-th-list @(listView == null ? "active" : "")"></span> 1302 </button> 1303 1304 <button onclick="Hounisen.product.listProductsByView('gallery')"> 1305 <span class="glyphicon glyphicon-th @(listView == "gallery" ? "active" : "")"></span> 1306 </button> 1307 </div> 1308 1309 </div> 1310 } 1311 @if (isOverlay && (int)GetValue("Ecom:ProductList.PageProdCnt") > 0) 1312 { 1313 <a style="color: white; background-color: #2596be; padding: 5px 20px; border-radius: 7px; top: -4px; right: 22%; position: absolute; transform: translateX(50%)" href="@seeAllResultsUrl">Se alle resultater</a> 1314 } 1315 @if (isOverlay) 1316 { 1317 <svg id="livesearch-overlay__close"> 1318 <use xmlns:xlink="https://www.w3.org/1999/xlink" xlink:href="/dist/icons/icons.svg#close"></use> 1319 </svg> 1320 } 1321 1322 1323 </div> 1324 </div> 1325 1326 1327 <div class="row search-result-list"> 1328 @if (Pageview.Area.Item["EcommerceProductListForm"].ToString() == "b2b") 1329 { 1330 @GetB2BProductList(GetLoop("Products")) 1331 } 1332 else 1333 { 1334 if (listView == "gallery") 1335 { 1336 @GetProductGalleryList(GetLoop("Products"), 3) 1337 } 1338 else 1339 { 1340 @GetProductList(GetLoop("Products"), 3) 1341 } 1342 } 1343 </div> 1344 1345 1346 @if (isOverlay == false) 1347 { 1348 <hr> 1349 <span class="shop-page-info pull-left hidden-sm hidden-xs">@Translate("Showing page", "Showing page") @GetValue("Ecom:ProductList.CurrentPage") @Translate("of", "of") @GetValue("Ecom:ProductList.TotalPages") (@GetValue("Ecom:ProductList.PageProdCnt") @Translate("products", "products"))</span> 1350 <ul class="pagination pull-right"> 1351 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.PrevPage.Clean"))) 1352 { 1353 <li> 1354 <a href="@GetString("Ecom:ProductList.PrevPage.Clean")">&laquo;</a> 1355 </li> 1356 } 1357 @foreach (LoopItem page in GetLoop("Ecom:ProductList.Pages")) 1358 { 1359 if (page.GetBoolean("Ecom:ProductList.Pages.Page.IsCurrent")) 1360 { 1361 <li class="active"> 1362 <a href="@page.GetString("Ecom:ProductList.Pages.Page.Url")">@page.GetValue("Ecom:ProductList.Pages.Page.Number")</a> 1363 </li> 1364 } 1365 else 1366 { 1367 <li> 1368 <a href="@page.GetString("Ecom:ProductList.Pages.Page.Url")">@page.GetValue("Ecom:ProductList.Pages.Page.Number")</a> 1369 </li> 1370 } 1371 } 1372 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.NextPage.Clean"))) 1373 { 1374 <li> 1375 <a href="@GetString("Ecom:ProductList.NextPage.Clean")">&raquo;</a> 1376 </li> 1377 } 1378 </ul> 1379 } 1380 1381 @if (isOverlay == false) 1382 { 1383 <div class="row"> 1384 <div class="col-lg-12"> 1385 <div class="shop-list category-slider slider"> 1386 <div class="owl-carousel"> 1387 @{ 1388 foreach (var queryResult in groups.QueryResult) 1389 { 1390 IDictionary<string, object> props = queryResult as IDictionary<string, object>; 1391 string linkGroup = props["GroupMetaPrimaryPage"].ToString() + "&GroupID=" + props["GroupID"].ToString(); 1392 1393 string resizedGroupImage = VestjyskMarketing.Helpers.ImageHelper.ResizeImage(new ResizeImageSettings() 1394 { 1395 Image = "/Files/" + props["GroupSmallImage"].ToString(), 1396 Width = 220, 1397 Quality = 80 1398 }); 1399 1400 <div class="owl-item owl-custom-item"> 1401 <a class="shop-list__link shop-list__link--slide " style="width: 100%;" href="@linkGroup"> 1402 <figure class="shop-list__figure"> 1403 <img class="shop-list__image lazy" style="width: 220px;" src="@resizedGroupImage" alt="@props["GroupName"].ToString()"> 1404 </figure> 1405 <h4 class="shop-list__title">@props["GroupName"].ToString()</h4> 1406 </a> 1407 </div> 1408 } 1409 } 1410 </div> 1411 </div> 1412 </div> 1413 </div> 1414 } 1415 1416 </div> 1417 </div>

Dansk support (kl. 08-16)

Dag-til-dag levering

Hurtig genbestilling

Faguddannet personale