Error executing template "Designs/Hags2024/eCom/Productlist/h24-product-list.cshtml" System.ComponentModel.Win32Exception (0x80004005): Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again at HagsWeb.Library.Services.FileSystemService.FindFile.Win32Error(Int32 errorCode) at HagsWeb.Library.Services.FileSystemService.FindFile.FindFileEx(FileFoundEventArgs args, Int32 slength) at HagsWeb.Library.Services.FileSystemService.FindFile.Find() at HagsWeb.Library.Methods.AssetManager.AssetManager_Repository.GetDirectoryStructure(String directory, String directorySource) at HagsWeb.Library.Methods.AssetManager.AssetManager_Repository.GetAssets(String productId, AssetType assetType, Boolean cacheResult) at CompiledRazorTemplates.Dynamic.RazorEngine_4edd20219b1b43ca84532e9cd7b95e9f.Execute() in B:\Projects\Hags_Dw915\Files\Templates\Designs\Hags2024\eCom\Productlist\h24-product-list.cshtml:line 338 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.DynamicWrapperService.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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 @using System 3 @using System.Globalization; 4 @using System.Collections.Generic 5 @using System.Linq 6 @using HagsWeb.Library.Methods.AssetManager; 7 @using HagsWeb.Library.BusinessObjects.UsersLists; 8 @using HagsWeb.Library.State; 9 @using HagsWeb.Library.Utilities; 10 @using System.Text.RegularExpressions; 11 @using System.Text; 12 13 @* for this page we want the header to be positioned over the content *@ 14 @SnippetStart("headerClass")@("out-flow")@SnippetEnd("headerClass") 15 16 @{ 17 Dynamicweb.Frontend.PageView thisPage = Dynamicweb.Frontend.PageView.Current() ?? Dynamicweb.Frontend.PageView.Current(); 18 19 string baseUrl = GetGlobalValue("Global:Request.Scheme") + "://" + GetGlobalValue("Global:Request.Host"); 20 string pageUrl = baseUrl + thisPage.SearchFriendlyUrl; 21 22 if (pageUrl.Contains("?sortBy")) 23 { 24 string canonicalUrl = baseUrl + Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + GetValue("Ecom:ProductList:Page.ID")); // works 25 string canonicalListUrl = "<link rel=\"canonical\" href=\"" + canonicalUrl + "\" />"; 26 //override the canonical tag 27 Pageview.Meta.AddTag("customCan", canonicalListUrl); 28 } 29 30 string currentCulture = GetGlobalValue("Global:Area.LongLang"); 31 string currentCountry = currentCulture.Substring(currentCulture.Length - 2); // GB, SE 32 string weglotHeader = System.Web.HttpContext.Current.Request.Headers["weglot-language"]; 33 34 //List<ProductCollectionItem> productCollectionItems = SessionManager.UsersMyProductCollection != null ? SessionManager.UsersMyProductCollection : new List<ProductCollectionItem>(); 35 var siteSection = HagsWeb.Library.Methods.Page.HagsPages.GetSiteSection(thisPage.AreaID, thisPage.ID); 36 37 string globalAreaId = GetGlobalValue("Global:Area.ID"); 38 string globalAreaLongLang = GetGlobalValue("Global:Area.LongLang"); 39 40 var pagelink = "/Default.aspx?ID=" + GetValue("Ecom:ProductList:Page.ID"); 41 string ipPriceAllowed = string.Empty; 42 string productLink = string.Empty; 43 44 if (thisPage.AreaID == 2 || thisPage.AreaID == 7) // Sweden and UK 45 { 46 ipPriceAllowed = HagsWeb.Library.Services.IPService.IPCheck.CountryPriceAllowed(currentCountry); // ZZZ,Hags_GB,Hags_SE and Hags_, Anon_GB, Anon_SE network range checker (Web.config) 47 } 48 49 List<string> materialOptions = new List<string>(); 50 if (SessionManager.IsSessionValueSet("FilterOptions_" + thisPage.ID)) 51 { 52 materialOptions = SessionManager.GetSessionItem("FilterOptions_" + thisPage.ID) as List<string>; 53 } 54 else 55 { 56 foreach (LoopItem item in GetLoop("Products")) 57 { 58 string[] variantId = item.GetString("Ecom:Product.DefaultVariantComboID").Split('.'); 59 string[] variantName = item.GetString("Ecom:Product.DefaultVariantComboName").Split('-'); 60 61 62 if (variantId.Length > 0 && !variantId[0].Contains("A1DEFAULT") && variantName.Length > 0 && !variantName[0].Contains("Not Applicable")) 63 { 64 var material = string.Join(",", variantId[0], variantName[0]); 65 if (!materialOptions.Contains(material) && material != ",") 66 { 67 materialOptions.Add(material); 68 } 69 } 70 } 71 SessionManager.SetSession("FilterOptions_" + thisPage.ID, materialOptions); 72 } 73 var productCount = GetLoop("Products").Count; 74 75 // ProductListWithParagraph.cshtml Get the Paragraph Item Type content the eCom_Catalog module sits on. The Paragraph Template must be CleanModule.cshtml 76 // with an eCom_Catalog module applied and the module List Template must be this template. 77 Dynamicweb.Content.Paragraph paragraph = new Dynamicweb.Content.ParagraphService().GetParagraphsByPageId(thisPage.ID) 78 .FirstOrDefault(n => n.ItemType == "Dw_Paragraph" 79 && n.Template == "CleanModule.cshtml" 80 && n.ModuleSystemName == "eCom_Catalog" && n.ShowParagraph == true); 81 82 // Lookup the Paragraph Item Type for additional content 83 Dynamicweb.Content.Items.Item paragraphItem = new Dynamicweb.Content.Items.Item(); 84 if (paragraph != null) 85 { 86 paragraphItem = new Dynamicweb.Content.ItemService().GetItem(paragraph.ItemType, paragraph.ItemId); 87 } 88 } 89 90 <!--Templates/Hags2024/eCom/ProductList/h24-product-list.cshtml--> 91 92 @if (paragraph != null && paragraphItem != null) 93 { 94 string imageSrc = (string)paragraphItem["Image"]; 95 string imageAltTag = ""; 96 var imageMetadata = Dynamicweb.Content.Files.Metadata.EditorFactory.GetMetadataForFile(imageSrc); 97 imageAltTag = imageMetadata != null ? imageMetadata.GetValue("Image_Alt_Tag") : ""; 98 if (!string.IsNullOrEmpty(imageSrc)) 99 { 100 <section> 101 <div class="hero hero--vignette"> 102 <img class="hero__img" src="@imageSrc" alt="@imageAltTag" /> 103 104 @if ( paragraphItem["Image_Heading"] != "") 105 { 106 <div class="wrapper z-up-10"> 107 <div class="hero__content flow"> 108 <h2>@paragraphItem["Image_Heading"]</h2> 109 </div> 110 </div> 111 } 112 113 </div> 114 </section> 115 } 116 117 @helper renderPageBreadcrumb(string thisUrl, string currentCulture, string productName, string variantOptions) { 118 119 string[] segments = Array.Empty<string>(); 120 Uri uri = new Uri(thisUrl); 121 if (uri.IsWellFormedOriginalString()) 122 { 123 segments = uri.Segments; 124 } 125 126 @* set up this so we can use it's title case method *@ 127 TextInfo thisTextInfo = new CultureInfo(currentCulture,false).TextInfo; 128 129 string first = segments.FirstOrDefault(); 130 string last = segments.LastOrDefault(); 131 132 if (!string.IsNullOrEmpty(productName)) 133 { 134 string stripSpaces = Regex.Replace(productName, @"\s+", " "); // some product names may have 2 or 3 spaces in them 135 productName = stripSpaces.Replace(" ", "-").ToLower(); 136 } 137 138 string concat = string.Empty; 139 140 StringBuilder sb = new StringBuilder(); 141 sb.Append("<ul class=\"product-nav product-nav--arrows\" role=\"list\">"); 142 143 144 foreach (var item in segments.Select((value,i)=>new{i,value})) 145 { 146 var index = item.i; 147 if (true) 148 { 149 string linkText = item.value.Replace("/",""); 150 concat += item.value; 151 152 if (segments.Length <= 2) // A shorthand URL like www.hags.com/hags-dragonfly or www.hags.de/hags-dragonfly 153 { 154 sb.Append("<li>" + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</li>"); 155 } 156 // Request from the Product List with no Product Name 157 else if (item.value.Equals(last, StringComparison.CurrentCultureIgnoreCase) && string.IsNullOrEmpty(productName)) 158 { 159 sb.Append("<li><a href='" + concat.TrimEnd('/') + "' class=''> " + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>"); 160 break; 161 } 162 // will be either the master product or the variant 163 else if (item.value.Equals(last, StringComparison.CurrentCultureIgnoreCase) && !item.value.Equals(productName, StringComparison.CurrentCultureIgnoreCase)) 164 { 165 linkText = variantOptions.Trim().Replace("Not applicable", "").ToLower(); 166 167 168 sb.Append("<li><a href='" + concat.TrimEnd('/') + "' class=''> " + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>"); 169 } 170 else if (index == 2) 171 { 172 sb.Append("<li><a href='" + concat.TrimEnd('/') + "' class=''>Home</a></li>"); 173 } else if ( index > 2 ) { 174 sb.Append("<li><a href='" + concat.TrimEnd('/') + "' class=''>" + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>"); 175 } 176 } 177 } 178 179 sb.Append("</ul>"); 180 181 @(sb.ToString()) 182 } 183 184 <nav class="breadcrumb"> 185 <div class="wrapper"> 186 @renderPageBreadcrumb(pageUrl, GetGlobalValue("Global:Area.LongLang"), string.Empty, string.Empty) 187 </div> 188 </nav> 189 190 <section class="page-intro"> 191 <div class="wrapper"> 192 <div class="page-intro__copy flow"> 193 194 @if ( string.IsNullOrEmpty((string)paragraphItem["Display_Heading"]) ) { 195 <h1 class="ts-5">@paragraphItem["Header"]</h1> 196 } else { 197 <h1 class="ts-5">@paragraphItem["Display_Heading"]</h1> 198 } 199 200 @paragraphItem["Content"] 201 202 </div> 203 </div> 204 </section> 205 } 206 207 @RenderSnippet("nextLevelNav") 208 209 <section> 210 <div class="wrapper flow"> 211 212 @{ 213 string sortOrder = System.Web.HttpContext.Current.Request.QueryString["SortOrder"]; 214 string sortBy = System.Web.HttpContext.Current.Request.QueryString["sortBy"]; 215 string thisSortUrl = "&sortBy=" + sortBy + "&SortOrder=" + sortOrder; 216 217 string[,] sortOptions = new string[,] 218 { 219 {"&sortBy=ProductName&SortOrder=Asc","NameA-Z","Name A-Z" }, 220 {"&sortBy=ProductName&SortOrder=Desc","NameZ-A","Name Z-A"}, 221 {"&sortBy=AgeRange&SortOrder=Asc","AgeAscending","Age Ascending"}, 222 {"&sortBy=AgeRange&SortOrder=Desc","AgeDescending","Age Descending"}, 223 {"&sortBy=SafetyArea&SortOrder=Asc","SafetyAreaAscending","Safety Area Ascending"}, 224 {"&sortBy=SafetyArea&SortOrder=Desc","SafetyAreaDescending","Safety Area Descending"}, 225 {"&sortBy=FallHeight&SortOrder=Asc","FallHeightAscending","Fall Height Ascending"}, 226 {"&sortBy=FallHeight&SortOrder=Desc","FallHeightDescending","Fall Height Descending"} 227 }; 228 } 229 <nav aria-label="Product sort order and filters" class="dropdown-links"> 230 <ul> 231 <li class="dropdown-links__items"> 232 <!-- aria-expanded needs managed with Javascript --> 233 <button type="button" class="btn btn--outline dropdown-links__title" aria-expanded="false" aria-controls="sort-dropdown"> 234 @Translate("SortBy", "Sort by") 235 </button> 236 <ul class="dropdown-links__menu" id="sort-dropdown"> 237 <li> 238 <a href="@(pagelink)" 239 data-action-page="Product listing" 240 data-action-type="Sort by" 241 data-action-label="Default" 242 data-action-value=""> 243 @Translate("Default", "Default") 244 </a> 245 </li> 246 247 @for (int i = 0; i < sortOptions.GetLength(0); i++) 248 { 249 string activeClass = thisSortUrl == sortOptions[i, 0] ? "active" : ""; 250 <li> 251 <a href="@(pagelink)@(sortOptions[i, 0])" class="@activeClass" 252 data-action-page="Product listing" 253 data-action-type="Sort by" 254 data-action-label="@sortOptions[i, 2]" 255 data-action-value=""> 256 @Translate(@sortOptions[i, 1], @sortOptions[i, 2]) 257 </a> 258 </li> 259 } 260 261 @if (((thisPage.AreaID == 2)) && (ipPriceAllowed.Contains(currentCountry) || ipPriceAllowed.Contains("Hags_"))) 262 { 263 <li><a href="@(pagelink)&sortBy=Price&SortOrder=Asc">@Translate("Pricelow-high", "Price low-high")</a></li> 264 <li><a href="@(pagelink)&sortBy=Price&SortOrder=Desc">@Translate("Pricehigh-low", "Price high-low")</a></li> 265 } 266 </ul> 267 </li> 268 @if (materialOptions.Count > 1) 269 { 270 <li class="dropdown-links__items"> 271 <button type="button" class="btn btn--outline dropdown-links__title" aria-expanded="false" aria-controls="filter-dropdown"> 272 @Translate("MaterialOptions", "Material Options") 273 </button> 274 <ul class="dropdown-links__menu" id="filter-dropdown"> 275 <li><a href="@(pagelink)&sortBy=Default&filterBy=Default">@Translate("Default", "Default")</a></li> 276 @foreach (var a in materialOptions) 277 { 278 string[] s = a.Split(','); 279 <li><a href="@(pagelink)&sortBy=Default&filterBy=@(s[0])">@s[1]</a></li> 280 } 281 </ul> 282 </li> 283 } 284 </ul> 285 </nav> 286 287 @helper renderPagination(){ 288 <div class="wrapper"> 289 <nav class="pagination"> 290 <p class="pagination__count">@GetInteger("Ecom:ProductList.PageProdCnt") products</p> 291 <ul class="pagination__list" role="list"> 292 @{ 293 var prevLink = GetString("Ecom:ProductList.PrevPage.Clean"); 294 var nextLink = @GetString("Ecom:ProductList.NextPage.Clean"); 295 var prevLinkAttr = @GetString("Ecom:ProductList.PrevPage"); 296 var nextLinkAttr = @GetString("Ecom:ProductList.NextPage"); 297 var prevLinkClass = (prevLink == "") ? "inactive" : ""; 298 var nextLinkClass = (nextLink == "") ? "inactive" : ""; 299 string anchorTagPrev = (prevLink != "") ? "<a id=\"prevpage\" href=\"" + prevLink + "\" aria-label=\"Previous\">" : ""; 300 string anchorTagPrevClose = (prevLink != "") ? "</a>" : ""; 301 string anchorTagNext = (nextLink != "") ? "<a id=\"nextpage\" href=\"" + nextLink + "\" aria-label=\"Next\">" : ""; 302 string anchorTagNextClose = (nextLink != "") ? "</a>" : ""; 303 } 304 <li class="@prevLinkClass"> 305 @(anchorTagPrev) 306 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--prev"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm16.66 55.907c2.993-2.14 7.16-1.44 9.3 1.553 2.14 2.994 1.44 7.16-1.554 9.3L113.21 90.376l-1.168.834L91.333 106l39.073 27.907c2.994 2.14 3.694 6.306 1.554 9.3-2.14 2.993-6.307 3.693-9.3 1.553l-20.642-14.745-1.038-.741-1.562-1.116-1.041-.744-14.79-10.567A13.319 13.319 0 0 1 78 106c0-4.307 2.08-8.347 5.586-10.847l14.79-10.567 1.042-.744 1.562-1.116 1.038-.741L122.66 67.24Z"/></svg> 307 <span class="visually-hidden">@Translate("page_Previous", "Previous")</span> 308 @(anchorTagPrevClose) 309 </li> 310 <li>@GetString("Ecom:ProductList.CurrentPage") @Translate("page_Of", "of") @GetString("Ecom:ProductList.TotalPages")</li> 311 <li class="@nextLinkClass"> 312 @(anchorTagNext) 313 <span class="visually-hidden">@Translate("page_Next", "Next")</span> 314 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--next"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333ZM96.54 67.24l20.642 14.745 1.038.741 1.561 1.116 1.042.744 1.559 1.114 1.034.739 12.197 8.714A13.319 13.319 0 0 1 141.2 106c0 4.307-2.08 8.347-5.587 10.847l-12.197 8.714-1.034.739-1.559 1.114-1.042.744-1.561 1.116-1.038.741A512447.69 512447.69 0 0 1 96.54 144.76c-2.993 2.14-7.16 1.44-9.3-1.553-2.14-2.994-1.44-7.16 1.553-9.3L127.867 106 88.793 78.093c-2.993-2.14-3.693-6.306-1.553-9.3 2.14-2.993 6.307-3.693 9.3-1.553Z"/></svg> 315 @(anchorTagNextClose) 316 </li> 317 </ul> 318 </nav> 319 </div> 320 } 321 322 323 @renderPagination() 324 </div> 325 </section> 326 327 328 329 330 <section class="products-listing"> 331 <div class="wrapper"> 332 <div class="products-listing__grid"> 333 334 335 @foreach (LoopItem item in GetLoop("Products")) 336 { 337 // Use imageUrl = HagsWeb.Library.Utilities.DWUtilities.GetSingleProductImageUrl(prod); 338 IEnumerable<ProductAsset> productImages = AssetManager_Repository.GetAssets(item.GetString("Ecom:Product.Number"), AssetType.Images, true) 339 .Where(n => n.FileName.StartsWith("medium_")); 340 341 ProductAsset image = productImages.FirstOrDefault(); 342 343 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.VariantID"))) 344 { 345 productLink = item.GetString("Ecom:Product.Link.Clean") + "&VariantID=" + item.GetString("Ecom:Product.VariantID"); 346 } 347 else 348 { 349 productLink = item.GetString("Ecom:Product.Link.Clean"); 350 } 351 352 353 // item.GetLoop("AgeRange.Options") is unreliable in the latest release DW 9.7.2 354 List<string> ageRanges = new List<string>(); 355 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product:Field.AgeRange"))) 356 { 357 ageRanges = HagsWeb.Library.Methods.ProductProperties.ProductAgeRanges.GetAgeRanges(item.GetString("Ecom:Product:Field.AgeRange"), item.GetString("Ecom:Product.LanguageID")); 358 } 359 360 string ageRange = item.GetString("Ecom:Product:Field.AgeRange"); 361 string safetyArea = item.GetString("Ecom:Product:Field.SafetyArea"); 362 string fallHeight = item.GetString("Ecom:Product:Field.FallHeight"); 363 364 string variantId = item.GetString("Ecom:Product.VariantID"); 365 366 //item.GetString("Ecom:Product:Field.AgeRange"); 367 //item.GetString("Ecom:Product:Field.SafetyArea"); 368 //item.GetString("Ecom:Product:Field.FallHeight"); 369 370 //bool isProductCollection = productCollectionItems.Any(n => n.ProductNumber == item.GetString("Ecom:Product.Number")); 371 //var s = HagsWeb.Library.Utilities.DWUtilities.GetProductUrl((item.GetString("Ecom:Product.Number"), thisPage.AreaID); 372 //string productLink = thisPage.SearchFriendlyUrl; 373 //var collectionLink = String.Format(productLink + "?ProductID={0}", item.GetString("Ecom:Product.ID")); 374 string collectionData = string.Format("CCAddToMyLists={0}&CCAddToListVariantID={1}&CCAddToListLanguageID={2}#{3}", item.GetString("Ecom:Product.Number"), item.GetString("Ecom:Product.VariantID"), thisPage.Area.GetByKey("areaecomlanguageid"), siteSection); 375 <div class="product-card"> 376 <input type="hidden" value="@variantId" /> 377 378 <!--div class="product-card__actions"> 379 <button type="button" class="action-btn" data-removeproductlist="" data-addproductlist="@collectionData"> 380 <span class="visually-hidden">@Translate("AddToCollection", "Add to my collection")</span> 381 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"></path></svg> 382 </button> 383 </div--> 384 <div class="product-card__img-silo"> 385 386 @if (image != null && !String.IsNullOrEmpty(image.uri)) 387 { 388 <a href="@productLink)"><img class="product-card__img" src="@image.uri"/></a> 389 } 390 else 391 { 392 <a href="@productLink"><img class="product-card__img" src="/Files/Templates/Designs/HagsCore/res/img/image-not-found.png" /></a> 393 } 394 395 </div> 396 397 398 <div class="product-card__copy"> 399 400 <p class="product-card__heading"><a href="@productLink">@item.GetString("Ecom:Product.Name")</a></p> 401 402 <!--<p><strong>@Translate("ProductNumber", "Product Number"):</strong> @item.GetValue("Ecom:Product.Number")</p>--> 403 @*Only UK and Sweden have Pricing at the moment*@ 404 @if (thisPage.Area.ID == 2 && (ipPriceAllowed.Contains(currentCountry) || ipPriceAllowed.Contains("Hags_"))) /*Sweden - would like no ,00 in dwFormattedPrice*/ 405 { 406 string krPrice = item.GetInteger("Ecom:Product.DBPrice") == 0 ? Translate("RequestAQuote", "Kontakta oss") : item.GetString("Ecom:Product.Price.PriceFormatted").Replace(",00", ""); 407 <p><strong>@Translate("Price", "Price"):</strong> @krPrice</p> 408 } 409 @if (thisPage.Area.ID == 7) /*UK has special pricing and special product number*/ 410 { 411 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product:Field.UKProductNumber"))) 412 { 413 <p><strong>@Translate("ProductNumber", "Product Number"):</strong> @item.GetValue("Ecom:Product:Field.UKProductNumber")</p> 414 } 415 else if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.Number"))) 416 { 417 <p><strong>@Translate("ProductNumber", "Product Number"):</strong> @item.GetValue("Ecom:Product.Number")</p> 418 } 419 420 } 421 <!--a class="" href="@item.GetString("Ecom:Product.Link.Clean")" role="button">@Translate("ProductDetails", "Product Details")</a--> 422 </div> 423 </div> 424 } 425 </div> 426 </div> 427 </section> 428 429 @renderPagination()
Záruky
Zistite, na čo sa vzťahuje poistenie.
Sprievodca údržbou
Ako sa starať o svoje výrobky.
Možnosti farieb a ukotvenia
Preskúmajte svoje možnosti.