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.
Unkrautbekämpfung und Wildtierschutz
Verschiedene Unkrautbekämpfungsmethoden helfen Ihnen, Unkraut ohne Pestizide einzudämmen. Wildabwehrmittel können Wildtiere von Ihren neu gepflanzten Bäumen fernhalten.
Professionelle Werkzeuge
Hier finden Sie alle Werkzeuge für Garten, Baumschule, Landschaftsgestaltung und Bepflanzung.
Große Auswahl an Wildzäunen und Kulturgattern.
Benötigen Sie einen Zaun für Ihre Jungpflanzen, Weihnachtsbäume oder Obstbäume? Hier finden Sie unsere große Auswahl an Zäunen und Zaunpfosten.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.Error executing template "/Designs/Swift/Grid/Page/RowTemplates/Shop_Slider.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_08f72e002af1478e8ec44c59ad17ae21.Execute() in E:\Solutions\dalgas\Files\Templates\Designs\Swift\Grid\Page\RowTemplates\Shop_Slider.cshtml:line 177 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.Contexts 7 @using Dalgas.Custom.Extensions 8 @using Dalgas.Custom.Models.Content 9 @using Dalgas.Custom.Services 10 @using Dalgas.Custom.Services.Relewise 11 @using Dalgas.Custom.ViewModels.UI 12 @using Dynamicweb.Content 13 @using Dynamicweb.Ecommerce.Common 14 @using Dynamicweb.Ecommerce.Notifications 15 @using Dynamicweb.Frontend 16 @using Dynamicweb.Ecommerce.ProductCatalog 17 @using Dynamicweb.Ecommerce.Products 18 @using Dynamicweb.Ecommerce.Shops 19 @using Dynamicweb.Security.Permissions 20 @using ProductViewModel = Dalgas.Custom.Models.Ecommerce.ProductViewModel 21 @using ProductListViewModel = Dalgas.Custom.Models.Ecommerce.ProductListViewModel 22 @using ProductService = Dalgas.Custom.Services.ProductService 23 @using Page = Dynamicweb.Content.Page 24 25 @using System 26 @using System.Collections.Generic 27 @using System.Linq 28 @using Dalgas.Custom.ViewModels.UI 29 @using Dynamicweb.Content 30 @using Dynamicweb.Ecommerce.ProductCatalog 31 @using Dynamicweb.Frontend 32 @using ParagraphService = Dalgas.Custom.Services.ParagraphService 33 34 @*TODO: Move these functions onto the model *@ 35 36 @functions 37 { 38 39 public string GetSectionClassList(GridRowViewModel model, string overwriteTheme = "") 40 { 41 var returnValues = new List<string> 42 { 43 $"item_{model.Item.SystemName.ToLower()}" 44 }; 45 46 if (Services.Grids.GetGridRowById(model.Id).Sort == 1) 47 { 48 returnValues.Add("dalgas-section-first-on-page"); 49 } 50 51 var sectionBackgroundTheme = model.Item.GetItem("ColorScheme")?.GetString("ColorScheme") ?? string.Empty; 52 53 if (!string.IsNullOrEmpty(overwriteTheme)) 54 { 55 sectionBackgroundTheme = overwriteTheme; 56 } 57 58 // Add theme class if it exists 59 if (!string.IsNullOrWhiteSpace(sectionBackgroundTheme)) 60 { 61 if (sectionBackgroundTheme.Contains("default")) 62 { 63 returnValues.Add("theme theme-light"); 64 } 65 else 66 { 67 returnValues.Add($"theme {sectionBackgroundTheme.Replace(" ", "").Trim().ToLower()}"); 68 } 69 } 70 71 // Determine if top padding should be removed 72 73 string removeTopPadding = model.Item.GetItem("ColorScheme")?.GetString("RemoveTopPadding"); 74 75 returnValues.Add("pb-6"); 76 if (removeTopPadding != "enable") 77 { 78 returnValues.Add("pt-6"); 79 } 80 81 return string.Join(" ", returnValues); 82 } 83 84 } 85 86 87 @{ 88 IEnumerable<HeadingViewModel> headings = ParagraphService.Instance.GetHeadingsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Headings")); 89 string text = Model.Item.GetItem("Paragraph_Text")?.GetString("Text"); 90 string lead = Model.Item.GetItem("Paragraph_Text")?.GetString("Lead"); 91 IEnumerable<ButtonViewModel> buttons = ParagraphService.Instance.GetButtonsByItems(Model.Item?.GetItem("Paragraph_Text")?.GetItems("Buttons")); 92 93 bool hasImage = Model.Item.GetItem("Paragraph_Image")?.GetFile("Image") != null; 94 bool hasText = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Text")); 95 bool hasLead = !string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Text")?.GetString("Lead")); 96 bool hasHeading = headings.Any(); 97 bool hasButton = buttons.Any(); 98 99 var theme = Model.Item.GetItem("ColorScheme")?.GetString("ColorScheme"); 100 var fifthElementTheme = "fifth-element-color-" + Model.Item?.GetItem("ColorScheme")?.GetString("FifthElementColor"); 101 102 var sectionClassList = GetSectionClassList(Model); 103 104 var image = string.Empty; 105 var imageParameters = new Dictionary<string, object>(); 106 107 string layout = string.Empty; 108 Boolean enableFifthElement = false; 109 if (Model?.Item != null) 110 { 111 var paragraphLayout = Model.Item.GetItem("Paragraph_Layout"); 112 113 if (paragraphLayout != null) 114 { 115 layout = paragraphLayout.GetString("Layout"); 116 117 enableFifthElement = !string.IsNullOrEmpty(paragraphLayout.GetString("Layout_FifthElement")); 118 } 119 } 120 121 if (!string.IsNullOrEmpty(Model.Item?.GetItem("Paragraph_Image")?.GetFile("Image")?.Path)) 122 { 123 image = Model.Item.GetItem("Paragraph_Image").GetFile("Image").Path; 124 imageParameters.Add("alt", Model.Item.GetItem("Paragraph_Image")?.GetString("ImageAltText")); 125 int xPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromLeft ?? 50; 126 int yPos = Model.Item.GetItem("Paragraph_Image").GetFile("Image")?.FocalPositionFromTop ?? 50; 127 string cssPosition = $"{xPos}% {yPos}%"; 128 imageParameters.Add("style", "object-position:" + cssPosition); 129 } 130 131 LinkViewModel imageLink = new LinkViewModel(); 132 if (Model.Item?.GetItem("Paragraph_Image")?.GetItem("Link") != null && !string.IsNullOrEmpty(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link").GetString("ButtonLink"))) 133 { 134 imageLink = ParagraphService.Instance.GetLinkByItem(Model?.Item?.GetItem("Paragraph_Image")?.GetItem("Link")); 135 } 136 137 string fifthElementIconPath = "/Files/Templates/Designs/Swift/Assets/Images/DalgasFifthElements/"; 138 } 139 140 141 @functions { 142 143 public class SliderItemViewModel 144 { 145 public string Title { get; set; } 146 public string Summary { get; set; } 147 public string Image { get; set; } 148 public string Link { get; set; } 149 public ProductViewModel Product { get; set; } 150 } 151 152 public enum ProductType 153 { 154 Relewise, 155 Products, 156 Groups 157 } 158 159 } 160 161 @{ 162 string strTitle = string.Empty; 163 string strSummary = string.Empty; 164 string strImage = string.Empty; 165 string strLink = string.Empty; 166 167 FileViewModel sliderImage; 168 var queryResult = new QueryResult(); 169 List<SliderItemViewModel> sliderItems = new List<SliderItemViewModel>(); 170 171 var contentType = Model.Item.GetItem("Content")?.GetString("Content"); 172 string shopId = PageView.Current().Area.EcomShopId; 173 string langId = PageView.Current().Area.EcomLanguageId; 174 175 if (contentType == "industries") 176 { 177 queryResult = ContentRelationService.Instance.GetIndustries(); 178 179 foreach (Dictionary<string, object> item in queryResult.Results) 180 { 181 if (item.TryGetValue("PageId", out var pageIdObj) && int.TryParse(pageIdObj?.ToString(), out int resultPageId)) 182 { 183 var page = Services.Pages.GetPage(resultPageId); 184 sliderItems.Add(new SliderItemViewModel 185 { 186 Title = page.Item["Title"]?.ToString(), 187 Summary = page.Item["Summary"]?.ToString(), 188 Image = page.Item["CoverImage"]?.ToString(), 189 Link = "/Default.aspx?ID=" + resultPageId 190 }); 191 } 192 } 193 } 194 else if (contentType == "productcategories") 195 { 196 197 var categories = ContentRelationService.Instance.GetProductCategoriesByIndustries(); 198 int ecommercePageId = ContextService.GetEcommercePageId(); 199 200 201 if (!string.IsNullOrEmpty(shopId) && !string.IsNullOrEmpty(langId)) 202 { 203 204 string categoryFeed = Model.Item.GetItem("Content")?.GetString("CategoryFeed"); 205 ProductType productType = ProductType.Relewise; 206 207 foreach (var category in categories) 208 { 209 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(category.Id); 210 211 if (group == null) 212 { 213 continue; 214 } 215 216 if (!string.Equals(group.LanguageId, langId, StringComparison.OrdinalIgnoreCase)) 217 { 218 continue; 219 } 220 221 string largeImage = !string.IsNullOrEmpty(group.LargeImage) ? "/Files" + group.LargeImage : string.Empty; 222 223 if (group.HasPermission(PermissionLevel.Read)) 224 { 225 sliderItems.Add(new SliderItemViewModel 226 { 227 Title = group.Name, 228 Summary = "", 229 Image = largeImage, 230 Link = "/Default.aspx?ID=" + ecommercePageId + "&GroupID=" + group.Id 231 }); 232 } 233 } 234 235 switch (productType) 236 { 237 case ProductType.Relewise: 238 foreach (var category in categories) 239 { 240 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(category.Id); 241 242 if (group != null) 243 { 244 string largeImage = !string.IsNullOrEmpty(group.LargeImage) ? "/Files" + group.LargeImage : string.Empty; 245 246 if (group.HasPermission(PermissionLevel.Read)) 247 { 248 sliderItems.Add(new SliderItemViewModel 249 { 250 Title = group.Name, 251 Summary = "", // optionally, fill in if you want group description or other metadata 252 Image = largeImage, 253 Link = "/Default.aspx?ID=" + ecommercePageId + "&GroupID=" + group.Id 254 }); 255 } 256 } 257 } 258 break; 259 260 case ProductType.Groups: 261 IEnumerable<string> selectedGroups = Model.Item 262 .GetItem("Content")? 263 .GetString("ChooseCategory_Category") 264 .Split(',') 265 .Select(g => g.Replace("g_", "")); 266 267 var currentLangId = PageView.Current().Area.EcomLanguageId; 268 269 foreach (string selectedGroup in selectedGroups) 270 { 271 Group group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(selectedGroup); 272 273 if (group == null) 274 { 275 continue; 276 } 277 278 if (!string.Equals(group.LanguageId, currentLangId, StringComparison.OrdinalIgnoreCase)) 279 { 280 continue; 281 } 282 283 string largeImage = !string.IsNullOrEmpty(group.LargeImage) 284 ? "/Files" + group.LargeImage 285 : string.Empty; 286 287 if (group.HasPermission(PermissionLevel.Read)) 288 { 289 sliderItems.Add(new SliderItemViewModel 290 { 291 Title = group.Name, 292 Summary = "", 293 Image = largeImage, 294 Link = "/Default.aspx?ID=" + ecommercePageId + "&GroupID=" + group.Id 295 }); 296 } 297 } 298 299 break; 300 301 } 302 sliderItems = sliderItems.GroupBy(g => g.Title).Select(g => g.First()).ToList(); 303 304 } 305 306 } 307 else if (contentType == "products") 308 { 309 int productTake = 10; 310 311 string productFeed = Model.Item.GetItem("Content")?.GetString("ProductFeed"); 312 ProductType productType = ProductType.Relewise; 313 314 if (!string.IsNullOrEmpty(productFeed)) 315 { 316 // Try to parse the string to enum 317 if (Enum.TryParse(productFeed, true, out ProductType parsedType)) 318 { 319 productType = parsedType; 320 } 321 } 322 323 List<ProductViewModel> products = new List<ProductViewModel>(); 324 ProductListViewModel productListViewModel = new ProductListViewModel(); 325 326 switch (productType) 327 { 328 case ProductType.Relewise: 329 productListViewModel = RecommendationService.Instance.GetPersonalProductRecommendation(productTake, PageView.Current().AreaID); 330 products = productListViewModel.CustomProducts.ToList(); 331 break; 332 case ProductType.Products: 333 productListViewModel = Model.Item.GetItem("Content")?.GetValue("ChooseProducts") as ProductListViewModel; 334 products = productListViewModel?.CustomProducts.Take(productTake).ToList(); 335 break; 336 case ProductType.Groups: 337 IEnumerable<string> selectedGroups = Model.Item.GetItem("Content")?.GetString("ChooseCategory").Split(',').ToList().Select(g => g.Replace("g_", "")); 338 List<ProductViewModel> tempProduct = new List<ProductViewModel>(); 339 foreach (string selectedGroup in selectedGroups) 340 { 341 Group group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(selectedGroup); 342 343 if (group == null) 344 { 345 continue; 346 } 347 348 if (!string.Equals(group.LanguageId, langId, StringComparison.OrdinalIgnoreCase)) 349 { 350 continue; 351 } 352 353 tempProduct.AddRange(group.Products 354 .Where(p => p.LanguageId == langId) // filtrer produkter pr. sprog 355 .Select(p => ProductService.Instance.GetProductViewModelById(p.Id, p.VariantId)) 356 ); 357 } 358 359 productListViewModel = tempProduct.GetProductList() as ProductListViewModel; 360 products = productListViewModel.CustomProducts.Take(productTake).ToList(); 361 break; 362 default: 363 productListViewModel = RecommendationService.Instance.GetPersonalProductRecommendation(productTake, PageView.Current().AreaID); 364 products = productListViewModel.CustomProducts.ToList(); 365 break; 366 } 367 368 if (products != null && products.Any()) 369 { 370 foreach (ProductViewModel product in products) 371 { 372 sliderItems.Add(new SliderItemViewModel 373 { 374 Title = product.DisplayName, 375 Summary = product.LongDescription, 376 Image = product.DefaultImage?.Value, 377 Link = product.Link, 378 Product = product 379 }); 380 } 381 } 382 } 383 384 385 ButtonViewModel btnViewModelViewAll = new ButtonViewModel 386 { 387 Id = "pageId_", 388 Url = "/Default.aspx?ID=" + 999, 389 Text = Translate("View all"), 390 Type = ButtonType.Link, 391 DisplayType = ButtonDisplayType.Secondary 392 }; 393 394 List<FileViewModel> imageList = new List<FileViewModel>(); 395 } 396 397 @if (sliderItems.Any()) 398 { 399 <section id="section-@Model.Id" class="@sectionClassList" data-swift-gridrow> 400 <div class="container-xl"> 401 <div class="row justify-content-center"> 402 <div class="col-12 col-lg-10"> 403 <div class="row"> 404 <div class="col-12 d-flex justify-content-between mb-2"> 405 @if (!string.IsNullOrEmpty(Model.Item.GetItem("Content").GetString("Title"))) 406 { 407 <h2 class="mb-0 mb-lg-5">@Model.Item.GetItem("Content").GetString("Title")</h2> 408 } 409 @if (sliderItems.Count > 1) 410 { 411 <div class="d-none d-lg-flex gap-3"> 412 <button type="button" title="@Translate("Previous slide")" 413 class="dalgas-swiper-button-prev" style="z-index:1;"> 414 <span class="visually-hidden">@Translate("Previous slide")</span> 415 </button> 416 <button type="button" title="@Translate("Next slide")" 417 class="dalgas-swiper-button-next" style="z-index:1;"> 418 <span class="visually-hidden">@Translate("Next slide")</span> 419 </button> 420 </div> 421 } 422 </div> 423 424 <div class="swiper-container row" data-shop-slider="true" data-initialized="false"> 425 <div class="swiper-wrapper"> 426 @foreach (var item in sliderItems) 427 { 428 int jpgIndex = item.Image?.IndexOf(".jpg", StringComparison.OrdinalIgnoreCase) ?? -1; 429 if (jpgIndex != -1) 430 { 431 item.Image = item.Image.Substring(0, jpgIndex + 4); 432 } 433 434 sliderImage = ViewModelFactory.CreateFieldFileValueView(item.Image); 435 imageList.Add(sliderImage); 436 437 <div class="swiper-slide d-flex flex-column"> 438 @if (item.Product != null) 439 { 440 @item.Product.RenderedHtml.GridItem 441 } 442 else 443 { 444 <div class="d-flex flex-column-reverse"> 445 <div 446 class="col-12 theme pt-3 d-flex flex-column justify-content-between"> 447 <div class="theme"> 448 <h3> 449 <a class="text-decoration-none" 450 href="@item.Link">@item.Title</a> 451 </h3> 452 <p class="small">@item.Summary</p> 453 </div> 454 </div> 455 <div class="col-12"> 456 <a href="@item.Link"> 457 <figure class="ratio ratio-3x4"> 458 @RenderPartial("Components/Image.cshtml", sliderImage ?? new FileViewModel()) 459 </figure> 460 </a> 461 </div> 462 </div> 463 } 464 465 </div> 466 } 467 </div> 468 </div> 469 470 </div> 471 </div> 472 </div> 473 </div> 474 </section> 475 } 476 else 477 { 478 if (Pageview.IsVisualEditorMode) 479 { 480 <div class="container-xl alert alert-danger" role="alert"> 481 This <strong>@Model.Item.SystemName</strong> is empty 482 </div> 483 } 484 } 485
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.









