Error executing template "Designs/Swift-v2/DealerList.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_ef34dbe8c0b845aaa779dd1cdf6977c6.ExecuteAsync()
at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, 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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2
3 @using Dynamicweb
4 @using Dynamicweb.Core.Encoders
5 @using System.Globalization
6 @using Dynamicweb.Ecommerce.Products
7 @using Dynamicweb.Ecommerce.ProductCatalog
8 @using System.Text.RegularExpressions
9
10 @using FlexMedia.Plastmo.Integration.Frontend.Models
11
12
13
14 @functions {
15
16 @*
17 string? DoubleToString(double? value)
18 {
19 if (value.HasValue)
20 {
21 return value.Value.ToString(CultureInfo.InvariantCulture);
22 }
23 return null;
24 }
25 *@
26
27 // to replace the product tags in Dealer links
28 string RelpaceProductTags(string value, string quantity, string count , ProductViewModel product)
29 {
30 string outvalue = value
31 .Replace("[ProductID]",product.Id)
32 .Replace("[ProductNumber]",product.Number)
33 .Replace("[ProductDB]",product.ProductFields["TUN"].Value.ToString())
34 .Replace("[ProductVVS]",product.ProductFields["VVS_nummer"].Value.ToString())
35 .Replace("[ProductBM]",product.ProductFields["bygmavno"].Value.ToString())
36 .Replace("[ProductEAN]",product.EAN)
37 .Replace("[VariantID]",product.VariantId)
38 .Replace("[ProductName]",product.Name)
39 // .Replace("[ProductQuantity]","{ProductQuantity}")
40 .Replace("[ProductQuantity]",quantity)
41 .Replace("[ProductCNT]",count);
42 // .Replace("[ProductCNT]","{ProductCNT}");
43
44 // int cnt = 0;
45 // string outvalue = Regex.Replace(revalue, "{ProductCNT}", m => (cnt++).ToString());
46
47 return outvalue;
48 }
49
50 }
51
52
53
54 @{
55
56
57
58
59 @* for custom link to dealers from json file *@
60 @*
61 bool hasDealer = false;
62 bool hasPlastmoDealer = false;
63 bool singleDealer = false;
64 List<string> DealersIDs = new();
65
66 if(!Pageview.IsVisualEditorMode){
67 string fieldName = "Dealers";
68 var fieldOptions = Dynamicweb.Ecommerce.Services.FieldOptions.GetOptionsByFieldId(fieldName);
69 bool fieldExist = product.ProductFields.TryGetValue(fieldName, out FieldValueViewModel field);
70 if (fieldExist && field?.Value != null){
71 List<FieldOptionValueViewModel> options = field?.Value as List<FieldOptionValueViewModel>;
72 DealersIDs = options.Select(o => o.Value).ToList();
73 }
74 }
75
76 var DealerList = FlexMedia.Plastmo.Integration.Frontend.DealersHelper.GetDealers(DealersIDs,true);
77 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = true)
78 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = false)
79
80 int cntLinks = 0;
81 string firstDealerWithLink = "";
82 int DealerCnt = DealerList.Count();
83 foreach (var dealer in DealerList){
84 if((!string.IsNullOrEmpty(dealer.DealerAddtoCartLink) || !string.IsNullOrEmpty(dealer.DealerProductLink))&&dealer.DealerIsPlastmo!="True"){
85 cntLinks++;firstDealerWithLink = dealer.DealerID;
86 }
87 if(dealer.DealerIsPlastmo=="True"){hasPlastmoDealer=true;}
88 }
89
90 if(DealerCnt>=1 && (cntLinks>=1)){hasDealer=true;}
91 if(DealerCnt==1 || (cntLinks==1)){singleDealer=true;}
92
93 // shuffle
94 var shuffle = Enumerable.Range(1, DealerCnt).ToList();
95 if(DealerCnt>=2){
96 Random rnd = new Random();
97 foreach (int num in shuffle){
98 int n = rnd.Next(DealerCnt);
99 var a = DealerList[num-1];
100 var b = DealerList[n];
101 DealerList[num-1] = b;
102 DealerList[n] = a;
103 }
104 <small style="display:none;" t="shuffel">hasDealer:@hasDealer</small>
105 }
106
107 *@
108
109 }
110
111
112 @{
113 string CurrentLang = Dynamicweb.Ecommerce.Common.Context.LanguageID;
114
115 // var test = Dynamicweb.Ecommerce.Shops.ShopService.GetDefaultShop();
116
117 var PVMsettings = new ProductViewModelSettings(
118 Dynamicweb.Ecommerce.Common.Context.LanguageID,
119 Dynamicweb.Ecommerce.Common.Context.Currency.Code,
120 Dynamicweb.Ecommerce.Common.Context.Country.Code2,
121 Dynamicweb.Ecommerce.Common.Context.Cart?.ShopId
122 );
123
124
125 var productsRaw = Dynamicweb.Context.Current.Request.QueryString["prod"];
126 var products = productsRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList();
127 // var productpairs = products.Chunk(2);
128 // ?prod=275110331,2,275110301,3
129
130
131
132
133 var productIdsRaw = Dynamicweb.Context.Current.Request.QueryString["products"];
134 var productIds = productIdsRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList();
135
136 var productQuantitiesRaw = Dynamicweb.Context.Current.Request.QueryString["quantity"];
137 var productQuantities = productQuantitiesRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList();
138
139 // ?products=275110331,275110301&quantity=2,3
140
141 var productService = new ProductService();
142
143 // var products = productIds.Select(id => productService.GetProductById(id,"", CurrentLang)).Where(p => p != null).ToList();
144
145
146
147 var productPair = new List<(Product Product, int Quantity)>();
148
149 for (int i = 0; i < productIds.Count; i++){
150 var id = productIds[i];
151 // fallback if quantities list is shorter
152 var qty = (productQuantities != null && i < productQuantities.Count && int.TryParse(productQuantities[i], out int q))? q : 1;
153 var product = productService.GetProductById(id, "", CurrentLang);
154 if (product != null){
155
156 // var viewModel = Dynamicweb.Ecommerce.ProductCatalog.ProductViewModelFactory.Create(product);
157 // productPair.Add((viewModel, qty));
158 productPair.Add((product, qty));
159
160 }
161 }
162
163
164
165
166
167
168
169 if (productPair != null){
170
171
172
173 bool hasDealer = false;
174 bool hasPlastmoDealer = false;
175 bool singleDealer = false;
176
177 List<string> DealersIDs = null;
178
179 foreach (var item in productPair){
180 var product = item.Product;
181
182 var DealersIDsRaw = product.ProductFieldValues.GetProductFieldValue("Dealers").Value.ToString();
183 var values = DealersIDsRaw?.Split(',').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToList();
184 // if (values == null || !values.Any()){continue;}
185 // if (values == null){continue;}
186 if (DealersIDs == null){DealersIDs = values;}else{DealersIDs = DealersIDs.Intersect(values).ToList();}
187 }
188
189 DealersIDs = DealersIDs ?? new List<string>();
190
191
192
193 if (DealersIDs.Any() && 1==2){
194 <ul>
195 @foreach (var DealerID in DealersIDs){
196 <li>@DealerID</li>
197 }
198 </ul>
199 }
200
201 var DealerList = FlexMedia.Plastmo.Integration.Frontend.DealersHelper.GetDealers(DealersIDs,false);
202 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = true)
203 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = false)
204
205 int cntLinks = 0;
206 string firstDealerWithLink = "";
207 int DealerCnt = DealerList.Count();
208 foreach (var dealer in DealerList){
209 if((!string.IsNullOrEmpty(dealer.DealerAddtoCartLink) || !string.IsNullOrEmpty(dealer.DealerProductLink))&&dealer.DealerIsPlastmo!="True"){
210 cntLinks++;firstDealerWithLink = dealer.DealerID;
211 }
212 if(dealer.DealerIsPlastmo=="True"){hasPlastmoDealer=true;}
213 }
214
215 if(DealerCnt>=1 && (cntLinks>=1)){hasDealer=true;}
216 if(DealerCnt==1 || (cntLinks==1)){singleDealer=true;}
217
218 // shuffle
219 var shuffle = Enumerable.Range(1, DealerCnt).ToList();
220 if(DealerCnt>=2){
221 Random rnd = new Random();
222 foreach (int num in shuffle){
223 int n = rnd.Next(DealerCnt);
224 var a = DealerList[num-1];
225 var b = DealerList[n];
226 DealerList[num-1] = b;
227 DealerList[n] = a;
228 }
229 }
230
231 <small style="display:none;" t="shuffel">
232
233 DealerCnt:@DealerCnt<br>
234 hasDealer:@hasDealer<br>
235 hasPlastmoDealer:@hasPlastmoDealer<br>
236 singleDealer:@singleDealer<br>
237 </small>
238
239
240
241
242
243 @*
244 if (DealerList.Any()){
245
246 foreach (var dealer in DealerList){
247
248 <br><small style="_display:none;">
249 dealer.DealerDomain:@dealer.DealerDomain<br>
250 dealer.DealerCollectionLink:@dealer.DealerCollectionLink<br>
251 dealer.DealerProductLink:@dealer.DealerProductLink<br>
252 AddTocartisFormLink:@AddTocartisFormLink<br>
253 </small>
254
255 }
256 }
257 *@
258
259 @*<hr>*@
260
261 if(!Pageview.IsVisualEditorMode && hasDealer){
262
263 <div class="title mb-3 btn btn-outline-primary theme" data-dw-button="primary" onclick="offCanvasDealerList();">@Translate("buy at dealer","Køb hos en forhandler")</div>
264 <script>
265 function offCanvasDealerList(){
266 var d=document.getElementById("DealerOffcanvas");
267 if(d.classList.contains("show")){
268 d.classList.remove("show");document.body.getElementsByClassName("offcanvas-backdrop")[0].remove();
269 }else{
270 var e=document.createElement('div');e.className="offcanvas-backdrop fade show";e.onclick=function (){offCanvasDealerList();};document.body.appendChild(e);d.classList.add("show");
271 }
272 }
273 </script>
274
275
276 <style>
277
278 div#DealerOffcanvas{
279 /*background-color:#cfc;*/
280 }
281
282 div#DealerOffcanvas figure{
283 border:solid 1px #415f77;
284 border-radius:50%;
285 /*padding:.7em;*/
286 margin:-.9em -.4em -.9em -1.2em !important;
287
288 display: flex;
289 align-items: center;
290 justify-content: center;
291 width:100px;
292 height:100px;
293 overflow:hidden;
294 }
295
296 div#DealerOffcanvas figure a{
297 /*margin:auto;*/
298
299 display: flex;
300 align-items: center;
301 justify-content: center;
302
303 width: 100%;
304 height: 100%;
305 }
306 div#DealerOffcanvas figure a img{
307 /* width:70px;*/
308 max-width: 100%;
309 max-height: 100%;
310 /* object-fit: contain;*/
311 transform: scale(0.707);
312 transition: transform .2s;
313 }
314 div#DealerOffcanvas figure a:hover img{
315 transform: scale(0.85);
316 }
317 </style>
318
319 <div class="offcanvas offcanvas-end overflow-y-auto" tabindex="-1" data-dw-colorscheme="lightgrey1" id="DealerOffcanvas" style="visibility: visible;" aria-modal="true" role="dialog">
320
321 <div class="modal-header sticky-top py-1 py-lg-3 ps-lg-4 pe-0 pe-lg-3" data-dw-colorscheme="light" style="box-shadow: 0 10px 10px -12px var(--bs-gray-300);">
322 <span class="h5 m-0 flex-fill">@Translate("Select your dealer","Vælg din forhandler")</span>
323
324 <button type="button" class="btn btn-sm p-2 d-flex align-items-center justify-content-bottom" data-bs-dismiss="offcanvas" aria-label="Close" id="CloseDealerOffcanvas" onclick="offCanvasDealerList();">
325 <span>Luk</span>
326 <span class="icon-4 mb-1">
327 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
328 </span>
329 </button>
330 </div>
331
332 <div class="dealerlist p-2 p-lg-3 h-100;">
333
334 @foreach (var dealer in DealerList){
335
336
337
338 bool AddTocartisFormLink = false;
339 if(dealer.DealerAddtoCartLink.Contains("<form")){AddTocartisFormLink = true;}
340
341 bool DealerIsPlastmo = dealer.DealerIsPlastmo=="True" ? true : false;
342 bool hasAddTocartLink = !string.IsNullOrEmpty(dealer.DealerAddtoCartLink) ? true : false;
343 bool hasMultiAddTocartLink = !string.IsNullOrEmpty(dealer.DealerAddMultiToCartLoop) ? true : false;
344 bool hasProdLink = !string.IsNullOrEmpty(dealer.DealerProductLink) ? true : false;
345 bool hasLogo = !string.IsNullOrEmpty(dealer.DealerLogo) ? true : false;
346
347
348 <small style="display:none;"><hr>
349 @dealer.DealerID<br>
350 @dealer.DealerName<br>
351 @dealer.DealerCountry<br>
352 @dealer.DealerIsPlastmo<br>
353 @dealer.DealerLogo<br>
354 @dealer.DealerEmail<br>
355 @dealer.DealerPhone<br>
356 @dealer.DealerDomain<br>
357 @dealer.DealerCollectionLink<br>
358 @dealer.DealerProductLink<br>
359 @dealer.DealerAddtoCartLink<br>
360 @dealer.DealerAddMultiToCartLink<br>
361 @dealer.DealerAddMultiToCartLoop<br>
362 <hr></small>
363
364 // string FullMultiLink = null;
365 string AddMultiToCartLoop = "";
366 int multicnt = 0;
367 foreach (var item in productPair){
368 var Product = item.Product;
369 var Quantity = item.Quantity;
370 // ProductViewModel product = item.Product;
371 // var AddMultiToCartLoop = RelpaceProductTags(dealer.DealerAddMultiToCartLoop,Product);
372
373 var productVM = ViewModelFactory.CreateView(PVMsettings,Product.Id);
374 AddMultiToCartLoop += RelpaceProductTags(dealer.DealerAddMultiToCartLoop,Quantity.ToString(),multicnt.ToString(),productVM);
375
376 multicnt++;
377 // var productViewModelFactory = Dynamicweb.Core.ServiceLocator.Current.GetInstance<IProductViewModelFactory>();
378 // ProductViewModel productVM = productViewModelFactory.Create(Product, true);
379
380 //ProductViewModel productVM = ViewModelFactory.CreateProductViewModel(Product);
381
382
383 // <p>@Product.Id @Quantity</p>
384
385
386 }
387
388 string MultiLink = dealer.DealerAddMultiToCartLink + AddMultiToCartLoop;
389
390 @* <p>@MultiLink</p>*@
391
392 if((hasAddTocartLink || hasProdLink) && !DealerIsPlastmo){
393
394
395 <small style="display:none;">
396 dealer.DealerDomain:@dealer.DealerDomain<br>
397 @* dealer.DealerCollectionLink:@dealer.DealerCollectionLink<br>*@
398 dealer.DealerProductLink:@dealer.DealerProductLink<br>
399 AddTocartisFormLink:@AddTocartisFormLink<br>
400 </small>
401
402
403 <div class="my-2 py-1 py-lg-3 ps-lg-4 pe-0 pe-lg-3" data-dw-colorscheme="light" did="@dealer.DealerID" dn="@dealer.DealerName" dc="@dealer.DealerCountry" dip="@dealer.DealerIsPlastmo" dcl="dealer.DealerCollectionLink">
404 <div data-swift-container="" class="d-flex m-0 py-2" data-dw-container-width="2">
405
406
407
408 @if(hasLogo){
409 <figure class="m-0" data-swift-gridcolumn="">
410 <a href="@dealer.DealerDomain" title="@dealer.DealerName" target="_blank" rel="noopener"><img src="@dealer.DealerLogo" alt="@dealer.DealerName" style="width:75px"></a>
411 </figure>
412 }
413
414 <div class="m-0 align-items-right flex-fill">
415 <div class="h6 m-0 mb-2 align-items-left justify-content-top" data-swift-gridcolumn=""><strong>@dealer.DealerName</strong></div>
416
417 <div class="m-0 align-items-right justify-content-bottom d-flex" data-dw-container-width="2">
418 @if(hasProdLink){
419 // string prodLink = RelpaceProductTags(dealer.DealerProductLink,product);
420 // <a href="@prodLink" target="_blank" rel="noopener" class="btn btn-secondary flex-fill" data-dw-button="secondary">@Translate("See product","Se produktet")</a>
421 }
422 @if(hasAddTocartLink && !AddTocartisFormLink){
423 // string AddTocartLink = RelpaceProductTags(dealer.DealerAddtoCartLink,product);
424 // <a href="@AddTocartLink" target="_blank" rel="noopener" class="btn btn-primary align-items-right ms-2" data-dw-button="primary">@Translate("Add to cart","Læg i kurv")</a>
425 }
426
427 @if(hasAddTocartLink && AddTocartisFormLink){
428 // string AddTocartLink = RelpaceProductTags(dealer.DealerAddtoCartLink,product);
429 // string formbutton = "<button type='submit' class='btn btn-primary align-items-right ms-2' data-dw-button='primary'>Læg i kurv</button></form>";
430 // @AddTocartLink.Replace("</form>",formbutton)
431 }
432 @if(hasMultiAddTocartLink && !AddTocartisFormLink){
433 <a href="@MultiLink" target="_blank" rel="noopener" class="btn btn-primary align-items-right ms-2" data-dw-button="primary">@Translate("Add to cart","Læg i kurv")</a>
434
435
436 }
437
438
439
440
441 @{
442 // string AddMultiToCartLoop = RelpaceProductTags(dealer.DealerAddMultiToCartLoop,productViewModel2);
443 }
444
445 </div>
446 </div>
447
448 </div>
449 </div>
450 }
451 }
452
453
454
455 </div>
456 </div>
457
458
459
460
461
462
463
464
465
466
467 }
468 }
469 }
470
471
472
473
474
475
476 @*
477 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275140301,275112341,275144301
478 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275140301,275112341,275144301,275110301
479 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275110301
480
481
482 plastmo + dealer
483 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275112341,275110301
484
485 single + plastmo
486 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275112341,275110301,275110330
487
488 *@
489