Error executing template "Designs/StandardWebshop/_parsed/StandardPage.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_126ff141d7ce4c71badb8e7294a5b911.Execute() in E:\Solutions\DermaPharm\Live\Files\Templates\Designs\StandardWebshop\_parsed\StandardPage.parsed.cshtml:line 19
   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.b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 2 @using NORRIQ.Common8.Razor 3 @{ 4 var noscriptquery = System.Web.HttpContext.Current.Request.QueryString["notracking"]; 5 var testcss = System.Web.HttpContext.Current.Request.QueryString["testcss"]; 6 } 7 <!DOCTYPE html> 8 <html lang="@Pageview.Area.Culture"> 9 <head> 10 @if (Model.ID == 2) 11 { 12 @RenderSnippet("EcomMeta") 13 } 14 else 15 { 16 <title>@Model.Title</title> 17 <meta name="description" content="@Model.Description" /> 18 } 19 @if (Model.Item.GetBoolean("NoIndex")) 20 { 21 <meta name="robots" content="noindex, nofollow" /> 22 <!-- TODO: remove on launch--> 23 } 24 @RenderSnippet("AddNoIndex") 25 <meta charset='utf-8' /> 26 <meta name="description" content="@Model.Description" /> 27 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 28 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no" /> 29 <link rel="icon" type="image/x-icon" href="/Files/Templates/Designs/StandardWebshop/Images/Goodskin_Favicon.png"> 30 <link href="https://fonts.googleapis.com/css?family=Montserrat:300,300i,700,700i" rel="stylesheet"> 31 <link rel="stylesheet" href="https://use.typekit.net/bcz8hat.css"> 32 33 <link href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css' rel='stylesheet' type='text/css' /> 34 <link href='@(Model.Item.GetBoolean("NIQ:JavaScriptDebug") ? "/Files/Templates/Designs/StandardWebshop/css/style.css?v=5" : "/Files/Templates/Designs/StandardWebshop/css/style.css?v=6")' rel='stylesheet' /> 35 @*min*@ 36 <script src="https://www.googleoptimize.com/optimize.js?id=OPT-M2HB526"></script> 37 38 @RenderSnippet("MoveToHead") 39 @if (noscriptquery != "true") 40 { 41 @Model.Area.Item.GetString("GTM_Header_Script") 42 } 43 <!--[if IE]> 44 <style>.productlist-grid { float: left; }</style> 45 <![endif]--> 46 <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> 47 <!--[if lt IE 9]> 48 <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> 49 <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> 50 <![endif]--> 51 52 </head> 53 54 <body data-is-desktop="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop ? "true" : "false")" data-is-tablet="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Tablet ? "true" : "false")" data-is-phone="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Mobile ? "true" : "false")"> 55 @if(noscriptquery != "true") { 56 @Model.Area.Item.GetString("GTM_BodyIFrame") 57 } 58 @using NORRIQ.Common8.Razor; 59 @using Dynamicweb 60 @using Dynamicweb.Ecommerce.Common; 61 @using Dynamicweb.Ecommerce.Prices 62 @using Dynamicweb.Rendering; 63 @using Dynamicweb.Ecommerce.ProductCatalog; 64 @using System.Web; 65 66 67 68 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 69 @{ 70 ProductListViewModel productlist = Pageview.AreaSettings.GetValue("MinicartProducts") as ProductListViewModel; 71 var isCartEmpty = (Dynamicweb.Ecommerce.Common.Context.Cart == null || Dynamicweb.Ecommerce.Common.Context.Cart.OrderLines.CountOnlyProducts == 0); 72 var isMobile = Pageview.Device.ToString() == "Mobile" ? "true" : "false"; 73 74 var ProductCurrency = Dynamicweb.Ecommerce.Common.Context.Currency.Symbol; 75 var cartPage = Dynamicweb.Services.Pages.GetPage(3); 76 var cartPageEmpty = Dynamicweb.Services.Pages.GetPage(2); 77 var cartPageId = 1335; 78 var cartFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID="+3); 79 var SliderClass = "slick-middle-arrow slick-flex"; 80 } 81 82 83 84 85 86 <header class="header-default"> 87 <div class="container"> 88 <div class="header-wrapper"> 89 <div class="header-default-logo"> 90 <a href="/" title='@Translate("Go to frontpage", "Go to frontpage")'> 91 @{ 92 var logo = Model.Area.Item.GetFile("Logo"); 93 94 if (logo != null) 95 { 96 var extension = logo.Name.Substring(logo.Name.LastIndexOf('.') + 1); 97 var filename = logo.Path.Substring(0, logo.Path.LastIndexOf('.')); 98 <img class="img-responsive" src="@logo.Path" srcset="@filename-2x.@extension 2x" alt='@Translate("Website Logo Alt", "Shutter - Standard Webshop")' /> 99 } 100 else 101 { 102 <i>No logo found, please configure it in the Dynamicweb Administration</i> 103 } 104 } 105 </a> 106 </div> 107 @RenderNavigation(new { Template = "navbar-nav-ecom-goodskin.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 3 }) 108 @RenderNavigation(new { Template = "navbar-nav-pages.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 109 <ul class="nav navbar-nav header-default-nav"> 110 <li class="dropdown dropdown-icon"> 111 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 112 <i class="fa fa-search"></i> 113 <span class="dropdown-label">@Translate("Search", "Search")</span> 114 </a> 115 <div class="dropdown-menu instantsearch"> 116 @using NORRIQ.Common8.Razor; 117 @{ 118 var searchLabel = Translate("Search products"); 119 var searchResultPageId = NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("search"); 120 var searchQuery = @System.Web.HttpContext.Current.Request.QueryString["ecomQuery"]; 121 } 122 123 <div class="form-search" id="instantsearch"> 124 <form class="form form-search-form" id="search-form" action="/Default.aspx" method="get"> 125 <input type="hidden" value="@searchQuery" id="searchstring"> 126 <input type="hidden" name="ID" value="@searchResultPageId" /> 127 <label for="searchTerm" class="sr-only"> 128 @searchLabel 129 </label> 130 <div class="input-group"> 131 <input type="search" class="form-control" id="searchTerm" name="eComQuery" placeholder="@searchLabel" autocomplete="off" data-tabindex="0" value="@searchQuery" /> 132 <span class="input-group-btn"> 133 <button type="submit" id="instantSearchBtn" class="btn btn-primary js-search-btn"> 134 <i id="instantSearchIcon" class="icon-search" aria-hidden="true"></i><span class="sr-only">@Translate("Search")</span> 135 </button> 136 </span> 137 </div> 138 </form> 139 <div class="form-search-collapse collapse" id="search-result-foldout"> 140 <div class="form-search-result" id="search-result-container"></div> 141 </div> 142 </div> 143 144 145 <script type="text/x-jsrender" id="quicksearchtemplate"> 146 147 <table class="table table-condensed productlist-table"> 148 <tbody> 149 {{for Products}} 150 <tr data-product-id="{{:Id}}" 151 data-product-key='{{:AutoAddProductKey}}' 152 data-product-language-id="{{:LanguageId}}"> 153 @if (Pageview.Security.UserLoggedIn) 154 { 155 <td class="productlist-table-thumb text-center" width="70"> 156 <img src="/Admin/Public/GetImage.ashx?Image={{:ThumbnailImageName}}&amp;Width=60&amp;Height=60&amp;Crop=5&amp;Compression=80" height="60" class="img-responsive" alt="{{:ThumbnailImageAltText}}" /> 157 </td> 158 <td class="productlist-table-product"> 159 <a href="{{:Link}}" class="productlist-table-name"> 160 {{:Name}} 161 </a> 162 <div class="clearfix"> 163 <div class="pull-left text-small"> 164 @Translate("Product Number"): {{:Number}}<br /> 165 @Translate("Price"): {{:UnitPrice}} 166 </div> 167 <div class="productlist-table-quantity pull-right"> 168 <div class="input-group"> 169 <input type="text" 170 class="form-control qty-input text-center js-qs-qty-input" 171 value="{{:QtyInBasket}}" 172 onclick="this.focus(); this.select();" 173 data-tabindex="{{:#index + 1}}" /> 174 <span class="input-group-addon qty-input-user-feedback js-qs-qty-input-feedback"> 175 {{if QtyInBasket > 0}} 176 <i class="icon-added"></i> 177 {{else}} 178 <i class="icon-minicart"></i> 179 {{/if}} 180 </span> 181 </div> 182 </div> 183 </div> 184 </td> 185 } 186 else 187 { 188 <td class="productlist-table-thumb text-center" width="70"> 189 <img src="{{:ThumbnailImageName}}" height="60" class="img-responsive" alt="{{:ThumbnailImageAltText}}" /> 190 </td> 191 <td class="productlist-table-product"> 192 <a href="{{:Link}}" class="productlist-table-name"> 193 {{:Name}} 194 </a> 195 </td> 196 } 197 </tr> 198 {{/for}} 199 </tbody> 200 </table> 201 {{if MoreResults}} 202 <a href="{{:LinkToFullResults}}" class="btn btn-primary btn-sm">@Translate("Show all results") ({{:NumberOfResults}})</a> 203 {{/if}} 204 </script> 205 <script type="text/x-jsrender" id="quicksearchloadingtemplate"> 206 <p class="product-search-label"> 207 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Searching") 208 </p> 209 </script> 210 <script type="text/x-jsrender" id="noquerytemplate"> 211 <p class="product-search-label"><i class="icon-keyboard" aria-hidden="true"></i> @Translate("Start typing to search")</p> 212 </script> 213 <script type="text/x-jsrender" id="failedsearchtemplate"> 214 <p class="product-search-label"><i class="icon-warning" aria-hidden="true"></i> @Translate("An error occured")</p> 215 </script> 216 <script type="text/x-jsrender" id="noresultstemplate"> 217 <p class="product-search-label"><i class="icon-warning" aria-hidden="true"></i> @Translate("Search found no products")</p> 218 </script> 219 220 <script type="text/x-jsrender" id="qsautoaddfeedbackloading"> 221 <i class="icon-async icon-pulse"></i> 222 </script> 223 <script type="text/x-jsrender" id="qsautoaddfeedbacksuccess"> 224 <i class="icon-added" title="@Translate("Product added to cart")"></i> 225 </script> 226 <script type="text/x-jsrender" id="qsautoaddfeedbackerror"> 227 {{if error == "badinput"}} 228 <i class="icon-warning" title="@Translate("Please enter a numerical value")"></i> 229 {{else error == "servererror"}} 230 <i class="icon-warning" title="@Translate("An server error occured your cart was not updated")"></i> 231 {{else}} 232 <i class="icon-warning"></i> 233 {{/if}} 234 </script> 235 236 <script append="true"> 237 require(["jquery", "standardwebshop/areas/ecom/instantsearch"], function ($, search) { 238 search.init({ 239 WaitTime: 250, 240 $SearchResultTemplate: $('#quicksearchtemplate'), 241 $SearchInput: $('#searchTerm'), 242 $ResultContainer: $('#search-result-container'), 243 $ResultLoadingTemplate: $('#quicksearchloadingtemplate'), 244 $NoQueryTemplate: $('#noquerytemplate'), 245 $FailedSearchTemplate: $('#failedsearchtemplate'), 246 $CollapseContainer: $('#search-result-foldout'), 247 $NoResulsTemplate: $('#noresultstemplate'), 248 $SearchContainer: $('#instantsearch'), 249 LinkToSearchResults: "/default.aspx?ID=@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("search")", 250 PostPageId: "@NORRIQ.Common8.Razor.Navigation.GetPageIdByNavigationTag("instant-search")", 251 $searchBtn: $('.js-search-btn') 252 }); 253 }); 254 </script> 255 </div> 256 </li> 257 258 <li class="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop ? "dropdown dropdown-hover" : "dropdown") dropdown-icon"> 259 <a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 260 <i class="fa fa-user-circle-o" aria-hidden="true"></i> 261 <span class="dropdown-label"> 262 @if (Pageview.Security.UserLoggedIn) 263 { 264 @Translate("Account") 265 } 266 else 267 { 268 @Translate("Sign in") 269 } 270 </span> 271 </a> 272 @if (Pageview.Security.UserLoggedIn) 273 { 274 <ul class="dropdown-menu"> 275 @RenderNavigation(new { Template = "navbar-nav-customer.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 276 <li> 277 <a href="/admin/public/extranetlogoff.aspx?ID=@(Pageview.Page.ID)"> 278 <i class="icon-chevron-left" aria-hidden="true"></i> 279 @Translate("Sign out") 280 </a> 281 </li> 282 </ul> 283 } 284 else 285 { 286 <div class="dropdown-menu user"> 287 @using NORRIQ.Common8.Razor; 288 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 289 <input type="hidden" name="pid" value="@Pageview.Page.ID" /> 290 <div class="form-group"> 291 <label for="Username">@Translate("Username")</label> 292 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 293 </div> 294 <div class="form-group"> 295 <label for="Password">@Translate("Password")</label> 296 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 297 </div> 298 <div class="form-group"> 299 <div id="loginFeedback"></div> 300 <button type="submit" role="button" class="btn btn-primary btn-block" id="loginBtn"> 301 @Translate("Sign in") 302 </button> 303 </div> 304 <ul class="form-login-links"> 305 <li> 306 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("forgot-password")">@Translate("Forgot password")</a> 307 </li> 308 <li> 309 <a href="@NORRIQ.Common8.Razor.Navigation.GetUrlByNavigationTag("new-user")">@Translate("Register user")</a> 310 </li> 311 </ul> 312 </form> 313 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 314 @Translate("Sign in") 315 </script> 316 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 317 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 318 </script> 319 <script id="loginLoadingTemplate" type="text/x-jsrender"> 320 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 321 </script> 322 <script id="loginErrorTemplate" type="text/x-jsrender"> 323 <p class="user-login-error">@Translate("An error occured!")</p> 324 </script> 325 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 326 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 327 </script> 328 </div> 329 } 330 </li> 331 @{ 332 double quantity = 0; 333 double testquantity = 0; 334 var emptyCart = Translate("Your cart is empty", "Your cart is empty"); 335 var dropdown = string.Format("title=\"{0}\"", emptyCart); 336 var pageTypeDefined = Model.Item.GetValue<ListViewModel>("PageType"); 337 var pageType = "default"; 338 if (pageTypeDefined != null) 339 { 340 pageType = Model.Item.GetValue<ListViewModel>("PageType").SelectedValue; 341 } 342 if (!isCartEmpty) 343 { 344 quantity = Model.Cart.TotalProductsCount; 345 testquantity = Model.Cart.TotalProductsCount; 346 dropdown = "class=\"dropdown-toggle dropdown-minicart\" data-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\""; 347 } 348 } 349 @if (pageType != "cart") 350 { 351 352 <li class="@(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop && !isCartEmpty ? "dropdown" : "dropdown") dropdown-icon" id="cart-information"> 353 <a href="#"> 354 355 <i class="fa fa-shopping-basket" aria-hidden="true"></i> 356 <span class="dropdown-label">@Translate("Cart", "Cart")</span> 357 @if (!isCartEmpty && Pageview.Security.UserLoggedIn || !isCartEmpty) 358 { 359 <span class="dropdown-qty">@quantity</span> 360 } 361 </a> 362 363 </li> 364 365 } 366 <li class="dropdown dropdown-icon dropdown-mobile"> 367 <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 368 <i class="fa fa-bars"></i> 369 <span class="dropdown-label">Menu</span> 370 </a> 371 @RenderNavigation(new { Template = "navbar-nav-dropdown-goodskin.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 2 }) 372 </li> 373 </ul> 374 <!-- Mini-cart dropdown --> 375 <div class="cart-dropdown-wrapper"> 376 <div class="backdrop"></div> 377 <div class="mini-cart-dropdown"> 378 <div class="mini-cart-dropdown__inner"> 379 <i class="icon-close" id="cartClose" aria-hidden="true"></i> 380 <p>@Translate("Indkøbskurv")</p> 381 <ul class="cart-items"> 382 @{ 383 Dynamicweb.Ecommerce.Orders.Order cartContext = Dynamicweb.Ecommerce.Common.Context.Cart; 384 385 } 386 @if (cartPage != null && cartContext != null) 387 { 388 <a href="/Default.aspx?ID=@cartPage.ID" class="btn btn-lg btn-cart">@Translate("Gå til kurv")</a> 389 } 390 else 391 { 392 <a href="/Default.aspx?ID=@cartPageEmpty.ID" class="btn btn-lg">@Translate("Gå til shop")</a> 393 } 394 395 @if (cartContext != null) 396 { 397 398 foreach (var ol in cartContext.ProductOrderLines) 399 { 400 var product = ol.Product; 401 var link = "/Default.aspx?ID=2&productid=" + product.Id; 402 var productImage = "/Files" + product.ImageLarge; 403 var productQuant = cartContext.OrderLines.Where(x => x.ProductId == product.Id).FirstOrDefault(); 404 var currentProductCountDec = productQuant.Quantity - 1; 405 var priceInclDiscount = Math.Round(product.Price.Price + productQuant.TotalDiscount.Price, 2); 406 var orderlineTotatPrice = Math.Round(ol.Price.Price + productQuant.TotalDiscount.Price, 2); 407 var price2InclDiscount = orderlineTotatPrice / ol.Quantity; 408 var testProductPrice = Math.Abs(ol.TotalDiscount.PriceWithVAT / ol.Quantity); 409 var unitprice = ol.UnitPrice.PriceWithVAT; 410 var totalPrice = ol.TotalDiscount.PriceWithVAT; 411 412 <li data-id="@product.Id" class="item"> 413 414 <a href="@link"><img src="/admin/Public/GetImage.ashx?Width=86&amp;Height=125&amp;Crop=5&amp;Compression=70&Image=@productImage"></a> 415 416 <div class="right"> 417 <div> 418 <a class="title" href="@link">@product.Name</a> 419 @if (!string.IsNullOrWhiteSpace(product.Manufacturer.Name)) 420 { 421 <p>@product.Manufacturer.Name</p> 422 } 423 </div> 424 <div class="price"> 425 <p class="mini-cart-price">@price2InclDiscount.ToString("0.00") @cartContext.CurrencyCode X</p> 426 427 428 <p class="cart-orderline-quantity input-quantity mini-cart-inputs"> 429 <label for="QuantityOrderLine @ol.Id" class="sr-only">@Translate("Qty", "Qty")</label> 430 <a onclick="RemoveQuantity(@ol.Id)">-</a> 431 <input tabindex="@productQuant.Quantity" type="tel" class="form-control cart-orderline-input mini-cart-input kos" name="" onchange="UpdateQuantity(@ol.Id,this.value)" onblur="location.reload()" id="@ol.Id" value="@productQuant.Quantity" /> 432 <a onclick="AddQuantity(@ol.Id)">+</a> 433 434 </p> 435 436 <p class="mini-cart-price"> @orderlineTotatPrice.ToString("0.00") DKK</p> 437 </div> 438 <div class="options"> 439 <a href="/Default.aspx?Id=@(cartPageId)&OrderContext=@(cartContext.OrderContextId)&CartCmd=DelOrderLine&key=@(ol.Id)&cartrouteid=@(Pageview.ID)&redirect=false"> 440 <i class="icon-trash" aria-hidden="true"></i> @Translate("Slet Vare") 441 </a> 442 </div> 443 </div> 444 </li> 445 } 446 } 447 else 448 { 449 <li class="no-items"> 450 <div> 451 <p>@Translate("Kurven er tom")</p> 452 <p>@Translate("Click og se vores produktudvalg:")</p> 453 </div> 454 </li> 455 } 456 457 </ul> 458 459 <ul class="cart-actions"> 460 @if (cartContext != null) 461 { 462 if (cartContext.ShippingFee.Price > 0) 463 { 464 var rest = Math.Round(220 - cartContext.OrderLines.Price.Price, 2); 465 <li class="shipping-alert"> 466 <div class="alert alert-warning">Køb for @rest DKK mere og få fri fragt</div> 467 </li> 468 } 469 470 <li class="shipping-fee"> 471 <div>Levering</div> 472 <div>@cartContext.ShippingFee</div> 473 </li> 474 <li class="price-total"> 475 <div>Total</div> 476 <div>@Math.Round(Model.Cart.TotalPrice.PriceWithVat.Value, 2) @cartContext.CurrencyCode</div> 477 478 </li> 479 } 480 481 </ul> 482 @{ 483 IEnumerable<ProductViewModel> productlistTemp = Pageview.AreaSettings.GetValue("MinicartProducts") as IEnumerable<ProductViewModel>; 484 } 485 486 487 @if ( productlistTemp != null) 488 { 489 <div class=" frontpage-titles w100"> 490 <h2 class="text-center">@Translate("MinicartHeading")</h2> 491 492 <div class="@SliderClass mini-cart-slider" id="slide-products" itemscope itemtype="http://schema.org/ItemList"> 493 @foreach (var product in productlistTemp) 494 { 495 496 Dynamicweb.Ecommerce.Products.ProductService productService = new Dynamicweb.Ecommerce.Products.ProductService(); 497 498 var productDbModel = productService.GetProductById(product.Id, product.VariantId, product.LanguageId); 499 500 var customFieldProductData1 = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "ProductData1"); 501 var customFieldCertificates = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "ProductCertificates"); 502 string[] certificates = customFieldCertificates.Value.ToString().Split(','); 503 var customFieldBackInStock = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "BackInStock"); 504 var linkToShop = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "LinkToShop"); 505 var badge = productDbModel.ProductFieldValues.FirstOrDefault(x => x.ProductField.SystemName == "AwardBadge"); 506 // if (customFieldValue.Value != null) 507 // { 508 // <p>@customFieldValue.Value</p> 509 // } 510 511 512 513 <div class="ProductlistGrid col-xs-12 " data-product-display="flex"> 514 <div class="productlist-grid-product" itemscope itemtype="http://schema.org/Product"> 515 <img src="/Files/Images/@badge.Value" alt="" class="AwardBadge"> 516 517 <a class="productlist-grid-image" href="/Default.aspx?ID=2&productid=@product.Id" itemprop="url"> 518 <img src="/Admin/Public/GetImage.ashx?Width=200&amp;Height=200&amp;Crop=5&amp;Compression=80&amp;Image=@productDbModel.ImageLarge" class="img-responsive" alt="@product.Name" itemprop="image" /> 519 @if (@productDbModel.Price.PriceWithVAT != @productDbModel.Discounts.Price.PriceWithVAT) 520 { 521 var DiscountInPercent = 100 - (Convert.ToDouble(productDbModel.Discounts.Price.PriceWithVAT) / Convert.ToDouble(productDbModel.Price.PriceWithVAT) * 100); 522 <div class="discount-badge"> 523 @Translate("Spar") @Convert.ToString(Math.Floor(DiscountInPercent)) <text>%</text> 524 </div> 525 } 526 </a> 527 <span itemprop="manufacturer" class="productlist-grid-manufacturer-name">@productDbModel.Manufacturer.Name</span> 528 <a href="/Default.aspx?ID=2&productid=@product.Id" class="productlist-grid-name" itemprop="url"> 529 <span itemprop="name">@product.Name</span> 530 </a> 531 @if (customFieldProductData1 != null) 532 { 533 <div class="productlist-grid-subheading"> 534 &nbsp;@customFieldProductData1.Value &nbsp; 535 </div> 536 } 537 <ul class="certificates-mini"> 538 539 @if (customFieldCertificates.Value != null) 540 { 541 foreach (var cert in certificates) 542 { 543 544 <li> 545 <img src="@cert.Replace(".png","-mini.png")" title="h" alt="g" /> 546 547 </li> 548 549 } 550 } 551 </ul> 552 553 <div class="productlist-grid-price"> 554 <span class="price" itemprop="price"> 555 @productDbModel.Discounts.Price.PriceWithVAT 556 </span> 557 <span class="currency" itemprop="priceCurrency"> 558 @productDbModel.Price.Currency.Code 559 </span> 560 </div> 561 <div style="width: 100%;" class="product-buying sold"> 562 @if (productDbModel.Stock <= 0) 563 { 564 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) >= 0) 565 { 566 567 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) >= 7) 568 { 569 570 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays / 7) uger</strong> </div>} 571 572 else 573 { 574 if (@Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) == 1) 575 { 576 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) dag</strong> </div> 577 } 578 else 579 { 580 <div class="alert alert-stock"><strong>Forventes på lager om @Math.Ceiling((DateTime.Parse(customFieldBackInStock.Value.ToString()) - DateTime.Now).TotalDays) dage</strong> </div> 581 } 582 583 } 584 585 586 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 587 <input type="hidden" name="ID" value="5" /> 588 <input type="hidden" name="ProductID" value="@product.Id" /> 589 <input type="hidden" name="CartCmd" value="add" /> 590 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 591 <input type="hidden" name="UnitID" value="STK" /> 592 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 593 <div style="width: 100%;" class="input-group input-group-lg"> 594 <span class="input-group-btn"> 595 @{ // Get the shop page id and primarygroup and build the url for the shopcategorylink 596 HttpContext.Current.Session["shopcategorylink"] = ""; 597 var shopPage = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "canonical-products ecom"); 598 var productlistLinkSession = HttpContext.Current.Session["productlistlink"]; 599 600 var shopcategorylink = ""; 601 602 if (productlistLinkSession != null) 603 { 604 shopcategorylink = HttpContext.Current.Session["productlistlink"].ToString(); 605 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 606 } 607 608 else if (shopPage != null && !string.IsNullOrWhiteSpace(productDbModel.PrimaryGroupId)) 609 { 610 shopcategorylink = "Default.aspx" + "?ID=" + shopPage.ID + "&GroupID=" + productDbModel.PrimaryGroupId; 611 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 612 } } 613 614 615 <button style="width: 100%;" class="btn btn-add-to-cart sold" id="dataLayer" role="button" disabled type="submit"> 616 <span class="product-added-text">@Translate("SoldOut")</span> 617 </button> 618 </span> 619 </div> 620 </form> 621 } 622 else 623 {<div class="alert alert-stock empty"><strong>&nbsp;</strong> </div> 624 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 625 <input type="hidden" name="ID" value="5" /> 626 <input type="hidden" name="ProductID" value="@product.Id" /> 627 <input type="hidden" name="CartCmd" value="add" /> 628 <input type="hidden" name="UnitID" value="STK" /> 629 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 630 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 631 <div style="width: 100%;" class="input-group input-group-lg"> 632 <span class="input-group-btn"> 633 @{ // Get the shop page id and primarygroup and build the url for the shopcategorylink 634 HttpContext.Current.Session["shopcategorylink"] = ""; 635 var shopPage = Dynamicweb.Services.Pages.GetPageByNavigationTag(Pageview.AreaID, "canonical-products ecom"); 636 var productlistLinkSession = HttpContext.Current.Session["productlistlink"]; 637 638 var shopcategorylink = ""; 639 640 if (productlistLinkSession != null) 641 { 642 shopcategorylink = HttpContext.Current.Session["productlistlink"].ToString(); 643 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 644 } 645 646 else if (shopPage != null && !string.IsNullOrWhiteSpace(productDbModel.PrimaryGroupId)) 647 { 648 shopcategorylink = "Default.aspx" + "?ID=" + shopPage.ID + "&GroupID=" + productDbModel.PrimaryGroupId; 649 HttpContext.Current.Session["shopcategorylink"] = shopcategorylink; 650 } } 651 652 653 654 <button style="width: 100%;" class="btn btn-add-to-cart sold" id="dataLayer" role="button" disabled type="submit"> 655 <span class="product-added-text">@Translate("SoldOut")</span> 656 </button> 657 </span> 658 </div> 659 </form>} 660 } 661 else 662 {<form class="productlist-grid-form form-inline" method="post" action="/Default.aspx" style="display: none"> 663 <input type="hidden" name="ID" value="5" /> 664 <input type="hidden" name="ProductID" value="@product.Id" /> 665 <input type="hidden" name="CartCmd" value="add" /> 666 <input type="hidden" name="UnitID" value="STK" /> 667 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 668 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 669 <div style="width: 100%;" class="input-group input-group-lg"> 670 <span class="input-group-btn"> 671 672 673 674 <button style="width: 100%;" class="btn btn-add-to-cart" id="dataLayer" role="button" type="submit"> 675 <span class="product-added-text">@Translate("Add to cart")</span> <i class="fa fa-shopping-basket"></i> 676 </button> 677 </span> 678 </div> 679 </form> 680 681 <div class="alert alert-stock empty"><strong>&nbsp;</strong> </div> 682 <form class="productlist-grid-form form-inline" method="post" action="/Default.aspx"> 683 <input type="hidden" name="ID" value="5" /> 684 <input type="hidden" name="ProductID" value="@product.Id" /> 685 <input type="hidden" name="CartCmd" value="add" /> 686 <input type="hidden" name="UnitID" value="STK" /> 687 <input type="hidden" name="ProductURL" id="PageID" value="/Default.aspx?ID=2&productid=@product.Id" /> 688 <input type="hidden" name="Redirect" id="Redirect" value="/Default.aspx?ID=455" /> 689 <div style="width: 100%;" class="input-group input-group-lg"> 690 <span class="input-group-btn"> 691 692 693 694 <button style="width: 100%;" class="btn btn-add-to-cart" id="dataLayer" role="button" type="submit"> 695 <span class="product-added-text">@Translate("Add to cart")</span> <i class="fa fa-shopping-basket"></i> 696 </button> 697 </span> 698 </div> 699 </form>} 700 </div> 701 702 703 </div> 704 </div> 705 706 } 707 </div> 708 709 @if (productlistTemp != null) 710 { 711 <script append="true"> 712 require(["jquery", "slick"], function ($, log) { 713 $(function () { 714 $('#slide-products').slick({ 715 slidesToShow: 1, 716 slidesToScroll: 1, 717 swipeToSlide: true, 718 infinite: false, 719 dots: false, 720 nextArrow: '<a href="javascript:void()" class="slick-next slick-arrow"><i class="fa fa-angle-right" aria-hidden="true"></a></a>', 721 prevArrow: '<a href="javascript:void()" class="slick-prev slick-arrow"><i class="fa fa-angle-left" aria-hidden="true"></a></a>', 722 responsive: [ 723 { 724 breakpoint: 1025, 725 settings: { 726 slidesToShow: 2 727 } 728 }, 729 { 730 breakpoint: 520, 731 settings: { 732 slidesToShow: 1 733 } 734 }] 735 }); 736 737 }); 738 }); 739 </script> 740 } 741 </div> 742 743 } 744 </div> 745 746 </div> 747 748 </div> 749 <!-- Mini-cart dropdown --> 750 751 </div> 752 <div class="row"> 753 <div class="col-xs-12"> 754 <div class="checkout-assurance-box clearfix"> 755 <div class="col-xs-4 col-md-4"><i class="fa fa-truck fa-flip-horizontal"></i><span><strong>@Translate("FRI FRAGT")</strong><br>@Translate("<br/>På alle ordrer")</span></div> 756 <div class="col-xs-4 col-md-4"><i class="fa fa-clock-o"></i><span><strong>@Translate("HURTIG LEVERING", "HURTIG LEVERING")</strong><br>@Translate("1-3 hverdage", "1-3 hverdage")</span></div> 757 <div class="col-xs-4 col-md-4"><a href="https://certifikat.emaerket.dk/goodskin.dk" class="e-maerket" title='@Translate("Se Goodskins E-mærke", "Se Goodskins E-mærke")' target="_blank"><img alt="Certificeret webshop" src="/Files/Templates/Designs/StandardWebshop/Images/e-maerket.png"></a><span><strong>@Translate("E-MÆRKET", "E-MÆRKET")</strong><br>@Translate("Certificeret webshop", "Certificeret webshop")</span></div> 758 </div> 759 </div> 760 </div> 761 </div> 762 </header> 763 764 765 766 <script append="true"> 767 768 $('#cart-information > a, .cart-dropdown-wrapper').mouseenter(function () { 769 if ($(window).width() >= 1025) { 770 $('.cart-dropdown-wrapper').show(); 771 $('.mini-cart-dropdown').addClass('active'); 772 $('.slick-slider').slick('refresh');} 773 774 775 }).mouseleave(function () { 776 if ($(window).width() >= 1007) { 777 $('.mini-cart-dropdown').removeClass('active'); 778 $('.cart-dropdown-wrapper').hide(); 779 } 780 781 782 }); 783 784 $('#cartClose').click(function() 785 { 786 787 $('.mini-cart-dropdown').removeClass('active'); 788 setTimeout(function() {$('.cart-dropdown-wrapper').hide();}, 400) 789 $('.backdrop').removeClass('active'); 790 }); 791 792 $('#cart-information > a').click(function () { 793 794 if ($(window).width() < 1025) { 795 $('.cart-dropdown-wrapper').show(); 796 setTimeout(function() {$('.mini-cart-dropdown').addClass('active');}, 400); 797 setTimeout(function() {$('.backdrop').addClass('active');}, 400); 798 setTimeout(function() {$('.slick-slider').slick('refresh');}, 400); 799 800 } 801 802 803 }); 804 805 806 807 </script> 808 @if(cartContext != null) 809 { 810 <script append="true"> 811 function UpdateQuantity(orderLineId, quantity) { 812 813 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantity; 814 815 $.ajax({ 816 type: "GET", 817 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 818 data: '', 819 async: false, 820 success: function (data) { 821 console.log($(data).find("#totalQuantity").html()) 822 } 823 }); 824 825 826 } 827 828 function AddQuantity(orderLineId) { 829 var quantityNew = parseInt(document.querySelector("#" + orderLineId.id).value); 830 quantityNew = quantityNew + 1; 831 document.querySelector("#" + orderLineId.id).value = quantityNew; 832 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantityNew; 833 $.ajax({ 834 type: "GET", 835 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 836 data: '', 837 async: false, 838 success: function (data) { 839 840 } 841 }); 842 location.reload(); 843 } 844 function RemoveQuantity(orderLineId) { 845 var quantityNew = parseInt(document.querySelector("#" + orderLineId.id).value); 846 quantityNew = quantityNew - 1; 847 document.querySelector("#" + orderLineId.id).value = quantityNew; 848 parameter = '&QuantityOrderLine' + orderLineId.id + '=' + quantityNew; 849 $.ajax({ 850 type: "GET", 851 url: "@cartFriendlyUrl?OrderContext=@(cartContext.OrderContextId)&CartCmd=UpdateOrderlines" + parameter +'&redirect=false', 852 data: '', 853 async: false, 854 success: function (data) { 855 856 } 857 }); 858 location.reload(); 859 } 860 </script> 861 } 862 863 864 865 @using Dynamicweb.Ecommerce.Products 866 @using Dynamicweb.Frontend 867 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 868 869 @Title("Standad Page") 870 @Description("Page Template") 871 872 @{ 873 var image = Model.Item.GetFile("PageImage"); 874 var ImageHeight = Model.Item.GetValue<ListViewModel>("ImageHeight").SelectedValue; 875 var PageText = Model.Item.GetString("Text"); 876 var PageType = Model.Item.GetValue<ListViewModel>("PageType").SelectedValue; 877 // If Password is enabled on page PageType is empty so set it to default 878 if (string.IsNullOrEmpty(PageType)) 879 { 880 PageType = "default"; 881 } 882 883 var ecomquery = System.Web.HttpContext.Current.Request.QueryString["ecomQuery"]; 884 var prodid = System.Web.HttpContext.Current.Request.QueryString["productid"]; 885 var groupid = System.Web.HttpContext.Current.Request.QueryString["groupid"]; 886 } 887 @if (!Pageview.IsCurrentUserAllowed && !Pageview.Security.UserLoggedIn) 888 { 889 <main data-page-type="protected"> 890 <div class="container"> 891 <h1 class="title-styled" data-align="center"> 892 @Model.Area.Item.GetString("RestrictedTitle") 893 </h1> 894 <div class="row-flex"> 895 @if (!String.IsNullOrEmpty(Model.Area.Item.GetString("NewUserText"))) 896 { 897 <div class="col-xs-12 col-sm-6 col-md-5 col-md-offset-1" data-display="flex"> 898 <div data-align="left" data-content-border="boxed" data-content-type="box"> 899 @Model.Area.Item.GetString("LoginText") 900 @using NORRIQ.Common8.Razor; 901 @{ 902 var ResetPassword = "/kundeservice/glemt-adgangskode"; 903 } 904 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 905 <div class="form-group"> 906 <label for="Username">@Translate("Username")</label> 907 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 908 </div> 909 <div class="form-group"> 910 <label for="Password">@Translate("Password")</label> 911 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 912 </div> 913 <div id="loginFeedback"></div> 914 915 <a href="@ResetPassword" class="forgot-password">@Translate("Forgot password")</a> 916 917 <button type="submit" role="button" class="btn btn-primary" id="loginBtn" data-float="right"> 918 @Translate("Sign in") 919 </button> 920 </form> 921 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 922 @Translate("Sign in") 923 </script> 924 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 925 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 926 </script> 927 <script id="loginLoadingTemplate" type="text/x-jsrender"> 928 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 929 </script> 930 <script id="loginErrorTemplate" type="text/x-jsrender"> 931 <p class="user-login-error">@Translate("An error occured!")</p> 932 </script> 933 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 934 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 935 </script> 936 </div> 937 </div> 938 <div class="col-xs-12 col-sm-6 col-md-5" data-display="flex"> 939 <div data-align="left" data-content-border="boxed" data-content-type="box"> 940 @Model.Area.Item.GetString("NewUserText") 941 </div> 942 </div> 943 } 944 else 945 { 946 <div class="col-xs-12 col-sm-6 col-sm-offset-3 col-md-4 col-md-offset-4" data-display="flex"> 947 <div data-align="left" data-content-border="boxed" data-content-type="box"> 948 @Model.Area.Item.GetString("LoginText") 949 @using NORRIQ.Common8.Razor; 950 @{ 951 var ResetPassword = "/kundeservice/glemt-adgangskode"; 952 } 953 <form name="ExtUserForm" id="loginForm" method="post" class="form" role="form" action="@(System.Web.HttpContext.Current.Request.Url.PathAndQuery)"> 954 <div class="form-group"> 955 <label for="Username">@Translate("Username")</label> 956 <input id="Username" name="Username" type="text" value="" class="form-control" autocomplete="off"> 957 </div> 958 <div class="form-group"> 959 <label for="Password">@Translate("Password")</label> 960 <input id="Password" name="Password" type="password" value="" class="form-control" autocomplete="off"> 961 </div> 962 <div id="loginFeedback"></div> 963 964 <a href="@ResetPassword" class="forgot-password">@Translate("Forgot password")</a> 965 966 <button type="submit" role="button" class="btn btn-primary" id="loginBtn" data-float="right"> 967 @Translate("Sign in") 968 </button> 969 </form> 970 <script id="loginBtnDefaultTemplate" type="text/x-jsrender"> 971 @Translate("Sign in") 972 </script> 973 <script id="loginBtnLoggingInTemplate" type="text/x-jsrender"> 974 <i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in") 975 </script> 976 <script id="loginLoadingTemplate" type="text/x-jsrender"> 977 <p class="user-login-loading"><i class="icon-async icon-pulse" aria-hidden="true"></i> @Translate("Signing in")</p> 978 </script> 979 <script id="loginErrorTemplate" type="text/x-jsrender"> 980 <p class="user-login-error">@Translate("An error occured!")</p> 981 </script> 982 <script id="loginBadLoginInfoTemplate" type="text/x-jsrender"> 983 <p class="user-login-error">@Translate("Username or password is incorrect!")</p> 984 </script> 985 </div> 986 </div> 987 } 988 </div> 989 </div> 990 </main> 991 } 992 else 993 { 994 if (image != null) 995 { 996 <div class="pageimage" style="background-image:url(@image.Path);"></div> 997 } 998 @RenderBreadcrumb() 999 <main class="page-content" data-page-type="@PageType"> 1000 @if (PageType == "default") 1001 { 1002 <div class="container"> 1003 <div class="row-flex"> 1004 <div class="col-xs-12 col-sm-12 col-md-3" data-content="sidebar" id="sidebar"> 1005 @RenderNavigation() 1006 @RenderSidebar() 1007 </div> 1008 <div class="col-xs-12 col-sm-12 col-md-9 pull-right"> 1009 @RenderHeader() 1010 @RenderPageText() 1011 @RenderPrimary() 1012 @RenderSecondary() 1013 @RenderTertiary() 1014 </div> 1015 </div> 1016 </div> 1017 } 1018 else if (PageType == "ecom") 1019 { 1020 <div class="container"> 1021 @RenderPageText() 1022 @RenderPrimary() 1023 @RenderSecondary() 1024 @RenderTertiary() 1025 @RenderSidebar() 1026 </div> 1027 } 1028 else if (PageType == "boxed" || PageType == "cart" || PageType == "frontpage") 1029 { 1030 <div class="container"> 1031 @RenderHeader() 1032 @RenderPageText() 1033 @RenderPrimary() 1034 @RenderSecondary() 1035 @RenderTertiary() 1036 @RenderSidebar() 1037 </div> 1038 } 1039 </main> 1040 } 1041 1042 1043 @* Default content for pages *@ 1044 @helper RenderPrimary() 1045 { 1046 if (!String.IsNullOrEmpty(Model.Placeholder("Primary"))) 1047 { 1048 <div class="row-flex"> 1049 @Model.Placeholder("Primary", "Content", "unwrap:true;default:true") 1050 </div> 1051 } 1052 } 1053 @helper RenderSecondary() 1054 { 1055 if (!String.IsNullOrEmpty(Model.Placeholder("Secondary"))) 1056 { 1057 <div class="row-flex"> 1058 @Model.Placeholder("Secondary", "Content", "unwrap:true") 1059 </div> 1060 } 1061 } 1062 @helper RenderTertiary() 1063 { 1064 if (!String.IsNullOrEmpty(Model.Placeholder("Tertiary"))) 1065 { 1066 <div class="row-flex"> 1067 @Model.Placeholder("Tertiary", "Content", "unwrap:true") 1068 </div> 1069 } 1070 } 1071 @helper RenderSidebar() 1072 { 1073 if (!String.IsNullOrEmpty(Model.Placeholder("Sidebar"))) 1074 { 1075 <div class="row-flex"> 1076 @Model.Placeholder("Sidebar", "Sidebar", "unwrap:true") 1077 </div> 1078 } 1079 } 1080 @helper RenderNavigation() 1081 { 1082 <nav id="desktop-menu"> 1083 @RenderNavigation(new { Template = "nav-sidebar.xslt", Expandmode = "all", StartLevel = 1, EndLevel = 4 }) 1084 </nav> 1085 } 1086 @helper RenderBreadcrumb() 1087 { 1088 // Model.PropertyItem may sometimes be null, thus we must check for it. 1089 if (Model.PropertyItem != null) 1090 { 1091 if (!Model.PropertyItem.GetBoolean("HideBreadcrumb")) 1092 { 1093 <nav class="clearfix breadcrumb-container"> 1094 <div class="container"> 1095 1096 <ol class="breadcrumb"> 1097 @RenderNavigation(new {Template = "breadcrumb.xslt", StartLevel = 1, EndLevel = 3}) 1098 @{ 1099 var productId = System.Web.HttpContext.Current.Request.QueryString["ProductID"]; 1100 } 1101 @*@if (productId != null) 1102 { 1103 var product = Product.GetProductById(productId); 1104 if (product != null) 1105 { 1106 <li><span class="disabled">@(product.Name)</span></li> 1107 } 1108 }*@ 1109 </ol> 1110 1111 </div> 1112 </nav> 1113 } 1114 } 1115 } 1116 @helper RenderHeader() 1117 { 1118 if (Model.Item.GetValue<ListViewModel>("TitleStyle").SelectedValue != "hidden") 1119 { 1120 var TitleStyle = Model.Item.GetValue<ListViewModel>("TitleStyle").SelectedValue; 1121 <header> 1122 <h1 class="@TitleStyle"> 1123 @Model.Item.GetString("Title") 1124 </h1> 1125 </header> 1126 } 1127 } 1128 1129 @helper RenderPageText() 1130 { 1131 if (!String.IsNullOrEmpty(Model.Item.GetString("Text"))) 1132 { 1133 <div class="pagetext"> 1134 @Model.Item.GetString("Text") 1135 if (!String.IsNullOrEmpty(Model.Item.GetString("Link")) && !String.IsNullOrEmpty(Model.Item.GetString("LinkText"))) 1136 { 1137 <p> 1138 <a class="btn btn-primary" href="@Model.Item.GetString("Link")"> 1139 @Model.Item.GetString("LinkText") 1140 </a> 1141 </p> 1142 } 1143 <hr /> 1144 </div> 1145 } 1146 } 1147 1148 @RenderItemList(new 1149 { 1150 ItemType = "Footer", 1151 ListSourceType = "SelfArea", 1152 ItemFieldsList = "*", 1153 IncludeParagraphItems = true, 1154 IncludeAllChildItems = true, 1155 ListOrderBy = "Sort", 1156 ListTemplate = "ItemPublisher/List/Footer.cshtml", 1157 ListPageSize = "100", 1158 }) 1159 1160 <script append="true"> 1161 require(['standardwebshop/areas/user/login'], function (AsyncLogin) { 1162 var login = new AsyncLogin({ 1163 $loginForm: $("#loginForm"), 1164 $username: $("#Username"), 1165 $password: $("#Password") 1166 }); 1167 login.init(); 1168 1169 }); 1170 @if(!Dynamicweb.Environment.CookieManager.CookieOptInLevelExists){ 1171 <text> 1172 var cookieText = "@Model.Area.Item.GetString("CookieText").Replace("\"", "'").Replace(Environment.NewLine,"")"; 1173 </text> 1174 } 1175 </script> 1176 1177 @if (!true) 1178 { 1179 <script src="/scripts/require.js"></script> 1180 @StandardWebshop.CustomCode.Razor.TimestampSource.GetJavaScriptWithTimestamp("/scripts/standardwebshop/main.js") 1181 } 1182 else 1183 { 1184 @StandardWebshop.CustomCode.Razor.TimestampSource.GetJavaScriptWithTimestamp("/scripts/standardwebshop/main.min.js") 1185 } 1186 <script> 1187 //Loads master along with the localized validation messages (read from the template tag "lang"). 1188 1189 @* Loading the datepicker localizations via the aliasses in main.js failed and caused them to be loaded from the original files instead of from the minified file. *@ 1190 require(['jQueryUI.localization/jquery.ui.datepicker-en-GB', 'jQueryUI.localization/jquery.ui.datepicker-da'], function () { }); 1191 require(['standardwebshop/areas/master'], function (master) { master.init(); }); 1192 1193 @* Fool the minifier to include all validation localizations, but only trigger the one actually needed. *@ 1194 require([], 1195 function () { 1196 @if (String.Equals(Pageview.Area.Culture.Split('-').First(), "da", StringComparison.OrdinalIgnoreCase)) 1197 { 1198 <text> 1199 require(["jquery.validation-1.13.1/localization/messages_da"], function () { }); 1200 require(["additional-methods.min"], function () { }); 1201 </text> 1202 } else if (String.Equals(Pageview.Area.Culture.Split('-').First(), "en", StringComparison.OrdinalIgnoreCase)) 1203 { 1204 <text> 1205 require(["jquery.validation-1.13.1/localization/messages_en"], function () { }); 1206 require(["additional-methods.min"], function () { }); 1207 </text> 1208 } 1209 }); 1210 </script> 1211 1212 <script> 1213 1214 function setCookie(cname, cvalue, exdays) { 1215 const d = new Date(); 1216 d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); 1217 let expires = "expires=" + d.toUTCString(); 1218 document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 1219 } 1220 1221 const queryString = window.location.search; 1222 const urlParams = new URLSearchParams(queryString.toLowerCase()); 1223 const paid = urlParams.get('paid'); 1224 const pacid = urlParams.get('pacid'); 1225 1226 if (urlParams.has('paid') && urlParams.has('pacid')) { 1227 // Set the cookies here 1228 setCookie('PAID', paid, 40); 1229 setCookie('PACID', pacid, 40); 1230 } 1231 1232 </script> 1233 1234 <script append="replace"></script> 1235 @*@if (!String.IsNullOrEmpty(Model.Area.Item.GetString("Google"))) 1236 { 1237 <script> 1238 (function (i, s, o, g, r, a, m) { 1239 i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { 1240 (i[r].q = i[r].q || []).push(arguments) 1241 }, i[r].l = 1 * new Date(); a = s.createElement(o), 1242 m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) 1243 })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 1244 1245 ga('create', '@Model.Area.Item.GetString("Google")', 'auto'); 1246 ga('send', 'pageview'); 1247 </script> 1248 }*@ 1249 <div class="modal fade" tabindex="-1" role="dialog" id="languages"> 1250 <div class="modal-dialog modal-sm" role="document"> 1251 <div class="modal-content"> 1252 <div class="modal-header"> 1253 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 1254 <h4 class="modal-title">@Translate("Change language", "Change language")</h4> 1255 </div> 1256 <div class="modal-body"> 1257 @if (Model.Languages.Any()) 1258 { 1259 var areaService = NLWI.Core.Factory.ObjectFactory.GetInstance<Dynamicweb.Content.AreaService>(); 1260 1261 foreach (var lang in Model.Languages) 1262 { 1263 var area = areaService.GetArea(lang.ID); 1264 var Domain = lang.PrimaryDomain; 1265 if (string.IsNullOrEmpty(Domain)) 1266 { 1267 Domain = area.Domain.Split(new char[0]).First(); 1268 } 1269 1270 var Flag = "flag_" + lang.Culture.Split('-').Last() + ".png"; 1271 1272 <a href='//@Domain'> 1273 <img src="/Admin/Images/Flags/@Flag" alt="@lang.Culture.Split('-').Last()-Flag" class="img-responsive lang-select" /> 1274 </a> 1275 } 1276 } 1277 </div> 1278 </div> 1279 </div> 1280 </div> 1281 1282 </body> 1283 </html> 1284