Product Code:
Type:
Subtype:
Brand:
Field display groups will be shown here if any
Error executing template "/Designs/Swift-v2/Paragraph/Swift-v2_RelatedProductsList_Custom.cshtml" System.ArgumentNullException: Value cannot be null. (Parameter 'source') at System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) at System.Linq.Enumerable.SelectMany[TSource,TResult](IEnumerable`1 source, Func`2 selector) at CompiledRazorTemplates.Dynamic.RazorEngine_2e8b3993e0b249cb80975f535f243e94.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.Ecommerce.ProductCatalog 3 @using Dynamicweb.Frontend 4 5 @{ 6 ProductViewModel product = new ProductViewModel(); 7 8 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 9 { 10 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 11 } 12 13 string servicePageId = Model.Item.GetLink("ServicePage") != null ? Model.Item.GetLink("ServicePage").PageId.ToString() : ""; 14 servicePageId = servicePageId == "" && GetPageIdByNavigationTag("RelatedProductsListService_Custom") != 0 ? GetPageIdByNavigationTag("RelatedProductsListService_Custom").ToString() : servicePageId; 15 string pageSize = Model.Item.GetInt32("PageSize") != 0 ? Model.Item.GetString("PageSize") : "10"; 16 17 string title = !string.IsNullOrEmpty(Model.Item.GetString("Title")) ? Model.Item.GetString("Title") : ""; 18 string hideTitle = Model.Item.GetBoolean("HideTitle").ToString(); 19 string hideImage = Model.Item.GetBoolean("HideImage").ToString(); 20 string hideProductNumber = Model.Item.GetBoolean("HideProductNumber").ToString(); 21 string hideProductName = Model.Item.GetBoolean("HideProductName").ToString(); 22 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "display-6"); 23 24 // Product type filter — comma-separated group IDs selected in Visual Editor 25 IEnumerable<string> productTypeFilter = Model.Item.GetList("ProductTypeFilter")?.GetRawValue().OfType<string>().ToList() ?? new List<string>(); 26 string productTypeFilterString = productTypeFilter.Any() ? string.Join(",", productTypeFilter) : ""; 27 28 string productIds = string.Join(",", product.RelatedGroups 29 .SelectMany(g => g.Products) 30 .Select(p => string.IsNullOrEmpty(p.VariantId) ? p.ProductId : $"{p.ProductId} {p.VariantId}") 31 .Where(s => !string.IsNullOrEmpty(s))); 32 } 33 34 @if (!Pageview.IsVisualEditorMode) 35 { 36 <div id="RelatedProductsListCustomContainer_@Pageview.CurrentParagraph.ID" 37 class="item_@Model.Item.SystemName.ToLower()" @(productIds.Count() == 0 ? "hidden" : "")> 38 <form action="/Default.aspx?ID=@servicePageId" id="RelatedProductsListCustomForm_@Pageview.CurrentParagraph.ID" data-response-target-element="RelatedProductsListCustomContainer_@Pageview.CurrentParagraph.ID"> 39 <input type="hidden" name="ID" value="@servicePageId"> 40 <input type="hidden" name="SourceType" value="related-products"> 41 <input type="hidden" name="ParagraphID" value="@Pageview.CurrentParagraph.ID"> 42 <input type="hidden" name="PageSize" value="@pageSize" id="RelatedProductsListCustomPageSize_@Pageview.CurrentParagraph.ID"> 43 <input type="hidden" name="PageSizeSetting" value="@pageSize"> 44 <input type="hidden" name="Title" value="@title"> 45 <input type="hidden" name="HideTitle" value="@hideTitle"> 46 <input type="hidden" name="HideImage" value="@hideImage"> 47 <input type="hidden" name="HideProductNumber" value="@hideProductNumber"> 48 <input type="hidden" name="HideProductName" value="@hideProductName"> 49 <input type="hidden" name="TitleFontSize" value="@titleFontSize"> 50 <input type="hidden" name="ProductTypeFilter" value="@productTypeFilterString"> 51 <input type="hidden" name="ProductvariantId" value="@productIds"> 52 </form> 53 </div> 54 55 <script type="module"> 56 swift.PageUpdater.Update(document.querySelector("#RelatedProductsListCustomForm_@Pageview.CurrentParagraph.ID")); 57 </script> 58 59 <script> 60 var UpdateRelatedProductsListCustom = function(event, id) { 61 document.querySelector('#RelatedProductsListCustomForm_' + id).setAttribute("data-response-target-element", "RelatedProductsListCustomContainer_" + id); 62 swift.PageUpdater.Update(document.querySelector("#RelatedProductsListCustomForm_" + id)); 63 }; 64 </script> 65 } 66 else 67 { 68 <div class="alert alert-info" role="alert"> 69 <span>@Translate("Related products list")</span> 70 @if (!string.IsNullOrEmpty(title)) 71 { 72 <strong> — @title</strong> 73 } 74 </div> 75 } 76