Lightweights See Red Reflectors
€ 4,00
Available in stock
Error executing template "Designs/Swift-v2/Paragraph/Swift-v2_ProductFieldDisplayGroupsAccordion.cshtml" System.ArgumentException: An item with the same key has already been added. Key: GROUP332 at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior) at Dynamicweb.Ecommerce.ProductCategoryFieldService.GetCategoriesFromGroups(List`1 categories, HashSet`1& idsHash, IEnumerable`1 groups, Int32 currentLevel, Int32 minLevel, Nullable`1 maxLevel) at Dynamicweb.Ecommerce.ProductCategoryFieldService.GetInheritedCategories(IEnumerable`1 groups, Boolean includeProductProperties) at Dynamicweb.Ecommerce.Products.Categories.ProductCategoryService.GetCategories(Product product, Boolean includeProductProperties) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.GetFieldDisplayGroupValues(ProductViewModelSettings settings, Product product, String languageID, Lazy`1 productIds) at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass9_1.<BulkCreateView>b__61() at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.CreateProductFieldGroupsView(ProductViewModel model, IEnumerable`1 groupSystemNames, Boolean hideZeroValues) at Dynamicweb.Ecommerce.ProductCatalog.ViewModelFactory.CreateView(ProductViewModel model, IEnumerable`1 groupSystemNames, Boolean hideZeroValues) at Dynamicweb.Ecommerce.ProductCatalog.ProductViewModelExtensions.GetProductDisplayGroupFieldsByGroupSystemNames(ProductViewModel productModel, IEnumerable`1 groupSystemNames, Boolean hideZeroValues) at CompiledRazorTemplates.Dynamic.RazorEngine_9bc88db0a2d1413fb6b74d5762f0ea46.GetDisplayGroups(ProductViewModel product) at CompiledRazorTemplates.Dynamic.RazorEngine_9bc88db0a2d1413fb6b74d5762f0ea46.GetContentSettings(ProductViewModel product) at CompiledRazorTemplates.Dynamic.RazorEngine_9bc88db0a2d1413fb6b74d5762f0ea46.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 System.Linq 4 5 @functions { 6 7 class ContentSetting 8 { 9 public FieldGroupViewModel FieldDisplayGroup { get; set; } 10 public string LayoutPath { get; set; } 11 12 public ContentSetting(FieldGroupViewModel fieldDisplayGroup, string layoutPath) 13 { 14 FieldDisplayGroup = fieldDisplayGroup; 15 LayoutPath = GetLayoutPathFormatted(layoutPath); 16 } 17 } 18 19 ProductViewModel GetProduct() 20 { 21 ProductViewModel product = null; 22 23 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 24 { 25 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 26 } 27 28 return product; 29 } 30 31 List<ContentSetting> GetContentSettings(ProductViewModel product) 32 { 33 var displayGroups = GetDisplayGroups(product); 34 string defaultLayout = Model.Item.GetRawValueString("Layout", "list"); 35 var contentSettings = displayGroups.Select(displayGroup => new ContentSetting(displayGroup, defaultLayout)).ToList(); 36 bool layoutsCustomized = Model.Item.GetBoolean("CustomizeLayouts"); 37 38 return layoutsCustomized ? GetContentSettingsCustomizedLayoutSelection(contentSettings) : contentSettings; 39 } 40 41 List<FieldGroupViewModel> GetDisplayGroups(ProductViewModel product) 42 { 43 44 bool hideFieldsWithZeroValue = Model.Item.GetBoolean("HideFieldsWithZeroValue"); 45 var selectedDisplayGroupSystemName = Model.Item.GetList("FieldDisplayGroups")?.GetRawValue().OfType<string>(); 46 var displayGroups = product.GetProductDisplayGroupFieldsByGroupSystemNames(selectedDisplayGroupSystemName, hideFieldsWithZeroValue); 47 48 return displayGroups.ToList(); 49 } 50 51 List<ContentSetting> GetContentSettingsCustomizedLayoutSelection(List<ContentSetting> contentSettings) 52 { 53 var selections = Model.Item.GetItems("FieldDisplayGroupLayoutSelector"); 54 55 foreach (var contentSetting in contentSettings) 56 { 57 foreach (var selection in selections) 58 { 59 string displayGroupSystemName = string.Empty; 60 string layoutPath = string.Empty; 61 62 foreach (var field in selection.Fields) 63 { 64 displayGroupSystemName = field.SystemName == "FieldDisplayGroups" ? field.GetRawValueString() : displayGroupSystemName; 65 layoutPath = field.SystemName == "Layout" ? field.GetRawValueString() : layoutPath; 66 } 67 68 if (displayGroupSystemName == contentSetting.FieldDisplayGroup.SystemName) 69 { 70 contentSetting.LayoutPath = GetLayoutPathFormatted(layoutPath); 71 } 72 } 73 } 74 75 return contentSettings; 76 } 77 78 public static string GetLayoutPathFormatted(string layout) 79 { 80 string layoutPathInCapitalCase = layout[0].ToString().ToUpper() + layout.Substring(1); 81 return $"Components/Specifications/{layoutPathInCapitalCase}.cshtml"; 82 } 83 84 } 85 86 @{ 87 var product = GetProduct(); 88 89 if (product is object) 90 { 91 92 var accordionContentSettings = GetContentSettings(product); 93 94 string title = Model.Item.GetString("Title"); 95 bool hideLabels = Model.Item.GetBoolean("HideFieldLabels"); 96 bool hideTitle = Model.Item.GetBoolean("HideTitle"); 97 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "display-4"); 98 var templateParams = new Dictionary<string, object> 99 { 100 {"Size", "compact" }, 101 //Hide title and group headers only apply to the accordion layout, not its tab content layouts 102 { "HideGroupHeaders", true }, 103 { "HideTitle", true } 104 }; 105 106 string gapCss = "gap-2"; 107 108 <div class="h-100 item_@Model.Item.SystemName.ToLower()" data-dw-colorscheme="@Model.ColorScheme?.Id"> 109 <div class="grid @(gapCss)"> 110 @if (!hideTitle) 111 { 112 <h2 class="g-col-12 @titleFontSize">@Model.Item.GetString("Title")</h2> 113 } 114 <div class="g-col-12"> 115 <div class="accordion accordion-flush w-100" id="Specifications_@Model.ID"> 116 @foreach (var contentSetting in accordionContentSettings) 117 { 118 var id = Guid.NewGuid().ToString(); 119 string groupHeadingId = $"SpecificationHeading_{Model.ID}_{id}"; 120 string groupItemId = $"SpecificationItem_{Model.ID}_{id}"; 121 122 <div class="accordion-item"> 123 <h2 class="accordion-header" id="@groupHeadingId"> 124 <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#@groupItemId" aria-expanded="false" aria-controls="@groupItemId"> 125 @contentSetting.FieldDisplayGroup.Name 126 </button> 127 </h2> 128 129 <div id="@groupItemId" class="accordion-collapse collapse" aria-labelledby="@groupHeadingId" data-bs-parent="#Specifications_@Model.ID"> 130 <div class="accordion-body"> 131 <div class="g-col-12"> 132 <dl class="grid @(gapCss)"> 133 @{ 134 templateParams["Groups"] = new List<FieldGroupViewModel> { contentSetting.FieldDisplayGroup }; 135 @RenderPartial(contentSetting.LayoutPath, Model, templateParams); 136 } 137 </dl> 138 </div> 139 </div> 140 </div> 141 </div> 142 } 143 </div> 144 </div> 145 </div> 146 </div> 147 } 148 else 149 { 150 <div class="alert alert-dark m-0">@Translate("Field display groups will be shown here if any")</div> 151 } 152 } 153
Similar products