Error executing template "Designs/Swift/Paragraph/Swift_ProductGroupList.cshtml" System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) at Dynamicweb.Ecommerce.Products.GroupRelation.GetGroupRelationsByChildId(String childId) at Dynamicweb.Ecommerce.Products.Group.get_IsTopGroup() at Dynamicweb.Ecommerce.Shops.Shop.GetTopLevelGroups(String languageId) at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetGroupsBySettings(PageNavigationSettings ecomSettings) at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetGroups(NavigationTreeNode parent, Page page) at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetNodes(NavigationContext context, NavigationSettings settings, NavigationTreeNode parent) at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext() at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source) at CompiledRazorTemplates.Dynamic.RazorEngine_7df18b5f9cd0426fa8718eefeb29421c.Execute() in D:\dynamicweb.net\Solutions\Dynamicweb\bluedrops.cloud.dynamicweb-cms.com\Files\Templates\Designs\Swift\Paragraph\Swift_ProductGroupList.cshtml:line 16 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.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 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.Rendering 3 @using Dynamicweb.Frontend.Navigation 4 @using Dynamicweb.Ecommerce.Products 5 @using Dynamicweb.Ecommerce.ProductCatalog 6 @using System.IO 7 8 @{ 9 var navigationSettings = new NavigationSettings(); 10 navigationSettings.StartLevel = 3; 11 navigationSettings.Parameters.Add("menu-id", "product-group-list"); 12 13 var navigationViewModel = Navigation.GetNavigationViewModel(navigationSettings); 14 } 15 16 @if (navigationViewModel.Nodes.Count() > 0) 17 { 18 if (Pageview.IsVisualEditorMode) 19 { 20 <div class="alert alert-dark m-0" role="alert"> 21 <span><i class="fas fa-info-circle mr-3"></i></span> <span>@Translate("Group list: The selected groups will be shown here, if any")</span> 22 </div> 23 }else{ 24 @GetNodes(navigationViewModel.Nodes) 25 } 26 } 27 else if (Pageview.IsVisualEditorMode) 28 { 29 <div class="alert alert-dark m-0" role="alert"> 30 <span><i class="fas fa-info-circle mr-3"></i></span> <span>@Translate("Group list: The selected groups will be shown here, if any")</span> 31 </div> 32 } 33 34 @helper GetNodes(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes) 35 { 36 foreach (var node in nodes) 37 { 38 if (node.IsActive) 39 { 40 if (node.Nodes.Count() > 0) 41 { 42 @RenderNodes(node.Nodes) 43 } 44 } 45 else 46 { 47 if (node.Nodes.Count() > 0) 48 { 49 @GetNodes(node.Nodes) 50 } 51 } 52 } 53 } 54 55 @helper RenderNodes(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes) 56 { 57 string layout = Model.Item.GetRawValueString("Layout", "text-bottom"); 58 59 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 60 string groupTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("GroupTheme")) ? " theme " + Model.Item.GetRawValueString("GroupTheme").Replace(" ", "").Trim().ToLower() : ""; 61 62 string horizontalAlignment = Model.Item.GetRawValueString("HorizontalAlignment", "start"); 63 64 switch (horizontalAlignment) 65 { 66 case "start": 67 horizontalAlignment = " justify-content-start"; 68 break; 69 case "center": 70 horizontalAlignment = " justify-content-center"; 71 break; 72 case "end": 73 horizontalAlignment = " justify-content-end"; 74 break; 75 } 76 77 string ratio = Model.Item.GetRawValueString("ImageAspectRatio", "0"); 78 string ratioCssClass = ratio != "0" ? " ratio" : string.Empty; 79 string ratioVariable = ratio != "0" ? "style=\"--bs-aspect-ratio: " + ratio + "\"" : string.Empty; 80 81 int groupsCount = 0; 82 83 foreach (var node in nodes) 84 { 85 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 86 87 if (groupFields != null) 88 { 89 foreach (FieldValueViewModel field in groupFields) 90 { 91 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 92 { 93 if (Convert.ToBoolean(field.Value.ToString())) 94 { 95 groupsCount++; 96 } 97 } 98 } 99 } 100 } 101 102 if (groupsCount != 0) 103 { 104 string paddingClass = !string.IsNullOrEmpty(theme) ? " p-3" : " pb-2 pb-lg-0"; 105 106 if (layout != "pill-button") 107 { 108 109 <nav class="swiffy-slider slider-item-reveal slider-item-nosnap slider-item-show6 slider-nav-round@(paddingClass)@(theme)" style="--swiffy-slider-item-count: 10;" aria-label="@Translate("Product groups")"> 110 <ul class="slider-container @horizontalAlignment"> 111 @foreach (var node in nodes) 112 { 113 string groupImage = ""; 114 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(node.GroupId); 115 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 116 117 if (!string.IsNullOrEmpty(node.GroupId)) 118 { 119 groupImage = !string.IsNullOrEmpty(group.LargeImage) ? "/Files" + group.LargeImage : groupImage; 120 } 121 122 bool showGroup = false; 123 124 if (groupFields != null) 125 { 126 foreach (FieldValueViewModel field in groupFields) 127 { 128 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 129 { 130 if (Convert.ToBoolean(field.Value.ToString())) 131 { 132 showGroup = true; 133 } 134 } 135 } 136 } 137 138 if (showGroup) 139 { 140 string imageRoundedPill = layout == "ball" ? " rounded-pill" : string.Empty; 141 142 <li class="@groupTheme@(string.IsNullOrWhiteSpace(groupImage) && (layout == "ball") ? imageRoundedPill + " overflow-hidden": string.Empty)"> 143 <a href="@node.Link" tabindex="-1" class="text-decoration-none"> 144 145 @if (layout == "text-bottom" || layout == "ball") 146 { 147 148 <div class="d-flex flex-column justify-content-center align-items-center h-100"> 149 @if (!string.IsNullOrWhiteSpace(groupImage)) 150 { 151 152 <div class="@ratioCssClass" @ratioVariable> 153 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=640&crop=0&image=@groupImage" class="overflow-hidden@(imageRoundedPill) img-fluid image-zoom-lg-2-hover" style="object-fit: cover" alt="@node.Name"> 154 </div> 155 } 156 157 <div class="@(ratioCssClass)" @ratioVariable> 158 <div class="d-flex flex-column align-items-center justify-content-center fs-7 text-center p-2"> 159 @node.Name 160 </div> 161 </div> 162 </div> 163 } 164 165 @if (layout == "poster") 166 { 167 <div class="d-flex flex-column justify-content-center align-items-center h-100 position-relative"> 168 @if (!string.IsNullOrWhiteSpace(groupImage)) 169 { 170 <div class="@(ratioCssClass)" @ratioVariable> 171 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=640&crop=0&image=@groupImage" class="img-fluid image-zoom-lg-2-hover" style="object-fit: cover" alt="@node.Name"> 172 </div> 173 <div class="position-absolute text-center fs-5"> 174 @node.Name 175 </div> 176 } 177 else 178 { 179 <div class="@(ratioCssClass)" @ratioVariable> 180 <div class="d-flex flex-column align-items-center justify-content-center text-center fs-5 p-2"> 181 @node.Name 182 </div> 183 </div> 184 } 185 </div> 186 } 187 </a> 188 </li> 189 } 190 } 191 </ul> 192 193 194 @if (groupsCount > 10) 195 { 196 <button type="button" title="Slide to previous" class="slider-nav"></button> 197 <button type="button" title="Slide to next" class="slider-nav slider-nav-next"></button> 198 } 199 200 <script type="module" src="~/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> 201 <script type="module"> 202 swift.AssetLoader.Load('/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css'); 203 document.addEventListener('load.swift.assetloader', function () { 204 swiffyslider.init() 205 }); 206 </script> 207 </nav> 208 } 209 else 210 { 211 <nav class="d-flex flex-wrap gap-3 align-items-center @horizontalAlignment overflow-x-auto@(paddingClass)@(theme)" aria-label="@Translate("Product groups")"> 212 @foreach (var node in nodes) 213 { 214 string groupImage = ""; 215 IList<FieldValueViewModel> groupFields = node.GetProductGroup().GroupFields; 216 217 if (layout == "pill-button" && groupFields != null) 218 { 219 foreach (FieldValueViewModel field in groupFields) 220 { 221 if (field.SystemName == "ProductGroupNavigationImage" && !string.IsNullOrEmpty(field.Value.ToString())) 222 { 223 groupImage = "/Files/Images/" + field.Value.ToString(); 224 } 225 } 226 } 227 228 bool showGroup = false; 229 if (groupFields != null) 230 { 231 foreach (FieldValueViewModel field in groupFields) 232 { 233 if (field.SystemName == "SelectedGroup" && !string.IsNullOrEmpty(field.Value.ToString())) 234 { 235 if (Convert.ToBoolean(field.Value.ToString())) 236 { 237 showGroup = true; 238 } 239 } 240 } 241 } 242 243 if (showGroup) 244 { 245 <a href="@node.Link" tabindex="-1" class="btn btn-secondary rounded-pill @(@groupTheme)"> 246 <div class="d-flex flex-row align-items-center"> 247 @if (!string.IsNullOrWhiteSpace(groupImage)) 248 { 249 if (Path.GetExtension(groupImage).ToLower() == ".svg") 250 { 251 <div class="icon-3 me-2" style="width: 35px"> 252 @ReadFile(groupImage) 253 </div> 254 } 255 else 256 { 257 <div class="me-3" style="width: 35px"> 258 <div class="@ratioCssClass" @(ratioVariable)> 259 <img loading="lazy" src="/Admin/Public/GetImage.ashx?width=35&crop=0&image=@groupImage" style="object-fit: cover" alt=""> 260 </div> 261 </div> 262 } 263 } 264 <div class="fs-7 text-center text-nowrap"> 265 @node.Name 266 </div> 267 </div> 268 </a> 269 } 270 } 271 </nav> 272 } 273 } 274 } 275 276 277
Stay & Accessoires
Tex"Aktiv Guard 1l
Tex"Aktiv Clean 1l
Coussin décoratif Mint
Coussin décoratif Aruba
STAY NATURAL DOUBLE LOUNGE charcoal - dark grey/green rope
Coussin 30 x 50 cm burgundy
Coussin 30 x 50 cm spring green
STAY NATURAL LOUNGER charcoal -dark grey/green rope
STAY NATURAL SINGLE LOUNGE charcoal - dark grey/green rope
STAY NATURAL LOUNGE CORNER charcoal - dark grey/green rope
STAY U TABLE TEAK
STAY NATURAL TEAK COFFEE TABLE
STAY NATURAL CERAMIC COFFEE TABLE
STAY NATURAL PICNIC TABLE Charcoal/teak
STAY FLOOR LAMP TEAK
STAY TABLE LAMP TEAK
STAY COMPACT SET OF 5 light grey/charcoal frame
STAY COMPACT SET OF 3 light grey/charcoal frame
STAY COMPACT SET OF 5 light grey/white frame
STAY COMPACT SET OF 3 light grey/white frame
STAY RECTANGULAR TRAY TEAK
STAY ROUND TRAY TEAK
STAY douche noir
STAY BLOCKS LOUNGER Flanelle
STAY BLOCKS LOUNGER Lead Chiné
STAY BLOCKS DOUBLE LOUNGE LEFT Flanelle
STAY BLOCKS DOUBLE LOUNGE LEFT Lead Chiné
STAY BLOCKS DOUBLE LOUNGE RIGHT Flanelle
STAY BLOCKS DOUBLE LOUNGE RIGHT Lead Chiné
STAY BLOCKS HOCKER Flanelle
STAY BLOCKS HOCKER Lead Chiné
STAY BLOCKS POUF Lead Chiné
STAY GRID DOUBLE SOFA Lead Chiné
STAY LATITUDE DOUBLE LOUNGE Flanelle
STAY LATITUDE TRIPLE LOUNGE Flanelle
STAY LATITUDE TABLE Black
LOOP LOUNGE 2p Mint
LOOP LOUNGE 2p Peach
LOOP LOUNGE 2p Natural
LOOP POUF Lead Chiné
LOOP POUF Mint
LOOP POUF Natural
STAY FLEX single sunlounger charcoal frame + pillow stone
STAY FLEX single sunlounger white frame + pillow ashgrey
STAY FLEX double sunlounger white frame + pillow ashgrey
STAY FLEX double sunlounger white frame + pillow stone
STAY FLEX triple sunlounger white frame + pillow ashgrey
STAY FLEX triple sunlounger white frame + pillow stone
STAY FLEX single sunlounger white frame + pillow stone
STAY FLEX single sunlounger charcoal frame + pillow ashgrey
STAY COOL SOFA Natté Carbon Sky
STAY COOL DOUBLE SOFA Natté Carbon Sky
STAY COOL POUF Natté Carbon Sky
STAY COOL CHAIR + POUF Natté Carbon Sky
STAY COOL SOFA Natté Grey Chiné 10022
STAY COOL DOUBLE SOFA Natté Grey Chiné 10022
STAY COOL DOUBLE SOFA Charcoal
STAY COOL TABLE TEAK
STAY CURVED Lounger Stone
STAY NATURAL Ceramic Table
STAY NATURAL Teak Table
STAY NATURAL Rope Bar Chair black rope (incl. coussin)
STAY NATURAL Rope Bar Chair green rope (incl. coussin)
STAY FLEX Lounge Chair Stone (1 set)
STAY FLEX Triple Sofa Stone
STAY FLEX High Table white
STAY FLEX Low Table white
STAY FLEX Fly side table sand
STAY FLEX Fly side table green
STAY FLEX Fly side table terracotta
STAY FLEX Fly side table white
STAY FLEX Teak side table charcoal
STAY LOOP LOUNGE 2p Flanelle
STAY EASY White
STAY EASY Charcoal
Sac de stockage d'eau 15 m3
STAY plaid gris clair 130 x 170 cm
STAY plaid taupe 130 x 170 cm
STAY plaid bordeaux 130 x 170 cm
STAY plaid vert foncé 130 x 170 cm
STAY plaid rose 130 x 170 cm
STAY outdoor tapis gris
STAY outdoor tapis beige
STAY outdoor tapis ivory
STAY outdoor tapis taupe
Coussin décoratif 45 x 45 cm Savane White
Coussin décoratif 45 x 45 cm Lopi Marble
Coussin décoratif 30 x 50 cm Pintail Zigzag Rust
Coussin décoratif 45 x 45 cm Solid Blush
Coussin décoratif 30 x 50 cm Pintail Zigzag Natural
Coussin décoratif 45 x 45 cm Heritage Moss
Coussin décoratif 45 x 45 cm Heritage Rust
STAY NATURAL double lounge + arm rest white - light grey/green rope
STAY NATURAL single lounge white - light grey/green rope
STAY NATURAL corner lounge white - light grey/green rope
FOGO FIRE PIT rectangular Charcoal
STAY BRAID LAMP ALU RECTANGULAR SMALL
STAY BRAID TRIPOD - large lamp- large height - Charcoal
STAY GRIP Table Set Charcoal (set of 2)
STAY COMFY footrest white/light grey
STAY MINIMALISTIC corner lounge Charcoal/light grey
FOGO FIRE PIT rectangular white
STAY BRAID BOWL ALU SMALL - Charcoal
STAY NATURAL coffee table white/aluminium
STAY ORGANIC side table dia 46 off white
STAY BRAID BOWL ALU LARGE - Charcoal
STAY BRAID LAMP ALU ROUND SMALL
STAY BRAID LAMP ALU RECTANGULAR LARGE
STAY BRAID TRIPOD - large lamp- medium height
STAY NATURAL Glow Floor lamp
STAY MINIMALISTIC double lounge left Charcoal/light grey
STAY BRAID BOWL ALU LARGE - terracotta
STAY BRAID BOWL ALU MEDIUM - terracotta
STAY COMFY beacher white/light grey
STAY MINIMALISTIC double lounge right Charcoal/light grey
STAY ORGANIC side table dia 26 off white
STAY BRAID BOWL ALU LARGE - green
STAY BRAID LAMP ALU ROUND LARGE
STAY FOGO outdoor gas firepit BBQ Grill
STAY NATURAL coffee table white/teak
STAY NATURAL PICNIC TABLE white/teak
STAY BRAID BOWL ALU SMALL - green
STAY NATURAL Glow Table lamp
STAY FLEX FLY side table Charcoal
STAY COMFY beacher Charcoal/dark grey
STAY MINIMALISTIC single lounge Charcoal/light grey
STAY BRAID BOWL ALU MEDIUM - Charcoal
STAY BRAID BOWL ALU MEDIUM - green
STAY FOGO Outdoor Gas Firepit Charcoal
STAY COMFY footrest Charcoal/dark grey
STAY MINIMALISTIC coffee table black marble
STAY ORGANIC side table dia 32 off white/teak
STAY BRAID BOWL ALU SMALL - terracotta
STAY NATURAL BAR TABLE Charcoal/wood
STAY COMPACT SET OF 5 stone/white frame
STAY COMPACT SET OF 5 ash grey/charcoal frame
STAY NATURAL Rope Chair black rope (avec coussin)
STAY COMPACT SET OF 5 dark grey/charcoal frame
STAY FLEX Triple Sofa Ash grey/charcoal frame
STAY FLEX Triple Sofa Stone/charcoal frame
STAY douche Sylt
STAY douche Juist
STAY douche extérieure Norderney
Cascade Alaska 600 mm
Cascade Arizona 500 mm
Cascade Nevada 500 mm
Cascade Phoenix 350 mm
STAY LOOP POUF Flanelle
STAY FLEX triple sunlounger charcoal frame + pillow ashgrey
Echelle 2-pièces 3 marches inox 316 (avec kit de montage)
STAY FLEX triple sunlounger charcoal frame + pillow stone
Echelle 3 marches inox 316 (sans kit de montage)
Kit de montage échelle (douille d'ancrage)
Kit de montage échelle (kit de brides)
STAY FLEX double sunlounger charcoal frame + pillow ashgrey
Kit de montage échelle (kit de brides)
STAY FLEX double sunlounger charcoal frame + pillow stone
Echelle 2-pièces 3 marches inox 316 (avec kit de montage)
STAY FLEX High Table charcoal
STAY FLEX Low Table charcoal
161 de 161 produits