
Få plads til det du drømmer om
Uanset om du drømmer om en lille hyggelounge, et redskabsrum, cykelskur eller overdækning til et udekøkken eller spa, finder du et rum, som passer blandt vores Classic, Multi og Nordic havehuse.
Et Cykelskur med åben front er et must til dig, der gerne vil passe godt på familiens cykler og andre køretøjer. Men du kender sikkert til problemet med at finde et pænt og holdbart cykelskur i træ i god kvalitet, som matcher resten af uderummet.
Cykelskuret er designet i nordisk stil med lækre detaljer, der passer lige ind i nutidens boligindretning.
Vælg mellem flere varianter: lukket med dobbeltdør eller åben - eller måske en kombination, som gør det muligt også at opbevare andre redskaber og køretøjer bag en lukket dobbeltdør.
Med vores cykelskure og Multi Havehuse i træ har vi sørget for, at du kan bygge opbevaring til cyklerne uden at gå på kompromis med hverken kvalitet eller æstetik. Og så er skurene tilmed lette og overskuelige at bygge selv.
🟢 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
Uanset om du drømmer om en lille hyggelounge, et redskabsrum, cykelskur eller overdækning til et udekøkken eller spa, finder du et rum, som passer blandt vores Classic, Multi og Nordic havehuse.
Bliv inspireret af flotte kundeprojekter med vores Classic, Multi og Nordic havehuse.
Shelter eller praktisk redskabsrum? Kig med her, og bliv inspireret af Trines version af Multi Havehuset.
Henrik og Christina i Middelfart har fået plads til cykler og redskaber i deres nye Multi Havehus.
Varenr. består af:
Cykelskur 1- modul inkl. beslag/skruer. Ekskl. H-stolpefødder og tagpap/alulister.
Ønsker du Cykelskuret leveret med:
Tagpap og alulister - bestil varenr. 167565-1.
Tagpap, alulister og H-stolpefødder - bestil varenr. 167566-1.
Grundmål:
Udvendig grundmål: 229×248 cm (L×B).
Udvendig højdemål: 145/202/250 cm.
Beklædning:
19×100 mm savskåret "to på én" (+/÷ 2 mm tolerance).
Gavle og bagvæg: leveres i færdigsamlede sektioner.
Tagkonstruktion:
Leveres usamlet.
Tagbrædder: 18×110 mm.
Tagspær: 45×95 mm.
Taghældning: 30º.
Ekskl. tagpap/papsøm og alulister.
Stolper og grundkonstruktion:
Bundrem: 45×95 mm.
Trykimprægnerede høvlede stolper 95×95 mm.
Vigtigt - stolperne er udfræset til H-stolpefødder og skal forankres i beton i frostfri dybde, jfr. montagevejledning.
Antal til Cykelskur: 6 stk. H-stolpefødder og 6 ps. franske skruer
(medfølger ikke).
Estimeret montagetid:
2 personer - 6 timer (ekskl. fundament).
Leveres ubehandlet og som "Saml selv".
PLUS anbefaler altid grundbehandling inden opstilling.
HUSK... inden du påbegynder dit byggeri, så anbefaler PLUS altid, at du orienterer dig omkring gældende regler inden for småhusbyggeri (sekundært byggeri) eller tager kontakt til Teknisk Forvaltning i din kommune.
Billeder:
Da vi løbende optimerer og forbedrer konstruktionen i vores produkter, kan de viste produktfoto variere fra det færdige produkt.
Design:
PLUS A/S
Farve:
Natur
Materiale:
Træ
Overflade:
Ubehandlet
Volume:
2.16
Weight:
390
Width in Cm:
248
Height in cm:
250
Length in cm:
229
Uanset om du drømmer om en lille hyggelounge, et redskabsrum, cykelskur eller overdækning til et udekøkken eller spa, finder du et rum, som passer blandt vores Classic, Multi og Nordic havehuse.
Bliv inspireret af flotte kundeprojekter med vores Classic, Multi og Nordic havehuse.
Shelter eller praktisk redskabsrum? Kig med her, og bliv inspireret af Trines version af Multi Havehuset.
Henrik og Christina i Middelfart har fået plads til cykler og redskaber i deres nye Multi Havehus.
Varenr. består af:
Cykelskur 1- modul inkl. beslag/skruer. Ekskl. H-stolpefødder og tagpap/alulister.
Ønsker du Cykelskuret leveret med:
Tagpap og alulister - bestil varenr. 167565-1.
Tagpap, alulister og H-stolpefødder - bestil varenr. 167566-1.
Grundmål:
Udvendig grundmål: 229×248 cm (L×B).
Udvendig højdemål: 145/202/250 cm.
Beklædning:
19×100 mm savskåret "to på én" (+/÷ 2 mm tolerance).
Gavle og bagvæg: leveres i færdigsamlede sektioner.
Tagkonstruktion:
Leveres usamlet.
Tagbrædder: 18×110 mm.
Tagspær: 45×95 mm.
Taghældning: 30º.
Ekskl. tagpap/papsøm og alulister.
Stolper og grundkonstruktion:
Bundrem: 45×95 mm.
Trykimprægnerede høvlede stolper 95×95 mm.
Vigtigt - stolperne er udfræset til H-stolpefødder og skal forankres i beton i frostfri dybde, jfr. montagevejledning.
Antal til Cykelskur: 6 stk. H-stolpefødder og 6 ps. franske skruer
(medfølger ikke).
Estimeret montagetid:
2 personer - 6 timer (ekskl. fundament).
Leveres ubehandlet og som "Saml selv".
PLUS anbefaler altid grundbehandling inden opstilling.
HUSK... inden du påbegynder dit byggeri, så anbefaler PLUS altid, at du orienterer dig omkring gældende regler inden for småhusbyggeri (sekundært byggeri) eller tager kontakt til Teknisk Forvaltning i din kommune.
Billeder:
Da vi løbende optimerer og forbedrer konstruktionen i vores produkter, kan de viste produktfoto variere fra det færdige produkt.
Design:
PLUS A/S
Farve:
Natur
Materiale:
Træ
Overflade:
Ubehandlet
Volume:
2.16
Weight:
390
Width in Cm:
248
Height in cm:
250
Length in cm:
229