Professionelle Ausrüstung für höchste Ansprüche in der grünen Branche
Entdecken Sie unsere große Auswahl an Werkzeugen und Materialien – zuverlässig, maßgeschneidert und von bester Qualität. Wir bieten persönliche Beratung und schnelle Lieferung für Profis in der Weihnachtsbaumproduktion, Forstwirtschaft, Baumschulen, Gärtnereien, Landschaftsbau sowie Obst- und Beerenanbau.
Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Shop_Campaigns.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 Dalgas.Custom.Services.ContentRelationService.GetRelatedPagesByUrlAndParameters(String url, List`1 parameters, Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 81 at Dalgas.Custom.Services.ContentRelationService.GetPagesByIndustries(String pageItemType, Int32 pageSize) in D:\a\1\s\Custom\Services\ContentRelationService.cs:line 455 at CompiledRazorTemplates.Dynamic.RazorEngine_62df665838594aee873bb942368f4dfa.Execute() in E:\Solutions\dalgas\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Shop_Campaigns.cshtml:line 143 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<GridRowViewModel> 2 @using System 3 @using System.Collections.Generic 4 @using System.Linq 5 @using System.Web 6 @using Dalgas.Custom.Models.Content 7 @using Dalgas.Custom.Services 8 @using Dalgas.Custom.ViewModels.UI 9 @using Dynamicweb.Content 10 @using Dynamicweb.Frontend 11 @using Dynamicweb.Ecommerce.ProductCatalog 12 @using Page = Dynamicweb.Content.Page 13 14 @using System 15 @using System.Collections.Generic 16 @using System.Linq 17 @using Dalgas.Custom.ViewModels.UI 18 @using Dynamicweb.Content 19 @using Dynamicweb.Ecommerce.ProductCatalog 20 @using Dynamicweb.Frontend 21 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 22 23 @*TODO: Move these functions onto the model *@ 24 25 @functions 26 { 27 28 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 29 { 30 var returnValues = new List<string> 31 { 32 $"item_{model.Item.SystemName.ToLower()}" 33 }; 34 35 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 36 { 37 returnValues.Add("dalgas-section-first-on-page"); 38 } 39 40 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 41 42 if (!string.IsNullOrEmpty(overwriteTheme)) 43 { 44 sectionBackgroundTheme = overwriteTheme; 45 } 46 47 // Add theme class if it exists 48 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 49 { 50 if (sectionBackgroundTheme.Contains("default")) 51 { 52 returnValues.Add("theme theme-light"); 53 } 54 else 55 { 56 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 57 } 58 } 59 60 // Determine if top padding should be removed 61 62 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 63 64 returnValues.Add("pb-6"); 65 if (removeTopPadding != "enable") 66 { 67 returnValues.Add("pt-6"); 68 } 69 70 return string.Join(" ", returnValues); 71 } 72 73 } 74 75 76 @{ 77 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 78 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 79 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 80 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 81 82 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 83 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 84 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 85 bool hasHeading = headings.Any(); 86 bool hasButton = buttons.Any(); 87 88 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 89 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 90 91 var sectionClassList = GetSectionClassList(Model); 92 93 var image = string.Empty; 94 var imageParameters = new Dictionary<string, object>(); 95 96 string layout = string.Empty; 97 Boolean enableFifthElement = false; 98 if (Model?.Item != null) 99 { 100 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 101 102 if (paragraphLayout != null) 103 { 104 layout = paragraphLayout.GetString("Layout"); 105 106 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 107 } 108 } 109 110 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 111 { 112 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 113 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 114 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 115 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 116 string cssPosition = $"{xPos}% {yPos}%"; 117 imageParameters.Add("style", "object-position:" + cssPosition); 118 } 119 120 LinkViewModel imageLink = new LinkViewModel(); 121 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 122 { 123 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 124 } 125 126 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 127 } 128 129 130 @{ 131 string strTitle = string.Empty; 132 string strSummary = string.Empty; 133 string strImage = string.Empty; 134 string strImage2 = string.Empty; 135 string strLink = string.Empty; 136 137 ClassList colClasslist = new ClassList("js-content-container content-container justify-content-between d-flex col-12"); 138 ClassList cardTextClasslist = new ClassList(string.Empty); 139 ClassList cardTextColContainerClasslist = new ClassList("d-flex gap-4 h-100 justify-content-between"); 140 ClassList cardTextColClasslist = new ClassList("col"); 141 ClassList headerSize = new ClassList(string.Empty); 142 143 var queryResult = ContentRelationService.Instance.GetCampaignsByIndustries(); 144 145 IList<ItemViewModel> manuallyPickedItems = Model.Item?.GetItems("ManuallyPicked") ?? Enumerable.Empty<ItemViewModel>().ToList(); 146 bool hasManuallyPickedItems = manuallyPickedItems.Any(); 147 List<string> pageIds = new List<string>(); 148 149 150 if (hasManuallyPickedItems) 151 { 152 pageIds.AddRange( 153 manuallyPickedItems 154 .Select(mpi => mpi.Fields.FirstOrDefault(f => f.Name == "Page")?.GetLink()) 155 .Where(link => link != null && link.PageId > 0) 156 .Select(link => link.PageId.ToString()) 157 ); 158 } 159 else if (queryResult.Results.Any()) 160 { 161 pageIds.AddRange(queryResult.Results.Select(qrr => qrr["PageId"].ToString())); 162 } 163 164 var contentType = Model.Item.GetItem("Content")?.GetString("Content"); 165 ClassList imageAspectRatio = new ClassList("ratio"); 166 167 FileViewModel featuredListImage = new FileViewModel(); 168 FileViewModel featuredListImage2 = new FileViewModel(); 169 170 int itemsToRender = int.TryParse(Model.Item.GetItem("Content")?.GetString("NumbersOfItemsToShow"), out int numberToShow) ? numberToShow : 1; 171 172 string campaignLayout = Model.Item.GetItem("Content").GetString("Layout"); 173 174 if (itemsToRender == 1) 175 { 176 headerSize.Add("h2"); 177 imageAspectRatio.Add("ratio-16x9"); 178 colClasslist.Add("flex-column col-lg mb-4"); 179 cardTextColContainerClasslist.Add("flex-column pt-4 col-8"); 180 } 181 else 182 { 183 headerSize.Add("h4"); 184 imageAspectRatio.Add("ratio-16x9"); 185 // Call the function with the updated sectionClassList 186 sectionClassList = GetSectionClassList(Model, "theme-light"); 187 if (campaignLayout == "horizontal") 188 { 189 cardTextClasslist.Add("theme p-4 pt-5 col-lg-6 " + theme); 190 colClasslist.Add("flex-column flex-lg-row col-12 mb-4"); 191 cardTextColClasslist.Add("d-flex flex-column justify-content-end"); 192 cardTextColContainerClasslist.Add("flex-column col-lg-8"); 193 } 194 else if (campaignLayout == "vertical") 195 { 196 cardTextClasslist.Add("theme p-4 pt-5 h-100 " + theme); 197 colClasslist.Add("flex-column col-lg mb-4"); 198 cardTextColContainerClasslist.Add("flex-column flex-lg-row"); 199 if (itemsToRender == 3) 200 { 201 cardTextColContainerClasslist.Remove("gap-4"); 202 cardTextColContainerClasslist.Remove("flex-lg-row"); 203 } 204 } 205 } 206 } 207 208 @if (queryResult.Results.Any() || manuallyPickedItems.Any()) 209 { 210 const string offsetKey = "GridRowItemOffset"; 211 212 List<string> availablePages; 213 214 if (!hasManuallyPickedItems && queryResult.Results.Any()) 215 { 216 if (HttpContext.Current.Items[offsetKey] == null) 217 { 218 HttpContext.Current.Items[offsetKey] = 0; 219 } 220 221 int globalOffset = (int)HttpContext.Current.Items[offsetKey]; 222 223 availablePages = pageIds.Skip(globalOffset).Take(itemsToRender).ToList(); 224 HttpContext.Current.Items[offsetKey] = globalOffset + itemsToRender; 225 } 226 else 227 { 228 availablePages = pageIds.Take(itemsToRender).ToList(); 229 } 230 231 if (availablePages.Any()) 232 { 233 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 234 <div class="container-xl"> 235 <div class="row justify-content-center"> 236 <div class="col-12 @(itemsToRender == 1 ? "col-lg-10" : string.Empty)"> 237 <div class="row"> 238 <span> 239 @string.Join("", headings.Select(h => h.ToString())) 240 </span> 241 242 @if (!string.IsNullOrEmpty(lead)) 243 { 244 <p class="lead">@lead</p> 245 } 246 247 @text 248 249 250 @if (buttons.Any()) 251 { 252 <div class="d-flex flex-wrap gap-3"> 253 @foreach (ButtonViewModel button in buttons) 254 { 255 @button 256 } 257 </div> 258 } 259 260 @{ 261 ButtonViewModel btnViewResult = new ButtonViewModel 262 { 263 Text = Translate("View more"), 264 Type = ButtonType.Link, 265 DisplayType = ButtonDisplayType.Primary 266 }; 267 if (itemsToRender == 3) 268 { 269 btnViewResult.DisplayType = ButtonDisplayType.Link; 270 } 271 } 272 273 @foreach (string pageId in availablePages) 274 { 275 if (int.TryParse(pageId, out int intPageId) && intPageId == PageView.Current().Page.ID) 276 { 277 continue; 278 } 279 280 Page page = Services.Pages.GetPage(intPageId); 281 282 if (page == null) 283 { 284 continue; 285 } 286 287 strTitle = page.Item["Title"]?.ToString(); 288 strSummary = page.Item["Summary"]?.ToString(); 289 strImage = page.Item["CoverImage"] == null ? string.Empty : page.Item["CoverImage"]?.ToString(); 290 strImage2 = page.Item["CoverImage2nd"] == null ? string.Empty : page.Item["CoverImage2nd"]?.ToString(); 291 btnViewResult.Id = "pageId_" + page.ID; 292 btnViewResult.Url = "/Default.aspx?ID=" + page.ID; 293 294 int ecommercePageId = ContextService.GetEcommercePageId(); 295 296 string linkToGroudId = string.Empty; 297 if (page.Item != null && page.Item["LinkToEcomGroup"] != null) 298 { 299 linkToGroudId = page.Item["LinkToEcomGroup"].ToString(); 300 } 301 linkToGroudId = linkToGroudId.Replace("g_", string.Empty); 302 303 if (!string.IsNullOrEmpty(linkToGroudId)) 304 { 305 btnViewResult.Url = "/Default.aspx?ID=" + ecommercePageId + "&GroupID=" + linkToGroudId; 306 } 307 308 int jpgIndex = strImage?.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase) ?? -1; 309 if (jpgIndex != -1) 310 { 311 strImage = strImage.Substring(0, jpgIndex + 4); 312 } 313 314 int jpgIndex2 = strImage2?.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase) ?? -1; 315 if (jpgIndex2 != -1) 316 { 317 strImage2 = strImage2.Substring(0, jpgIndex2 + 4); 318 } 319 320 featuredListImage = ViewModelFactory.CreateFieldFileValueView(strImage); 321 featuredListImage2 = ViewModelFactory.CreateFieldFileValueView(strImage2); 322 323 var currentColClasslist = new ClassList(colClasslist.ToString()); 324 if (campaignLayout == "horizontal" && availablePages.IndexOf(pageId) % 2 == 1) 325 { 326 currentColClasslist.Add("flex-lg-row-reverse"); 327 } 328 329 330 <div class="@currentColClasslist"> 331 <figure class="ratio @imageAspectRatio m-0"> 332 <a href="@btnViewResult.Url"> 333 @RenderPartial("Components/Image.cshtml", featuredListImage ?? new FileViewModel()) 334 </a> 335 </figure> 336 <div class="@cardTextClasslist"> 337 <div class="@cardTextColContainerClasslist"> 338 <div class="@cardTextColClasslist"> 339 <h3 class="@headerSize"> 340 <a href="@btnViewResult.Url" class="text-decoration-none"> 341 @strTitle 342 </a> 343 </h3> 344 @if (strSummary != null) 345 { 346 <span class="small">@strSummary</span> 347 } 348 </div> 349 <div class="align-items-end d-flex"> 350 @RenderModel(btnViewResult) 351 </div> 352 </div> 353 </div> 354 </div> 355 356 if (itemsToRender == 1) 357 { 358 <div class="col-6 d-none d-lg-flex"> 359 <figure class="ratio m-0"> 360 <a href="@btnViewResult.Url"> 361 @RenderPartial("Components/Image.cshtml", featuredListImage2 ?? new FileViewModel()) 362 </a> 363 <div class="fifth-element bottom-0 size-2 right-0 @fifthElementTheme"> 364 @ReadFile(fifthElementIconPath + "sun.svg") 365 </div> 366 </figure> 367 </div> 368 } 369 } 370 371 372 </div> 373 </div> 374 </div> 375 </div> 376 </section> 377 } 378 else 379 { 380 if (Pageview.IsVisualEditorMode) 381 { 382 <div class="container-xl alert alert-danger" role="alert"> 383 This <strong>@Model.Item.SystemName</strong> is empty 384 </div> 385 } 386 } 387 } 388 else 389 { 390 if (Pageview.IsVisualEditorMode) 391 { 392 <div class="container-xl alert alert-danger" role="alert"> 393 This <strong>@Model.Item.SystemName</strong> is empty 394 </div> 395 } 396 } 397
Entdecken Sie unser vielfältiges Produktsortiment
Große Auswahl an Nistkästen und Insektenhotels
Mit Nistkästen und Insektenhotels aus Holzbeton bieten Sie Vögeln und Insekten optimale Bedingungen zum Brüten und Überwintern.
Alles zum Anpflanzen
Große Auswahl an Pflanzröhren, Pflanzkörben, Spaten und Schaufeln, Bewässerungssäcken und Bindematerial.
Hier finden Sie alles, zu Zaunpfählen und Hohlrohren
Ob Sie nun neu angepflanzte Wälder oder Weihnachtsbäume einzäunen, Ihre Tiere im Garten halten oder einen Totholzzaun bauen möchten – hier finden Sie die passenden Beiträge.
Über Dalgas Shop
Seit 1976 liefern wir Ausrüstung und Werkzeuge für die Arbeit in und mit der Natur. Darum wissen wir, worauf es ankommt – und was Sie wirklich brauchen. Bei Dalgas erhalten Sie fachkundige Beratung und praxisbewährte Ausrüstung, die Ihren Arbeitsalltag leichter macht. Und weil wir wissen, dass Zeit oft knapp ist, liefern wir schnell und zuverlässig.
Guides und Fachwissen
Schnitthosen und Forstausrüstungen – Ihr Leitfaden zur Sicherheit
In diesem Leitfaden erklären wir Ihnen, was Schnitthosen sind, warum sie unverzichtbar sind und wie unser Forstausrüstungsset Ihnen optimalen Schutz bietet.
Einen Zaun aufstellen – so geht's
Hier ein paar Tipps für die Installation eines guten und langlebigen Zauns um Weihnachtsbäume, neu angepflanzte Wälder oder Obstbäume.
Nistkästen - wie und warum
Es gibt viele gute Gründe, Nistkästen im Wald, zwischen den Obstbäumen, im Garten oder am Gemüsegarten aufzustellen.
Dalgas - mehr als ein Webshop
Bei Dalgas trifft Fachwissen auf Leidenschaft: Wir sind ein Team von Spezialistinnen und Spezialisten, das Ihre Branche und die Anforderungen Ihres Arbeitsalltags genau kennt.
Für Sie bedeutet das persönliche Betreuung und kompetente Beratung – egal, ob Sie fachlichen Rat benötigen oder Unterstützung bei der Wahl der passenden Ausrüstung und Werkzeuge wünschen.
Wir legen Wert auf langfristige, vertrauensvolle Kundenbeziehungen. Bei Großbestellungen, Lagerkapazität oder regelmäßigen Lieferungen sind wir gerne persönlich für Sie da. Sie können Angebote direkt über den Webshop anfordern – oder uns anrufen, um individuelle Wünsche zu besprechen.









