Komposithegn - hegn med minimalt vedligehold
Bliv klogere på fordelene ved komposit, og se eksempler på hegnsprojekter.
Med Artura Komposithegn får du alle fordelene ved det næsten vedligeholdelsesfri materiale, komposit, samt muligheden for at skræddersy din hegnsløsning. Kombinér det flotte skifergrå hegn - med træstruktur - med enten stålstolper eller kompositstolper, og få et imponerende, tidløst hegn, som passer til enhver stil.
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.
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_524f163f12484be2a531f5e309983f60.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:
Komplet enkeltlåge inkl. planker, stålstolper til nedstøbning, beslag og låsekasse. Leveres færdigsamlet.
Farve:
Skifergrå
Materiale:
Komposit
Overflade:
Træstruktur
Volume:
0.09463
Weight:
46.31405
Width in Cm:
115
Depth in Cm:
3
Height in cm:
95
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:
Komplet enkeltlåge inkl. planker, stålstolper til nedstøbning, beslag og låsekasse. Leveres færdigsamlet.
Farve:
Skifergrå
Materiale:
Komposit
Overflade:
Træstruktur
Volume:
0.09463
Weight:
46.31405
Width in Cm:
115
Depth in Cm:
3
Height in cm:
95