Komposithegn - hegn med minimalt vedligehold
Bliv klogere på fordelene ved komposit, og se eksempler på hegnsprojekter.
Futura findes i 4 højder og 2 bredder og kan således dække ethvert behov for at få privatliv, tryghed og læ i din have eller omkring terrassen. Ønsker du mere udsyn kan du kombinere Futura med glas-elementer, som kan tilføre effektfuld tranparens til din løsning. Supplér med låger/porte, hvis du ønsker det.
Fordelen ved komposit er minimal vedligehold og lang holdbarhed. Produktet kræver udelukkende afvaskning med vand, så man slipper for at tænke på slibning og efterbehandling med træbeskyttelse/maling.
Levering fra EUR 499.00
Error executing template "Designs/Swift/Paragraph/Swift_ProductPrice.cshtml" System.FormatException: Input string was not in a correct format. at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) at System.Convert.ToDouble(String value) at Plus.CustomModules.Helpers.CampaignPrice.GetConvertedPriceWithVat(ProductViewModel product) at CompiledRazorTemplates.Dynamic.RazorEngine_5dad8397fe3c41d287add94f780f9d99.Execute() in C:\inetpub\wwwroot\plus-prod\Files\Templates\Designs\Swift\Paragraph\Swift_ProductPrice.cshtml:line 183 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 System 3 @using System.Linq 4 @using Dynamicweb.Ecommerce.International 5 @using Dynamicweb.Ecommerce.Prices 6 @using Dynamicweb.Ecommerce.ProductCatalog 7 @using Plus.CustomModules.Helpers 8 @using PriceViewModel = Dynamicweb.Frontend.PriceViewModel 9 10 @{ 11 ProductViewModel product = new ProductViewModel(); 12 13 ProductViewModelSettings productSetting = new ProductViewModelSettings 14 { 15 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID, 16 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code, 17 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2, 18 ShopId = Pageview.Area.EcomShopId 19 }; 20 21 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails")) 22 { 23 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"]; 24 } else if (Pageview.Item["DummyProduct"] != null) { 25 26 string dummyProductId = ""; 27 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 28 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 29 if (productList.Products != null) 30 { 31 foreach (var p in productList.Products) { dummyProductId = p.Id; } 32 ProductViewModel dummyProduct = dummyProductId != "" ? ViewModelFactory.CreateView(productSetting, dummyProductId) : new ProductViewModel(); 33 product = dummyProduct; 34 } else { 35 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 36 } 37 } else if (Pageview.Item["DummyProduct"] == null) { 38 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 39 } 40 41 string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", ""); 42 bool anonymousUser = Pageview.User == null; 43 bool isErpConnectionDown = !Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsWebServiceConnectionAvailable(); 44 bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHidePrices") && isErpConnectionDown; 45 46 bool showInformativePrice = Model.Item.GetBoolean("ShowInformativePrice"); 47 string unitId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("UnitId")) ? Dynamicweb.Context.Current.Request.Form.Get("UnitId") : string.Empty; 48 49 string priceFontSize = Model.Item.GetRawValueString("PriceSize", "fs-2"); 50 string horizontalAlign = Model.Item.GetRawValueString("HorizontalAlignment", ""); 51 string layout = Model.Item.GetRawValueString("Layout", "horizontal"); 52 string textAlign = horizontalAlign == "center" ? "text-center" : string.Empty; 53 textAlign = horizontalAlign == "end" ? "text-end" : textAlign; 54 55 horizontalAlign = horizontalAlign == "center" && layout == "horizontal" ? "justify-content-center" : horizontalAlign; 56 horizontalAlign = horizontalAlign == "end" && layout == "horizontal" ? "justify-content-end" : horizontalAlign; 57 horizontalAlign = horizontalAlign == "center" && layout == "vertical" ? "align-items-center" : horizontalAlign; 58 horizontalAlign = horizontalAlign == "end" && layout == "vertical" ? "align-items-end" : horizontalAlign; 59 60 string flexDirection = layout == "horizontal" ? string.Empty : "flex-column"; 61 string flexGap = layout == "horizontal" ? "gap-3" : string.Empty; 62 string order = layout == "horizontal" ? string.Empty : "order-2"; 63 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? "theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 64 theme = GetViewParameter("theme") != null ? GetViewParameterString("theme") : theme; 65 } 66 67 @if (!hidePrice && product.Id != null && !product.Discontinued) 68 { 69 string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); 70 bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); 71 72 string priceMin = ""; 73 string priceMax = ""; 74 75 string liveInfoClass = ""; 76 string productInfoFeed = ""; 77 bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsLazyLoadingForProductInfoEnabled; 78 if (isLazyLoadingForProductInfoEnabled) 79 { 80 if (Dynamicweb.Context.Current.Items.Contains("ProductInfoFeed")) 81 { 82 productInfoFeed = Dynamicweb.Context.Current.Items["ProductInfoFeed"]?.ToString(); 83 if (!string.IsNullOrEmpty(productInfoFeed)) 84 { 85 productInfoFeed = $"data-product-info-feed=\"{productInfoFeed}\""; 86 } 87 } 88 liveInfoClass = "js-live-info"; 89 } 90 91 <div class="@textAlign @liveInfoClass item_@Model.Item.SystemName.ToLower()" data-product-id="@product.Id" @productInfoFeed> 92 @if (showInformativePrice && product.PriceInformative.Price != 0) 93 { 94 <div class="opacity-50"> 95 <span>@Translate("RRP") </span> 96 <span class="text-decoration-line-through text-price">@product.PriceInformative.PriceFormatted</span> 97 </div> 98 } 99 <div class="@priceFontSize m-0 d-flex @flexDirection @flexGap @horizontalAlign product-price-efa" itemprop="offers" itemscope itemtype="https://schema.org/Offer"> 100 <span itemprop="priceCurrency" content="@product.Price.CurrencyCode" class="d-none"></span> 101 102 103 @if (showPricesWithVat == "false" && !neverShowVat) 104 { 105 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 106 { 107 <span itemprop="price" content="" class="d-none"></span> 108 <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> 109 } 110 else 111 { 112 string beforePrice = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).PriceBeforeDiscount.PriceWithoutVatFormatted : product.PriceBeforeDiscount.PriceWithoutVatFormatted; 113 114 <span itemprop="price" content="@product.Price.PriceWithoutVat" class="d-none"></span> 115 if (product.Price.Price != product.PriceBeforeDiscount.Price) 116 { 117 <span class="text-decoration-line-through opacity-75 @order">@beforePrice</span> 118 } 119 } 120 } 121 else 122 { 123 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 124 { 125 <span itemprop="price" content="" class="d-none"></span> 126 <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> 127 } 128 else 129 { 130 string beforePrice = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).PriceBeforeDiscount.PriceFormatted : product.PriceBeforeDiscount.PriceFormatted; 131 132 string googlepriceraw = product.Price.PriceWithVat.ToString(); 133 string googlepriceformatted = googlepriceraw.Replace(',', '.'); 134 135 <span itemprop="price" content="@googlepriceformatted" class="d-none"></span> 136 137 if (product.Price.Price != product.PriceBeforeDiscount.Price) 138 { 139 <span class="text-decoration-line-through opacity-75 @order"> 140 <span class="text-price">@beforePrice</span> 141 </span> 142 } 143 } 144 } 145 146 @if (showPricesWithVat == "false" && !neverShowVat) 147 { 148 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 149 { 150 <span class="text-price js-text-price"> 151 <span class="spinner-border" role="status"></span> 152 </span> 153 } 154 else 155 { 156 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceWithoutVatFormatted : product.Price.PriceWithoutVatFormatted; 157 158 if (product?.VariantInfo?.VariantInfo != null) 159 { 160 priceMin = product?.VariantInfo?.PriceMin?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithoutVatFormatted : ""; 161 priceMax = product?.VariantInfo?.PriceMax?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithoutVatFormatted : ""; 162 } 163 if (priceMin != priceMax) 164 { 165 price = priceMin + " - " + priceMax; 166 } 167 <span class="@theme"> 168 <span class="text-price">@price</span> 169 </span> 170 } 171 } 172 else 173 { 174 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 175 { 176 <span class="text-price js-text-price"> 177 <span class="spinner-border" role="status"></span> 178 </span> 179 } 180 else 181 { 182 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceFormatted : product.Price.PriceFormatted; 183 var priceStandardFieldValueConverted = CampaignPrice.GetConvertedPriceWithVat(product); 184 bool campaignPrice = CampaignPrice.CheckCampaign(product, priceStandardFieldValueConverted); 185 var priceBefore = CampaignPrice.PriceBeforeWithVat(product, priceStandardFieldValueConverted); 186 187 if (product?.VariantInfo?.VariantInfo != null) 188 { 189 priceMin = product?.VariantInfo?.PriceMin?.PriceFormatted != null ? product.VariantInfo.PriceMin.PriceFormatted : ""; 190 priceMax = product?.VariantInfo?.PriceMax?.PriceFormatted != null ? product.VariantInfo.PriceMax.PriceFormatted : ""; 191 } 192 if (priceMin != priceMax) 193 { 194 price = priceMin + " - " + priceMax; 195 } 196 <div class="d-flex flex-wrap"> 197 @if (campaignPrice) 198 { 199 @*<span itemprop="price" content="@priceStandardFieldValueConverted" class="d-none"></span>*@ 200 <span class="text-decoration-line-through opacity-75 @order w-100"> 201 <span class="text-price">@priceBefore</span> 202 </span> 203 } 204 <span class="@theme w-100"> 205 <span class="text-price">@price</span> 206 </span> 207 </div> 208 } 209 } 210 211 @* Stock state for Schema.org, start *@ 212 @{ 213 Uri url = Dynamicweb.Context.Current.Request.Url; 214 } 215 216 <link itemprop="url" href="@url"> 217 218 @{ 219 bool IsNeverOutOfStock = product.NeverOutOfstock; 220 } 221 222 @if (IsNeverOutOfStock) 223 { 224 <span itemprop="availability" class="d-none">@Translate("Available in stock")</span> 225 } 226 else 227 { 228 if (product.StockLevel > 0) 229 { 230 <span itemprop="availability" class="d-none">InStock</span> 231 } 232 else 233 { 234 <span itemprop="availability" class="d-none">OutOfStock</span> 235 } 236 } 237 @* Stock state for Schema.org, stop *@ 238 239 </div> 240 241 @if (showPricesWithVat == "false" && !neverShowVat) 242 { 243 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 244 { 245 <small class="opacity-85 fst-normal js-text-price-with-vat d-none" data-suffix="@Translate("Incl. VAT")"></small> 246 } 247 else 248 { 249 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceWithVatFormatted : product.Price.PriceWithVatFormatted; 250 251 if (product?.VariantInfo?.VariantInfo != null) 252 { 253 priceMin = product?.VariantInfo?.PriceMin?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithVatFormatted : ""; 254 priceMax = product?.VariantInfo?.PriceMax?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithVatFormatted : ""; 255 } 256 if (priceMin != priceMax) 257 { 258 price = priceMin + " - " + priceMax; 259 } 260 <small class="opacity-85 fst-normal">@price @Translate("Incl. VAT")</small> 261 } 262 } 263 </div> 264 } else if (Pageview.IsVisualEditorMode) { 265 <div class="alert alert-dark m-0" role="alert"> 266 <span>@Translate("No products available")</span> 267 </div> 268 } 269
Bliv klogere på fordelene ved komposit, og se eksempler på hegnsprojekter.
Fra utæmmet hæk til stringent komposithegn i haveskel.
Varenr. består af:
10 stk. kompositplanker, top/bund- og sideprofiler samt skruer til samling af profiler.
Stålrammer:
Kompositplanker:
Tilbehør:
Skruer til montering på stålstolper varenr. 17520-1
Skruer til montering på kompositstolper varenr. 17519-1
Skruer til montering på træstolper varenr. 17518-1
Der anvendes 12 stk. pr. hegn. (24 stk. pr. pose)
Leveres som "Saml selv" projekt.
Design:
PLUS A/S
Farve:
Skifergrå
Materiale:
Komposit
Overflade:
Ensartet struktur
Volume:
0.099
Weight:
65.2
Width in Cm:
180
Depth in Cm:
3
Height in cm:
180
Bliv klogere på fordelene ved komposit, og se eksempler på hegnsprojekter.
Fra utæmmet hæk til stringent komposithegn i haveskel.
Varenr. består af:
10 stk. kompositplanker, top/bund- og sideprofiler samt skruer til samling af profiler.
Stålrammer:
Kompositplanker:
Tilbehør:
Skruer til montering på stålstolper varenr. 17520-1
Skruer til montering på kompositstolper varenr. 17519-1
Skruer til montering på træstolper varenr. 17518-1
Der anvendes 12 stk. pr. hegn. (24 stk. pr. pose)
Leveres som "Saml selv" projekt.
Design:
PLUS A/S
Farve:
Skifergrå
Materiale:
Komposit
Overflade:
Ensartet struktur
Volume:
0.099
Weight:
65.2
Width in Cm:
180
Depth in Cm:
3
Height in cm:
180