
Skab havens nye samlingspunkt
Bliv inspireret af fine kundeprojekter, og se hvor nemt det er at bygge en pergola.
Med en byg selv-pergola er det nemt at opdatere og forny din haveindretning, så den emmer af stemning og god stil.
Pergolaer har været kendt i haveindretning gennem flere århundreder. Og i dag er den et populært element i både klasssiske, romantiske og moderne haver - som et effektfuldt element, der inviterer til livsnyderi og til at gå på opdagelse.
Brug pergolaer til at skabe skyggefulde gangaeraler, havestier eller en frodig, overdækket terrasse og lounge.
🟢 På lager(+5)
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_08304da990a3406792fa85cf8addc7f2.Execute() in C:\inetpub\wwwroot\plus-prod\Files\Templates\Designs\Swift\Paragraph\Swift_ProductPrice.cshtml:line 140 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 } 25 else if (Pageview.Item["DummyProduct"] != null) 26 { 27 28 string dummyProductId = ""; 29 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page); 30 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel(); 31 if (productList.Products != null) 32 { 33 foreach (var p in productList.Products) { dummyProductId = p.Id; } 34 ProductViewModel dummyProduct = dummyProductId != "" ? ViewModelFactory.CreateView(productSetting, dummyProductId) : new ProductViewModel(); 35 product = dummyProduct; 36 } 37 else 38 { 39 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 40 } 41 } 42 else if (Pageview.Item["DummyProduct"] == null) 43 { 44 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id); 45 } 46 47 string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", ""); 48 bool anonymousUser = Pageview.User == null; 49 bool isErpConnectionDown = !Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsWebServiceConnectionAvailable(); 50 bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHidePrices") && isErpConnectionDown; 51 52 bool showInformativePrice = Model.Item.GetBoolean("ShowInformativePrice"); 53 string unitId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("UnitId")) ? Dynamicweb.Context.Current.Request.Form.Get("UnitId") : string.Empty; 54 55 string priceFontSize = Model.Item.GetRawValueString("PriceSize", "fs-2"); 56 string horizontalAlign = Model.Item.GetRawValueString("HorizontalAlignment", ""); 57 string layout = Model.Item.GetRawValueString("Layout", "horizontal"); 58 string textAlign = horizontalAlign == "center" ? "text-center" : string.Empty; 59 textAlign = horizontalAlign == "end" ? "text-end" : textAlign; 60 61 horizontalAlign = horizontalAlign == "center" && layout == "horizontal" ? "justify-content-center" : horizontalAlign; 62 horizontalAlign = horizontalAlign == "end" && layout == "horizontal" ? "justify-content-end" : horizontalAlign; 63 horizontalAlign = horizontalAlign == "center" && layout == "vertical" ? "align-items-center" : horizontalAlign; 64 horizontalAlign = horizontalAlign == "end" && layout == "vertical" ? "align-items-end" : horizontalAlign; 65 66 string flexDirection = layout == "horizontal" ? string.Empty : "flex-column"; 67 string flexGap = layout == "horizontal" ? "gap-3" : string.Empty; 68 string order = layout == "horizontal" ? string.Empty : "order-2"; 69 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? "theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 70 theme = GetViewParameter("theme") != null ? GetViewParameterString("theme") : theme; 71 } 72 73 @if (!hidePrice && product.Id != null && !product.Discontinued) 74 { 75 string showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); 76 bool neverShowVat = string.IsNullOrEmpty(showPricesWithVat); 77 78 string priceMin = ""; 79 string priceMax = ""; 80 81 string liveInfoClass = ""; 82 string productInfoFeed = ""; 83 bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsLazyLoadingForProductInfoEnabled; 84 if (isLazyLoadingForProductInfoEnabled) 85 { 86 if (Dynamicweb.Context.Current.Items.Contains("ProductInfoFeed")) 87 { 88 productInfoFeed = Dynamicweb.Context.Current.Items["ProductInfoFeed"]?.ToString(); 89 if (!string.IsNullOrEmpty(productInfoFeed)) 90 { 91 productInfoFeed = $"data-product-info-feed=\"{productInfoFeed}\""; 92 } 93 } 94 liveInfoClass = "js-live-info"; 95 } 96 97 <div class="@textAlign @liveInfoClass item_@Model.Item.SystemName.ToLower()" data-product-id="@product.Id" @productInfoFeed> 98 @if (showInformativePrice && product.PriceInformative.Price != 0) 99 { 100 <div class="opacity-50"> 101 <span>@Translate("RRP") </span> 102 <span class="text-decoration-line-through text-price">@product.PriceInformative.PriceFormatted</span> 103 </div> 104 } 105 <div class="@priceFontSize m-0 d-flex @flexDirection @flexGap @horizontalAlign product-price-efa" itemprop="offers" itemscope itemtype="https://schema.org/Offer"> 106 <span itemprop="priceCurrency" content="@product.Price.CurrencyCode" class="d-none"></span> 107 108 109 @if (showPricesWithVat == "false" && !neverShowVat) 110 { 111 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 112 { 113 <span itemprop="price" content="" class="d-none"></span> 114 <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> 115 } 116 else 117 { 118 string beforePrice = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).PriceBeforeDiscount.PriceWithoutVatFormatted : product.PriceBeforeDiscount.PriceWithoutVatFormatted; 119 120 <span itemprop="price" content="@product.Price.PriceWithoutVat" class="d-none"></span> 121 if (product.Price.Price != product.PriceBeforeDiscount.Price) 122 { 123 <span class="text-decoration-line-through opacity-75 @order">@beforePrice</span> 124 } 125 } 126 } 127 else 128 { 129 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 130 { 131 <span itemprop="price" content="" class="d-none"></span> 132 <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> 133 } 134 else 135 { 136 string beforePrice = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).PriceBeforeDiscount.PriceFormatted : product.PriceBeforeDiscount.PriceFormatted; 137 138 string googlepriceraw = product.Price.PriceWithVat.ToString(); 139 string googlepriceformatted = googlepriceraw.Replace(',', '.'); 140 var priceStandardFieldValueConverted = CampaignPrice.GetConvertedPriceWithVat(product); 141 bool campaignPrice = CampaignPrice.CheckCampaign(product, priceStandardFieldValueConverted); 142 143 <span itemprop="price" content="@googlepriceformatted" class="d-none"></span> 144 145 @*Old price shown if e.g. productdiscounts are active*@ 146 if (product.Price.Price != product.PriceBeforeDiscount.Price & campaignPrice == false) 147 { 148 <span class="text-decoration-line-through opacity-75 campaign-price-efa @order"> 149 <span class="text-price">@beforePrice</span> 150 </span> 151 } 152 } 153 } 154 155 @if (showPricesWithVat == "false" && !neverShowVat) 156 { 157 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 158 { 159 <span class="text-price js-text-price"> 160 <span class="spinner-border" role="status"></span> 161 </span> 162 } 163 else 164 { 165 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceWithoutVatFormatted : product.Price.PriceWithoutVatFormatted; 166 167 if (product?.VariantInfo?.VariantInfo != null) 168 { 169 priceMin = product?.VariantInfo?.PriceMin?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithoutVatFormatted : ""; 170 priceMax = product?.VariantInfo?.PriceMax?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithoutVatFormatted : ""; 171 } 172 if (priceMin != priceMax) 173 { 174 price = priceMin + " - " + priceMax; 175 } 176 <span class="@theme"> 177 <span class="text-price">@price</span> 178 </span> 179 } 180 } 181 else 182 { 183 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 184 { 185 <span class="text-price js-text-price"> 186 <span class="spinner-border" role="status"></span> 187 </span> 188 } 189 else 190 { 191 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceFormatted : product.Price.PriceFormatted; 192 var priceStandardFieldValueConverted = CampaignPrice.GetConvertedPriceWithVat(product); 193 bool campaignPrice = CampaignPrice.CheckCampaign(product, priceStandardFieldValueConverted); 194 var priceBefore = CampaignPrice.PriceBeforeWithVat(product, priceStandardFieldValueConverted); 195 196 if (product?.VariantInfo?.VariantInfo != null) 197 { 198 priceMin = product?.VariantInfo?.PriceMin?.PriceFormatted != null ? product.VariantInfo.PriceMin.PriceFormatted : ""; 199 priceMax = product?.VariantInfo?.PriceMax?.PriceFormatted != null ? product.VariantInfo.PriceMax.PriceFormatted : ""; 200 } 201 if (priceMin != priceMax) 202 { 203 price = priceMin + " - " + priceMax; 204 } 205 <div class="d-flex flex-wrap"> 206 @if (campaignPrice) 207 { 208 var oldprice = product.PriceBeforeDiscount.PriceFormatted; 209 @*<span itemprop="price" content="@priceStandardFieldValueConverted" class="d-none"></span>*@ 210 <span class="text-decoration-line-through opacity-75 @order w-100 campaign-price-efa"> 211 <span class="text-price">@oldprice</span> 212 </span> 213 } 214 @*New Price shown if e.g. productdicounts are active*@ 215 <span class="@theme w-100"> 216 <span class="text-price">@price</span> 217 </span> 218 </div> 219 } 220 } 221 222 @* Stock state for Schema.org, start *@ 223 @{ 224 Uri url = Dynamicweb.Context.Current.Request.Url; 225 } 226 227 <link itemprop="url" href="@url"> 228 229 @{ 230 bool IsNeverOutOfStock = product.NeverOutOfstock; 231 } 232 233 @if (IsNeverOutOfStock) 234 { 235 <span itemprop="availability" class="d-none">@Translate("Available in stock")</span> 236 } 237 else 238 { 239 if (product.StockLevel > 0) 240 { 241 <span itemprop="availability" class="d-none">InStock</span> 242 } 243 else 244 { 245 <span itemprop="availability" class="d-none">OutOfStock</span> 246 } 247 } 248 @* Stock state for Schema.org, stop *@ 249 250 </div> 251 252 @if (showPricesWithVat == "false" && !neverShowVat) 253 { 254 if (isLazyLoadingForProductInfoEnabled && !Pageview.IsVisualEditorMode) 255 { 256 <small class="opacity-85 fst-normal js-text-price-with-vat d-none" data-suffix="@Translate("Incl. VAT")"></small> 257 } 258 else 259 { 260 string price = !string.IsNullOrEmpty(unitId) ? product.GetPrice(unitId).Price.PriceWithVatFormatted : product.Price.PriceWithVatFormatted; 261 262 if (product?.VariantInfo?.VariantInfo != null) 263 { 264 priceMin = product?.VariantInfo?.PriceMin?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithVatFormatted : ""; 265 priceMax = product?.VariantInfo?.PriceMax?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithVatFormatted : ""; 266 } 267 if (priceMin != priceMax) 268 { 269 price = priceMin + " - " + priceMax; 270 } 271 <small class="opacity-85 fst-normal">@price @Translate("Incl. VAT")</small> 272 } 273 } 274 </div> 275 } 276 else if (Pageview.IsVisualEditorMode) 277 { 278 <div class="alert alert-dark m-0" role="alert"> 279 <span>@Translate("No products available")</span> 280 </div> 281 } 282
Bliv inspireret af fine kundeprojekter, og se hvor nemt det er at bygge en pergola.
Bliv klogere på designerens tanker bag det populære Cubic-beslag, som i mere end 10 år har spillet hovedrollen, når der skal bygges pergolaer og andre kreative uderum.
Kan du huske følelsen af spænding over at løfte en stor sten i skoven, og glæden ved at tage et stykke bark af en gammel....
Varenr. består af:
Komplet løsning med Cubic beslag, stolpefødder, Cubic drager og stolper til montering på fundament. Inkl. skruer/bolte.
Beslag:
Cubic Forlængerbeslag Enkelt 30,5×20×9 cm (6 stk.).
Cubic Forlængerbeslag Dobbelt 30,5×20×20 cm. (2 stk.).
Cubic Hjørnebeslag Dobbelt 20×20×20 cm (4 stk.).
Galvaniseret og pulverlakeret sort.
Sort RAL 9005.
Stolpefødder:
U-stolpefod 9×9×30 cm.
Hjørne stolpefod 9×9×30 cm.
Varmgalvaniseret og pulverlakeret.
Sort RAL 9005.
Til montage på fundament/træterrasse.
Inkl. skruer/bolte/møtrikhætter.
Stolper:
Afstand mellem stolper = 180 cm (længde og bredde).
Omlimede træstolper 9×9 cm.
Omlimede Cubic drager 9×9 cm.
Trykimprægneret (NTR mærket klasse A) og grundmalet sort.
Nærmeste RAL 9005 - vandbaseret.
Trykimprægneret NTR mærket klasse A - betyder, at de er effektivt beskyttet mod råd og tåler nedgravning. Stolperne er sammenlimet (omlimet) af to stykker træ for at mindske revnedannelser og vridning samt sikre styrke og formstabilitet.
Leveres som "Saml selv".
Design:
PLUS A/S
Farve:
Sort RAL 9005
Materiale:
Træ
Overflade:
Trykimprægneret og grundmalet
Volume:
1.3098
Weight:
236.034
Width in Cm:
387
Height in cm:
217
Length in cm:
387
Bliv inspireret af fine kundeprojekter, og se hvor nemt det er at bygge en pergola.
Bliv klogere på designerens tanker bag det populære Cubic-beslag, som i mere end 10 år har spillet hovedrollen, når der skal bygges pergolaer og andre kreative uderum.
Kan du huske følelsen af spænding over at løfte en stor sten i skoven, og glæden ved at tage et stykke bark af en gammel....
Varenr. består af:
Komplet løsning med Cubic beslag, stolpefødder, Cubic drager og stolper til montering på fundament. Inkl. skruer/bolte.
Beslag:
Cubic Forlængerbeslag Enkelt 30,5×20×9 cm (6 stk.).
Cubic Forlængerbeslag Dobbelt 30,5×20×20 cm. (2 stk.).
Cubic Hjørnebeslag Dobbelt 20×20×20 cm (4 stk.).
Galvaniseret og pulverlakeret sort.
Sort RAL 9005.
Stolpefødder:
U-stolpefod 9×9×30 cm.
Hjørne stolpefod 9×9×30 cm.
Varmgalvaniseret og pulverlakeret.
Sort RAL 9005.
Til montage på fundament/træterrasse.
Inkl. skruer/bolte/møtrikhætter.
Stolper:
Afstand mellem stolper = 180 cm (længde og bredde).
Omlimede træstolper 9×9 cm.
Omlimede Cubic drager 9×9 cm.
Trykimprægneret (NTR mærket klasse A) og grundmalet sort.
Nærmeste RAL 9005 - vandbaseret.
Trykimprægneret NTR mærket klasse A - betyder, at de er effektivt beskyttet mod råd og tåler nedgravning. Stolperne er sammenlimet (omlimet) af to stykker træ for at mindske revnedannelser og vridning samt sikre styrke og formstabilitet.
Leveres som "Saml selv".
Design:
PLUS A/S
Farve:
Sort RAL 9005
Materiale:
Træ
Overflade:
Trykimprægneret og grundmalet
Volume:
1.3098
Weight:
236.034
Width in Cm:
387
Height in cm:
217
Length in cm:
387