S171-16E

    • Price inquiry

Info about the machine

    • Specifications
    • More specifications
    • Downloads
Error executing template "Designs/Swift/Paragraph/Custom_RelatedProducts.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.GetOrderedInheritableParentIds(Group group, String defaultLanguageId)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.RecursivelySearchForFieldValues(Group group, String defaultLanguageId, List`1 categoryFields)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.RecursivelySearchForFieldValues(Group group, String defaultLanguageId, List`1 categoryFields)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.RecursivelySearchForFieldValues(Group group, String defaultLanguageId, List`1 categoryFields)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.RecursivelySearchForFieldValues(Group group, String defaultLanguageId, List`1 categoryFields)
at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
at System.Lazy`1.CreateValue()
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.GetGroupFieldValuesByLanguage(Group group, List`1 categoryFields, String languageId, Boolean isInheritedValue, Boolean searchRecursively)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.GetGroupCategoryFieldValues(IEnumerable`1 groups, List`1 fields, Boolean allowFallback)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldGroupValueService.GetDefaultCategoryValuesFromGroups(IEnumerable`1 groupInfos, List`1 catFields)
at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryFieldValueService.GetProductCategoryFieldValue(Product product, String categoryId, Field field)
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.CreateView(ProductViewModelSettings settings, Product product, Field field)
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetFieldDisplayGroupValues(ProductViewModelSettings settings, Product product, String languageID, Lazy`1 productIds)
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass3_1.<BulkCreateView>b__59()
at Dynamicweb.Ecommerce.ProductCatalog.ViewModelPropertyFiller`1.Fill[S](T model, String propertyName, Func`1 source)
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.BulkCreateView(ProductViewModelSettings settings, Boolean isRecursive, IList`1 products)
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.CreateView(ProductViewModelSettings settings, Product product)
at CompiledRazorTemplates.Dynamic.RazorEngine_a6f01f4f58b44571895a4fb9d3243558.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.Environment 6 @using Application.Extensions 7 @using Scantruck.Website.Custom.ViewModels 8 9 @if (!Pageview.IsVisualEditorMode) 10 { 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 string title = Model?.Item?.GetRawValueString("Title", Translate("Products")); 40 41 if (product?.RelatedGroups?.Count > 0) 42 { 43 <div class="custom-related-products"> 44 @if (!string.IsNullOrWhiteSpace(title)) 45 { 46 <h2 class="custom-related-products__title">@title</h2> 47 } 48 @if (product.RelatedGroups.Count > 1) 49 { 50 <ul class="custom-related-products__menu tabs tabs--related"> 51 <li id="related-tabs-toggle" class="tabs__tab__toggle"> 52 <span class="tab-toggle__text"></span> 53 <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"> 54 <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" /> 55 </svg> 56 </li> 57 <li> 58 <ul class="tabs__dropdown custom-related-products__menu__button-container"> 59 @{ 60 int buttonCount = 0; 61 } 62 @foreach (var relatedGroup in product.RelatedGroups.OrderBy(x => x.Id)) 63 { 64 <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> 65 66 buttonCount++; 67 } 68 </ul> 69 </li> 70 </ul> 71 } 72 <div class="custom-product-slider" id="related-product-sliders"> 73 @{ 74 int groupCount = 0; 75 } 76 77 @foreach (var relatedGroup in product.RelatedGroups.OrderBy(x => x.Id)) 78 { 79 <div id="swiper-@relatedGroup.Id.ToLower()" class="swiper swiper-@relatedGroup.Id.ToLower() swiper-container @(groupCount > 0 ? "collapse" : "collapse show")"> 80 <div class="swiper-controls-container container-xl"> 81 <div class="swiper-pagination swiper-pagination-@relatedGroup.Id.ToLower() swiper-controls-container__custom-slider"></div> 82 <div class="swiper-controls-container__button-container"> 83 <div class="swiper-button-next swiper-button-@relatedGroup.Id.ToLower()-next button-box "> 84 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"> 85 <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" /> 86 </svg> 87 </div> 88 <div class="swiper-button-prev swiper-button-@relatedGroup.Id.ToLower()-prev button-box "> 89 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none"> 90 <path d="M16 7H3.83L9.42 1.41L8 0L0 8L8 16L9.41 14.59L3.83 9H16V7Z" fill="black" /> 91 </svg> 92 </div> 93 </div> 94 </div> 95 <div class="swiper-wrapper"> 96 @foreach (var relatedProduct in relatedGroup.Products.Take(10)) 97 { 98 var productInfo = ViewModelFactory.CreateView(productSetting, relatedProduct.ProductId) as CustomProductViewModel; 99 if (productInfo == null) continue; 100101 var imagePath = productInfo.HasImages ? productInfo.DefaultImage.Value : productInfo.GetCustomDefaultImage(Pageview.AreaID); 102103 // Cache product fields 104 var productFields = productInfo.ProductFields; 105106 // Extract CustomProductType 107 int customProductType = 0; 108 if (productFields.TryGetValue("CustomProductType", out var typeField) 109 && typeField is Dynamicweb.Ecommerce.ProductCatalog.FieldValueViewModel typeValue 110 && typeValue.Value is List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel> typeList 111 && typeList.Any()) 112 { 113 customProductType = Convert.ToInt32(typeList.First().Value); 114 } 115116 // Extract CustomProductCondition 117 int customProductCondition = 0; 118 if (productFields.TryGetValue("CustomProductCondition", out var conditionField) 119 && conditionField is Dynamicweb.Ecommerce.ProductCatalog.FieldValueViewModel conditionValue 120 && conditionValue.Value is List<Dynamicweb.Ecommerce.ProductCatalog.FieldOptionValueViewModel> condList 121 && condList.Any()) 122 { 123 customProductCondition = Convert.ToInt32(condList.First().Value); 124 } 125126127 // Determine classification and premium status 128 bool hasClassification = false, isPremium = false; 129 string classification = ""; 130131 if (productInfo.ProductCategories?.TryGetValue("specifications_bc", out var categoryFields) == true && categoryFields.Fields != null) 132 { 133 var bcFields = categoryFields.Fields; 134 classification = bcFields.TryGetValue("M_0010500", out var classField) && classField?.Value != null ? classField.Value.ToString() : ""; 135 hasClassification = !string.IsNullOrWhiteSpace(classification); 136137 isPremium = bcFields.TryGetValue("M_0090530", out var premiumField) && bool.TryParse(premiumField?.Value?.ToString(), out var premium) && premium; 138 } 139140 if (Pageview.AreaID == 6) hasClassification = false; 141142 // Navigation Tag and Spec Fallback 143 string navigationTag = "ShopNewMachines"; 144 string specFallbackGroup = "AllSpecs"; 145146 if (customProductType != 2) // 2 == maskiner 147 { 148 navigationTag = customProductCondition == 2 ? "ShopNewEquipment" : "ShopOldEquipment"; 149 } 150 else 151 { 152 navigationTag = customProductCondition == 2 ? "ShopNewMachines" : "ShopUsedMachines"; 153 specFallbackGroup = customProductCondition == 2 ? "NewMachinesDefaultListSpecs" : "UsedMachinesDefaultListSpecs"; 154 } 155156 var link = productInfo.GetProductLink(GetPageIdByNavigationTag(navigationTag), false); 157158 @if (!string.IsNullOrWhiteSpace(productInfo.PrimaryOrDefaultGroup?.Id)) 159 { 160 <div class="swiper-slide custom-product-slider__item"> 161 <div class="custom-product-slider__item-iner"> 162 <a href="@link" class="custom-product-slider__item-name"> 163 @productInfo.Name 164 @if (hasClassification) 165 { 166 <span class="classification-badge classification-badge--@classification.Replace("+", "_plus")"></span> 167 } 168 </a> 169170 <a href="@link" class="custom-product-slider__item-media"> 171 <picture> 172 <img src="@imagePath" alt="@productInfo.Name"> 173 </picture> 174 <div class="custom-product-slider__item-media-overlay"></div> 175 <div class="custom-product-slider__item-tags"> 176 <div class="custom-product-slider__item-link"> 177 <span class="text">@Translate("Se produkt")</span> 178 <span class="icon"> 179 <svg viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg"> 180 <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" /> 181 </svg> 182 </span> 183 </div> 184 </div> 185186 @if (isPremium) 187 { 188 <div class="product-badge product-badge--premium">@Translate("ProductBadge:Premium")</div> 189 } 190 </a> 191192 @if (productInfo.Price?.Price > 0) 193 { 194 <div class="custom-product-slider__item-price"> 195 <span class="custom-product-slider__item-price-text">@Translate("excl. VAT")</span> 196 <span class="custom-product-slider__item-price-value"> 197 @productInfo.Price.PriceWithoutVat.ToString("N2") @productInfo.Price.CurrencyCode 198 </span> 199 </div> 200 } 201202 @{ 203 var productGroup = productInfo.Groups?.FirstOrDefault(); 204 var specGroup = productGroup != null ? productInfo.FieldDisplayGroups?.Values?.FirstOrDefault(group => group.Id.Contains(productGroup.Id)) : null; 205 var defaultGroup = productInfo.FieldDisplayGroups?.Values?.FirstOrDefault(group => group.Id == specFallbackGroup); 206 var groupToUse = specGroup != null && specGroup.Fields.Count > 0 ? specGroup : defaultGroup; 207 } 208209 @if (groupToUse != null && groupToUse.Fields.Count > 0) 210 { 211 <div class="custom-product-slider__item-specs"> 212 @foreach (var fieldViewModel in groupToUse.Fields.Take(5)) 213 { 214 var field = fieldViewModel.Value; 215 var value = field.Value?.ToString(); 216 if (!string.IsNullOrWhiteSpace(value) && value != "0") 217 { 218 value = value == "False" ? Translate("No") : value == "True" ? Translate("Yes") : value; 219220 <div class="custom-product-slider__item-specs-line"> 221 <span class="name">@Translate(field.SystemName == "ProductNumber" ? "Product Number" : field.Name)</span> 222 <span class="value"> 223 @(field.Type == "Double" ? StringFormatExtensions.FormatDecimal(value, Pageview.Area.CultureInfo.ToString()) : value) 224 </span> 225 </div> 226 } 227 } 228 </div> 229 } 230 </div> 231 </div> 232 } 233 } 234 </div> 235 </div> 236237 <script type="module"> 238 const swiper = new Swiper('.swiper-@relatedGroup.Id.ToLower()', { 239 slidesPerView: 'auto', 240 spaceBetween: 20, 241 speed: 600, 242 navigation: { 243 nextEl: '.swiper-button-@relatedGroup.Id.ToLower()-next', 244 prevEl: '.swiper-button-@relatedGroup.Id.ToLower()-prev' 245 }, 246 pagination: { 247 el: '.swiper-pagination-@relatedGroup.Id.ToLower()', 248 type: 'progressbar' 249 } 250 }) 251 </script> 252253 groupCount++; 254 } 255 </div> 256 </div> 257258 <script> 259 document.querySelectorAll('.custom-related-products__menu__button-container__button').forEach(button => { 260 button.addEventListener('click', event => { 261 document.querySelector('.custom-related-products__menu__button-container__button--active').classList.remove('custom-related-products__menu__button-container__button--active'); 262 button.classList.add('custom-related-products__menu__button-container__button--active'); 263264 document.querySelector('.swiper.show').classList.remove('show'); 265 document.querySelector(button.getAttribute('data-swiper-target')).classList.add('show'); 266 }) 267 }); 268 </script> 269270 <script> 271 const relatedTabLinks = document.querySelectorAll('.custom-related-products__menu .tabs__tab'); 272 const relatedTabToggle = document.getElementById('related-tabs-toggle'); 273 const relatedDropdown = document.querySelector('.custom-related-products__menu .tabs__dropdown'); 274 const relatedIcon = document.querySelector('.custom-related-products__menu .tabs__tab__toggle__icon'); 275276 function toggleRelatedDropdown() { 277 relatedDropdown.classList.toggle('tabs__dropdown--active'); 278 relatedTabToggle.classList.toggle('tabs__tab__toggle--active'); 279 relatedIcon.classList.toggle('tabs__tab__toggle__icon--active'); 280 } 281282 relatedTabLinks.forEach(link => { 283 link.addEventListener('click', function (e) { 284 const activeTab = document.querySelector('.custom-related-products__menu .tabs__tab--active'); 285 activeTab.classList.remove('tabs__tab--active'); 286 this.classList.add('tabs__tab--active'); 287288 relatedTabToggle.querySelector('.tab-toggle__text').textContent = this.textContent; 289 toggleRelatedDropdown(); 290 }); 291 }); 292293 relatedTabToggle.addEventListener('click', function () { 294 toggleRelatedDropdown(); 295 }); 296297 relatedTabToggle.querySelector('.tab-toggle__text').textContent = document.querySelector('.custom-related-products__menu .tabs__tab--active').textContent; 298 </script> 299300 } 301 } 302 else 303 { 304 <div class="alert alert-dark m-0">@Translate("No products available")</div> 305 } 306

For more information
Contact sales export

Price inquiry

Fill in the form and send your questions or comments to Scantruck.
We will get back to you with a price and answers to your questions.