MLA 5-50H 4P ST5

Modal iconVisa fler bilder
    • Prisförfrågan

Info om maskinen

    • Specifikationer
    • Fler specifikationer
    • Nedladdningar
Error executing template "Designs/Swift/Paragraph/Custom_RelatedProducts.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_e4a4383b245b4e828dc8cf9c19485829.ExecuteAsync()
at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(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.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Core 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 @using System.Linq 5 @using Dynamicweb.Ecommerce.Products 6 @using Dynamicweb.Environment 7 @using Application.Extensions 8 @using Scantruck.Website.Custom.ViewModels 9 10 @if (!Pageview.IsVisualEditorMode) 11 { 12 string lazyHeight = Model.Item?.GetBoolean("SetMinHeightForLazyLoading") == true ? "min-height: 360px" : ""; 13 string theme = !string.IsNullOrWhiteSpace(Model.Item?.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 14 int paragraphId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ParagraphId")) ? Convert.ToInt32(Dynamicweb.Context.Current.Request.Form.Get("ParagraphId")) : 0; 15 16 //Link generation 17 string pageId = Model.Item?.GetLink("ProductSliderServicePage")?.PageId.ToString() ?? ""; 18 string servicePageByNavigationTag = GetPageIdByNavigationTag("RelatedProductSliderService") != 0 ? GetPageIdByNavigationTag("RelatedProductSliderService").ToString() : ""; 19 pageId = string.IsNullOrEmpty(pageId) ? servicePageByNavigationTag : pageId; 20 string HrefTarget = Model.Item?.GetBoolean("OpenNewWindow") == true ? "_blank" : ""; 21 22 bool productViewModelFound = false; 23 ProductViewModel product = new ProductViewModel(); 24 25 ProductViewModelSettings productSetting = new ProductViewModelSettings 26 { 27 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 28 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 29 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 30 ShopId = Pageview.Area.EcomShopId 31 }; 32 33 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 34 { 35 productViewModelFound = true; 36 product = Dynamicweb.Context.Current.Items["ProductDetails"] as ProductViewModel; 37 } 38 39 ProductService productService = new ProductService(); 40 41 string title = Model?.Item?.GetRawValueString("Title", Translate("Products")); 42 43 if (product?.RelatedGroups?.Count > 0) 44 { 45 <div class="custom-related-products"> 46 @if (!string.IsNullOrWhiteSpace(title)) 47 { 48 <h2 class="custom-related-products__title">@title</h2> 49 } 50 @if (product.RelatedGroups.Count > 1) 51 { 52 <ul class="custom-related-products__menu tabs tabs--related"> 53 <li id="related-tabs-toggle" class="tabs__tab__toggle"> 54 <span class="tab-toggle__text"></span> 55 <svg class="tabs__tab__toggle__icon" :class="{ 'tabs__tab__toggle__icon--active': isToggleActive }" xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 14 8"> 56 <path d="M13.6641 2.56489L7.18487 8L6.79492 8L0.33073 2.56489L1.74055 1.42186e-07L7.00489 4.30534L12.2542 1.6812e-08L13.6641 2.56489Z" /> 57 </svg> 58 </li> 59 <li> 60 <ul class="tabs__dropdown custom-related-products__menu__button-container"> 61 @{ 62 int buttonCount = 0; 63 } 64 @foreach (var relatedGroup in product.RelatedGroups.OrderBy(x => x.Id)) 65 { 66 <li id="button-@relatedGroup.Id.ToLower()" data-swiper-target="#swiper-@relatedGroup.Id.ToLower()" class="tabs__tab @(buttonCount == 0 ? "tabs__tab--active" : "") custom-related-products__menu__button-container__button @(buttonCount == 0 ? "custom-related-products__menu__button-container__button--active" : "")">@relatedGroup.Name</li> 67 68 buttonCount++; 69 } 70 </ul> 71 </li> 72 </ul> 73 } 74 <div class="custom-product-slider" id="related-product-sliders"> 75 @{ 76 int groupCount = 0; 77 } 78 79 @foreach (var relatedGroup in product.RelatedGroups.OrderBy(x => x.Id)) 80 { 81 <div id="swiper-@relatedGroup.Id.ToLower()" class="swiper swiper-@relatedGroup.Id.ToLower() swiper-container @(groupCount > 0 ? "collapse" : "collapse show")"> 82 <div class="swiper-controls-container container-xl"> 83 <div class="swiper-pagination swiper-pagination-@relatedGroup.Id.ToLower() swiper-controls-container__custom-slider"></div> 84 <div class="swiper-controls-container__button-container"> 85 <div class="swiper-button-next swiper-button-@relatedGroup.Id.ToLower()-next button-box "> 86 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"> 87 <path d="M6.11959e-07 9L12.17 9L6.58 14.59L8 16L16 8L8 -6.99382e-07L6.59 1.41L12.17 7L7.86805e-07 7L6.11959e-07 9Z" fill="black" /> 88 </svg> 89 </div> 90 <div class="swiper-button-prev swiper-button-@relatedGroup.Id.ToLower()-prev button-box "> 91 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"> 92 <path d="M16 7H3.83L9.42 1.41L8 0L0 8L8 16L9.41 14.59L3.83 9H16V7Z" fill="black" /> 93 </svg> 94 </div> 95 </div> 96 </div> 97 <div class="swiper-wrapper"> 98 99 @{ 100 var reletedProductsFromService = productService.GetByProductIDs(relatedGroup.Products.Select(p => p.ProductId).ToArray(), false, Dynamicweb.Ecommerce.Common.Context.LanguageID, true, false) 101 .OrderByDescending(p => p.ManufacturerId == product.Manufacturer.Id) 102 .Take(10); 103 } 104105106 @foreach (var relatedProduct in reletedProductsFromService) 107 { 108 var productInfo = ViewModelFactory.CreateView(productSetting, relatedProduct.Id) as CustomProductViewModel; 109 if (productInfo == null) continue; 110111 var imagePath = productInfo.HasImages ? productInfo.DefaultImage.Value : productInfo.GetCustomDefaultImage(Pageview.AreaID); 112113 // Cache product fields 114 var productFields = productInfo.ProductFields; 115116 // Extract CustomProductType 117 int customProductType = 0; 118 if (productFields.TryGetValue("CustomProductType", out var typeField) 119 && typeField is Dynamicweb.Ecommerce.ProductCatalog.FieldValueViewModel typeValue 120 && typeValue.Value is List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel> typeList 121 && typeList.Any()) 122 { 123 customProductType = Convert.ToInt32(typeList.First().Value); 124 } 125126 // Extract CustomProductCondition 127 int customProductCondition = 0; 128 if (productFields.TryGetValue("CustomProductCondition", out var conditionField) 129 && conditionField is Dynamicweb.Ecommerce.ProductCatalog.FieldValueViewModel conditionValue 130 && conditionValue.Value is List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel> condList 131 && condList.Any()) 132 { 133 customProductCondition = Convert.ToInt32(condList.First().Value); 134 } 135136137 // Determine classification and premium status 138 bool hasClassification = false, isPremium = false; 139 string classification = ""; 140141 if (productInfo.ProductCategories?.TryGetValue("specifications_bc", out var categoryFields) == true && categoryFields.Fields != null) 142 { 143 var bcFields = categoryFields.Fields; 144 classification = bcFields.TryGetValue("M_0010500", out var classField) && classField?.Value != null ? classField.Value.ToString() : ""; 145 hasClassification = !string.IsNullOrWhiteSpace(classification); 146147 isPremium = bcFields.TryGetValue("M_0090530", out var premiumField) && bool.TryParse(premiumField?.Value?.ToString(), out var premium) && premium; 148 } 149150 if (Pageview.AreaID == 6) hasClassification = false; 151152 // Navigation Tag and Spec Fallback 153 string navigationTag = "ShopNewMachines"; 154 string specFallbackGroup = "AllSpecs"; 155156 if (customProductType != 2) // 2 == maskiner 157 { 158 navigationTag = customProductCondition == 2 ? "ShopNewEquipment" : "ShopOldEquipment"; 159 } 160 else 161 { 162 navigationTag = customProductCondition == 2 ? "ShopNewMachines" : "ShopUsedMachines"; 163 specFallbackGroup = customProductCondition == 2 ? "NewMachinesDefaultListSpecs" : "UsedMachinesDefaultListSpecs"; 164 } 165166 var link = productInfo.GetProductLink(GetPageIdByNavigationTag(navigationTag), false); 167168 string manufacturerNameFromViewmodel = productInfo.GetManufacturerName(Pageview.Area.Item); 169 string manufacturerNameToDisplay = !string.IsNullOrEmpty(manufacturerNameFromViewmodel) ? $"{manufacturerNameFromViewmodel} " : ""; 170171 @if (!string.IsNullOrWhiteSpace(productInfo.PrimaryOrDefaultGroup?.Id)) 172 { 173 <div class="swiper-slide custom-product-slider__item"> 174 <div class="custom-product-slider__item-iner"> 175 <a href="@link" class="custom-product-slider__item-name"> 176 @manufacturerNameToDisplay 177 @productInfo.Name 178 @if (hasClassification) 179 { 180 <span class="classification-badge classification-badge--@classification.Replace("+", "_plus")"></span> 181 } 182 </a> 183184 <a href="@link" class="custom-product-slider__item-media"> 185 <picture> 186 @if (productInfo.HasDiscount && productInfo.RelevantDiscountCampaign != null) 187 { 188 bool useCampaignImage = !string.IsNullOrEmpty(productInfo.RelevantDiscountCampaign.CampaignImage.Value); 189 if (useCampaignImage) 190 { 191 <span class="custom-product-slider__item-media-campaign-container"> 192 @{ 193 string imageUrlUnformatted = "/Admin/Public/GetImage.ashx?width={0}&image={1}&format=webp&quality=99"; 194 var campaignImage = string.Format(imageUrlUnformatted, 600, Uri.EscapeDataString(productInfo.RelevantDiscountCampaign.CampaignImage.Value)); 195 } 196 <img class="custom-product-slider__item-media-campaign-container--image" src="@campaignImage" /> 197 </span> 198 } 199 } 200 <img src="@imagePath" alt="@productInfo.Name"> 201 </picture> 202 <div class="custom-product-slider__item-media-overlay"></div> 203 <div class="custom-product-slider__item-tags"> 204 <div class="custom-product-slider__item-link"> 205 <span class="text">@Translate("Se produkt")</span> 206 <span class="icon"> 207 <svg viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg"> 208 <path d="M0.9875 11.6029L15.5915 11.6029L8.8835 18.3109L10.5875 20.0029L20.1875 10.4029L10.5875 0.802928L8.8955 2.49493L15.5915 9.20293L0.9875 9.20293L0.9875 11.6029Z" fill="currentColor" /> 209 </svg> 210 </span> 211 </div> 212 </div> 213214 @if (isPremium) 215 { 216 <div class="product-badge product-badge--premium">@Translate("ProductBadge:Premium")</div> 217 } 218 </a> 219220 @if (productInfo.Price?.Price > 0) 221 { 222 <div class="custom-product-slider__item-price"> 223 <span class="custom-product-slider__item-price-text">@Translate("excl. VAT")</span> 224225 <span class="custom-product-slider__item-price-wrapper"> 226 @if (productInfo.HasDiscount) 227 { 228 <span class="custom-product-slider__item-price-wrapper-discount"> 229 @productInfo.PriceBeforeDiscount.PriceWithoutVat.ToString("N2") 230 </span> 231 } 232 <span class="custom-product-slider__item-price-wrapper-value"> 233 @productInfo.Price.PriceWithoutVat.ToString("N2") @productInfo.Price.CurrencyCode @*ATTENTION: Shows the Price in whole numbers with commas*@ 234 </span> 235236 @if (productInfo.HasDiscount && productInfo.RelevantDiscountCampaign != null && !string.IsNullOrEmpty(productInfo.RelevantDiscountCampaign.CampaignColor) && !string.IsNullOrEmpty(productInfo.RelevantDiscountCampaign.CampaignName)) 237 { 238 <span class="custom-product-slider__item-price-wrapper-campaign" style="background-color: @productInfo.RelevantDiscountCampaign.CampaignColor;"> 239 @productInfo.RelevantDiscountCampaign.CampaignName 240 </span> 241 } 242 </span> 243 </div> 244 } 245246 @{ 247 var productGroup = productInfo.Groups?.FirstOrDefault(); 248 var specGroup = productGroup != null ? productInfo.FieldDisplayGroups?.Values?.FirstOrDefault(group => group.Id.Contains(productGroup.Id)) : null; 249 var defaultGroup = productInfo.FieldDisplayGroups?.Values?.FirstOrDefault(group => group.Id == specFallbackGroup); 250 var groupToUse = specGroup != null && specGroup.Fields.Count > 0 ? specGroup : defaultGroup; 251 } 252253 @if (groupToUse != null && groupToUse.Fields.Count > 0) 254 { 255 <div class="custom-product-slider__item-specs"> 256 @foreach (var fieldViewModel in groupToUse.Fields.Take(5)) 257 { 258 var field = fieldViewModel.Value; 259 var value = field.Value?.ToString(); 260 if (!string.IsNullOrWhiteSpace(value) && value != "0") 261 { 262 value = value == "False" ? Translate("No") : value == "True" ? Translate("Yes") : value; 263264 <div class="custom-product-slider__item-specs-line"> 265 <span class="name">@Translate(field.SystemName == "ProductNumber" ? "Product Number" : field.Name)</span> 266 <span class="value"> 267 @(field.Type == "Double" ? StringFormatExtensions.FormatDecimal(value, Pageview.Area.CultureInfo.ToString()) : value) 268 </span> 269 </div> 270 } 271 } 272 </div> 273 } 274 </div> 275 </div> 276 } 277 } 278279 </div> 280 </div> 281282 <script type="module"> 283 const swiper = new Swiper('.swiper-@relatedGroup.Id.ToLower()', { 284 slidesPerView: 'auto', 285 spaceBetween: 20, 286 speed: 600, 287 navigation: { 288 nextEl: '.swiper-button-@relatedGroup.Id.ToLower()-next', 289 prevEl: '.swiper-button-@relatedGroup.Id.ToLower()-prev' 290 }, 291 pagination: { 292 el: '.swiper-pagination-@relatedGroup.Id.ToLower()', 293 type: 'progressbar' 294 } 295 }) 296 </script> 297298 groupCount++; 299 } 300 </div> 301 </div> 302303 <script> 304 document.querySelectorAll('.custom-related-products__menu__button-container__button').forEach(button => { 305 button.addEventListener('click', event => { 306 document.querySelector('.custom-related-products__menu__button-container__button--active').classList.remove('custom-related-products__menu__button-container__button--active'); 307 button.classList.add('custom-related-products__menu__button-container__button--active'); 308309 document.querySelector('.swiper.show').classList.remove('show'); 310 document.querySelector(button.getAttribute('data-swiper-target')).classList.add('show'); 311 }) 312 }); 313 </script> 314315 <script> 316 const relatedTabLinks = document.querySelectorAll('.custom-related-products__menu .tabs__tab'); 317 const relatedTabToggle = document.getElementById('related-tabs-toggle'); 318 const relatedDropdown = document.querySelector('.custom-related-products__menu .tabs__dropdown'); 319 const relatedIcon = document.querySelector('.custom-related-products__menu .tabs__tab__toggle__icon'); 320321 function toggleRelatedDropdown() { 322 relatedDropdown.classList.toggle('tabs__dropdown--active'); 323 relatedTabToggle.classList.toggle('tabs__tab__toggle--active'); 324 relatedIcon.classList.toggle('tabs__tab__toggle__icon--active'); 325 } 326327 relatedTabLinks.forEach(link => { 328 link.addEventListener('click', function (e) { 329 const activeTab = document.querySelector('.custom-related-products__menu .tabs__tab--active'); 330 activeTab.classList.remove('tabs__tab--active'); 331 this.classList.add('tabs__tab--active'); 332333 relatedTabToggle.querySelector('.tab-toggle__text').textContent = this.textContent; 334 toggleRelatedDropdown(); 335 }); 336 }); 337338 relatedTabToggle.addEventListener('click', function () { 339 toggleRelatedDropdown(); 340 }); 341342 relatedTabToggle.querySelector('.tab-toggle__text').textContent = document.querySelector('.custom-related-products__menu .tabs__tab--active').textContent; 343 </script> 344345 } 346 } 347 else 348 { 349 <div class="alert alert-dark m-0">@Translate("No products available")</div> 350 } 351

Prisförfrågan

Fyll i formuläret och skicka dina frågor eller kommentarer till Scantruck.
Vi återkommer med pris och svar på dina frågor.