Error executing template "Designs/Swift/Paragraph/Swift_RelatedProducts.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at Dynamicweb.Ecommerce.ProductCatalog.ViewEngine.<>c__DisplayClass6_0.<GetRelatedGroups>b__1(IGrouping`2 group)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at CompiledRazorTemplates.Dynamic.RazorEngine_83bbf888a85244a2bc15f79212ad091b.Execute() in D:\dynamicweb.net\Solutions\smartpage\vmelektro.cloud.dynamicweb-cms.com\Files\Templates\Designs\Swift\Paragraph\Swift_RelatedProducts.cshtml:line 173
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 Dynamicweb.Core
3 @using Dynamicweb.Ecommerce.ProductCatalog
4
5 @{
6 bool productViewModelFound = false;
7 ProductViewModel product = new ProductViewModel();
8
9 ProductViewModelSettings productSetting = new ProductViewModelSettings
10 {
11 LanguageId = Dynamicweb.Ecommerce.Common.Context.LanguageID,
12 CurrencyCode = Dynamicweb.Ecommerce.Common.Context.Currency.Code,
13 CountryCode = Dynamicweb.Ecommerce.Common.Context.Country.Code2,
14 ShopId = Pageview.Area.EcomShopId
15 };
16
17 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails"))
18 {
19 productViewModelFound = true;
20 product = (ProductViewModel)Dynamicweb.Context.Current.Items["ProductDetails"];
21 }
22 if (Pageview.IsVisualEditorMode && !productViewModelFound)
23 {
24 if (Pageview.Item["DummyProduct"] != null)
25 {
26 productViewModelFound = true;
27 string dummyProductId = "";
28 var pageViewModel = Dynamicweb.Frontend.ContentViewModelFactory.CreatePageInfoViewModel(Pageview.Page);
29 ProductListViewModel productList = pageViewModel.Item.GetValue("DummyProduct") != null ? pageViewModel.Item.GetValue("DummyProduct") as ProductListViewModel : new ProductListViewModel();
30 if (productList.Products != null)
31 {
32 foreach (var p in productList.Products) { dummyProductId = p.Id; }
33 ProductViewModel dummyProduct = dummyProductId != "" ? ViewModelFactory.CreateView(productSetting, dummyProductId) : new ProductViewModel();
34 product = dummyProduct;
35 }
36 else
37 {
38 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id);
39 }
40 }
41 else if (Pageview.Item["DummyProduct"] == null)
42 {
43 productViewModelFound = true;
44 product = ViewModelFactory.CreateView(productSetting, Dynamicweb.Ecommerce.Services.Products.GetLastActiveProducts(1, Dynamicweb.Ecommerce.Common.Context.LanguageID, false).FirstOrDefault().Id);
45 }
46 }
47
48 string title = Model?.Item?.GetString("Title") != null ? Model.Item.GetString("Title") : Translate("Products");
49
50 string campaignValues = Model.Item.GetRawValueString("CampaignBadges", string.Empty);
51
52 //Styling
53 string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h3");
54 string subtitleFontSize = Model.Item.GetRawValueString("SubtitleFontSize", "fs-5");
55 string buttonStyle = Model.Item.GetRawValueString("ButtonStyle", "");
56 buttonStyle = buttonStyle == "primary" ? " btn-primary" : buttonStyle;
57 buttonStyle = buttonStyle == "secondary" ? " btn-secondary" : buttonStyle;
58 buttonStyle = buttonStyle == "link" ? " btn-link" : buttonStyle;
59 string maxWidth = Model.Item.GetRawValueString("TextReadability", "");
60 maxWidth = maxWidth == "max-width-on" ? " mw-75ch" : maxWidth;
61 maxWidth = maxWidth == "max-width-off" ? "" : maxWidth;
62
63 string generalTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("GeneralTheme")) ? " theme " + Model.Item.GetRawValueString("GeneralTheme").Replace(" ", "").Trim().ToLower() : "";
64 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : "";
65 string imageTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ImageTheme")) ? " theme " + Model.Item.GetRawValueString("ImageTheme").Replace(" ", "").Trim().ToLower() : "";
66
67 //Link generation
68 string pageId = Model.Item.GetLink("ProductSliderServicePage") != null ? Model.Item.GetLink("ProductSliderServicePage").PageId.ToString() : "";
69 string servicePageByNavigationTag = GetPageIdByNavigationTag("ProductSliderService") != 0 ? GetPageIdByNavigationTag("ProductSliderService").ToString() : "";
70 pageId = pageId == "" ? servicePageByNavigationTag : pageId;
71
72 string url = "/Default.aspx?ID=" + pageId;
73 if (!url.Contains("LayoutTemplate"))
74 {
75 url += url.Contains("?") ? "&LayoutTemplate=Designs/Swift/Swift_PageClean.cshtml" : "?LayoutTemplate=Designs/Swift/Swift_PageClean.cshtml";
76 }
77 if (Pageview.IsVisualEditorMode)
78 {
79 url += "&VisualEdit=True";
80 }
81
82 bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Ecommerce.DynamicwebLiveIntegration.TemplatesHelper.IsLazyLoadingForProductInfoEnabled;
83 if (isLazyLoadingForProductInfoEnabled)
84 {
85 url += "&getproductinfo=true";
86 }
87
88 //Source type
89 string sourceType = Model.Item.GetRawValueString("RelationType", "trending");
90 IList<string> relateFromGroupIds = new List<string> { };
91 IList<string> relateFromProductIds = new List<string> { };
92
93 //--- VARIANTS ---
94 ProductListViewModel productsToRelateToVariants = Model.Item.GetValue<ProductListViewModel>("ProductsToRelateToVariants");
95 if (productsToRelateToVariants != null && sourceType == "variants")
96 {
97 foreach (var productSelection in productsToRelateToVariants.Products)
98 {
99 relateFromProductIds.Add(productSelection.Id);
100 }
101 }
102
103 //--- MOST SOLD ---
104 IList<ProductGroupViewModel> groupsToRelateToMostSold = Model.Item.GetValue<IList<ProductGroupViewModel>>("GroupsToRelateToMostSold");
105 if (groupsToRelateToMostSold != null && sourceType == "most-sold")
106 {
107 foreach (var fromGroup in groupsToRelateToMostSold)
108 {
109 relateFromGroupIds.Add(fromGroup.Id);
110 }
111 }
112
113 //--- TRENDING ---
114 IList<ProductGroupViewModel> groupsToRelateToTrending = Model.Item.GetValue<IList<ProductGroupViewModel>>("GroupsToRelateToTrending");
115 if (groupsToRelateToTrending != null && sourceType == "trending")
116 {
117 foreach (var fromGroup in groupsToRelateToTrending)
118 {
119 relateFromGroupIds.Add(fromGroup.Id);
120 }
121 }
122
123 //--- LATEST ---
124 IList<ProductGroupViewModel> groupsToRelateToLatest = Model.Item.GetValue<IList<ProductGroupViewModel>>("GroupsToRelateToLatest");
125 if (groupsToRelateToLatest != null && sourceType == "latest")
126 {
127 foreach (var fromGroup in groupsToRelateToLatest)
128 {
129 relateFromGroupIds.Add(fromGroup.Id);
130 }
131 }
132
133 //--- FREQUENTLY BOUGHT ---
134 ProductListViewModel productsToRelateTo = Model.Item.GetValue<ProductListViewModel>("ProductsToRelateTo");
135 if (productsToRelateTo != null && sourceType == "frequently")
136 {
137 foreach (var fromProduct in productsToRelateTo.Products)
138 {
139 relateFromProductIds.Add(fromProduct.Id);
140 }
141 }
142
143 //--- SELECTED PRODUCTS ---
144 ProductListViewModel products = Model.Item.GetValue<ProductListViewModel>("Products");
145 if (products != null && sourceType == "selected")
146 {
147 foreach (var productSelection in products.Products)
148 {
149 relateFromProductIds.Add(productSelection.Id);
150 }
151 }
152
153 //--- RELATED PRODUCTS ---
154 if (sourceType == "related-products")
155 {
156 ProductListViewModel selectedRelationProduct = Model.Item.GetValue<ProductListViewModel>("ProductsToRelateTo2");
157 if (selectedRelationProduct?.Products != null)
158 {
159 if (selectedRelationProduct.Products.Count > 0)
160 {
161 int productCount = 0;
162 foreach (var selectedProduct in selectedRelationProduct.Products)
163 {
164 if (productCount == 0)
165 {
166 product = selectedProduct;
167 productCount++;
168 }
169 }
170 }
171 }
172
173 if (product?.RelatedGroups != null)
174 {
175 foreach (var group in product.RelatedGroups)
176 {
177 foreach (var relatedProduct in group.Products)
178 {
179 relateFromProductIds.Add(relatedProduct.ProductId);
180 }
181 }
182 }
183 }
184
185 //Create group id collection and products id collection strings
186 string groupIds = productViewModelFound ? product.PrimaryOrDefaultGroup.Id : string.Join(",", relateFromGroupIds);
187 string productIds = productViewModelFound && relateFromProductIds.Count == 0 ? product.Id : string.Join(",", relateFromProductIds);
188
189 //Set the parameters to the url
190 string linkParameters = "";
191 linkParameters += sourceType != "related-products" ? "&GroupId=" + groupIds : "";
192 linkParameters += !string.IsNullOrEmpty(productIds) ? "&MainProductId=" + productIds : "";
193 var productListPageId = GetPageIdByNavigationTag("Shop");
194 string link = "/Default.aspx?ID=" + productListPageId + linkParameters;
195
196 // Slider settings (documentation: swiffyslider.com/configuration)
197 string navigationStyle = $"{Model.Item.GetRawValueString("NavigationStyle", "slider-nav-round")}";
198 string navigationPlacement = $"{Model.Item.GetRawValueString("NavigationPlacement", "slider-nav-on-slides")}";
199 string indicatorStyle = $"{Model.Item.GetRawValueString("IndicatorStyle", "slider-indicators-hidden")}";
200 string revealSlides = Model.Item.GetRawValueString("RevealSlides", "no-reveal") == "reveal" ? "slider-item-reveal" : string.Empty;
201 string navigationAlwaysVisible = (Model.Item.GetBoolean("NavigationAlwaysVisible")) ? "slider-nav-visible" : string.Empty;
202 string navigationVisibleOnTouch = (Model.Item.GetBoolean("NavigationVisibleOnTouch")) ? "slider-nav-touch" : string.Empty;
203 string navigationShowScrollbar = (Model.Item.GetBoolean("NavigationShowScrollbar")) ? "slider-nav-scrollbar" : string.Empty;
204 string navigationSmall = (Model.Item.GetBoolean("NavigationSmall")) ? "slider-nav-sm" : string.Empty;
205 string navigationInvertColors = (Model.Item.GetBoolean("NavigationInvertColors")) ? "slider-nav-dark" : string.Empty;
206 string navigationSlideEntirePage = (Model.Item.GetBoolean("NavigationSlideEntirePage")) ? "slider-nav-page" : string.Empty;
207 string navigationNoLoop = (Model.Item.GetBoolean("NavigationNoLoop")) ? "slider-nav-noloop" : string.Empty;
208 string indicatorsOutsideSlider = (Model.Item.GetBoolean("IndicatorsOutsideSlider") && indicatorStyle != string.Empty) ? "slider-indicators-outside" : string.Empty;
209 string indicatorsHighlightActive = (Model.Item.GetBoolean("IndicatorsHighlightActive")) ? "slider-indicators-highlight" : string.Empty;
210 string indicatorsInvertColors = (Model.Item.GetBoolean("IndicatorsInvertedColors")) ? "slider-indicators-dark" : string.Empty;
211 string indicatorsVisibleOnSmallDevices = (Model.Item.GetBoolean("IndicatorsVisibleOnSmallDevices")) ? "slider-indicators-sm" : string.Empty;
212 bool showFavoritesSelectorMasterProduct = Model.Item.GetBoolean("ShowFavoritesSelectorMasterProduct");
213
214 bool productsFound = true;
215 if (string.IsNullOrEmpty(groupIds) && string.IsNullOrEmpty(productIds))
216 {
217 if (Pageview.IsVisualEditorMode)
218 {
219 productIds = product.Id;
220 sourceType = "selected";
221 }
222 else
223 {
224 productsFound = false;
225 }
226 }
227 }
228
229 @*Container element for the request*@
230 @if (productsFound)
231 {
232 <form method="post" action="@url" id="RelatedProductsForm_@Model.ID" data-response-target-element="RelatedProducts_@Model.ID" data-preloader="inline" data-update-url="false" class="item_@Model.Item.SystemName.ToLower()">
233 <input type="hidden" name="ModelID" value="@Model.ID">
234
235 @*--- SLIDER SETTINGS ---*@
236 <input type="hidden" name="NavigationStyle" value="@navigationStyle">
237 <input type="hidden" name="NavigationPlacement" value="@navigationPlacement">
238 <input type="hidden" name="IndicatorStyle" value="@indicatorStyle">
239 <input type="hidden" name="RevealSlides" value="@revealSlides">
240 <input type="hidden" name="NavigationAlwaysVisible" value="@(navigationAlwaysVisible)">
241 <input type="hidden" name="NavigationVisibleOnTouch" value="@(navigationVisibleOnTouch)">
242 <input type="hidden" name="NavigationShowScrollbar" value="@(navigationShowScrollbar)">
243 <input type="hidden" name="NavigationSmall" value="@(navigationSmall)">
244 <input type="hidden" name="NavigationInvertColors" value="@(navigationInvertColors)">
245 <input type="hidden" name="NavigationNoLoop" value="@(navigationNoLoop)">
246 <input type="hidden" name="NavigationSlideEntirePage" value="@(navigationSlideEntirePage)">
247 <input type="hidden" name="IndicatorsOutsideSlider" value="@(indicatorsOutsideSlider)">
248 <input type="hidden" name="IndicatorsHighlightActive" value="@(indicatorsHighlightActive)">
249 <input type="hidden" name="IndicatorsInvertColors" value="@(indicatorsInvertColors)">
250 <input type="hidden" name="IndicatorsVisibleOnSmallDevices" value="@(indicatorsVisibleOnSmallDevices)">
251 <input type="hidden" name="ShowFavoritesSelectorMasterProduct" value="@(showFavoritesSelectorMasterProduct.ToString())">
252
253 @*--- VARIANTS ---*@
254 @if (sourceType == "variants")
255 {
256 <input type="hidden" name="isVariant" value="true">
257 <input type="hidden" name="MainProductID" id="MainProductID_@Model.ID" value="@productIds">
258 }
259
260 @*--- MOST SOLD ---*@
261 @if (sourceType == "most-sold")
262 {
263 <input type="hidden" name="SortBy" value="OrderCount">
264 if (groupIds != "")
265 {
266 <input type="hidden" name="GroupId" value="@groupIds">
267 }
268 }
269
270 @*--- TRENDING ---*@
271 @if (sourceType == "trending")
272 {
273 <input type="hidden" name="SortBy" value="OrderCountGrowth">
274 if (groupIds != "")
275 {
276 <input type="hidden" name="GroupId" value="@groupIds">
277 }
278 }
279
280 @*--- FREQUENTLY BOUGHT ---*@
281 @if (sourceType == "frequently" && !string.IsNullOrEmpty(productIds))
282 {
283 <input type="hidden" name="BoughtWithProductIds" value="[@productIds]">
284 }
285
286 @*--- LATEST ---*@
287 @if (sourceType == "latest")
288 {
289 <input type="hidden" name="SortBy" value="Created">
290 <input type="hidden" name="GroupId" value="@groupIds">
291 }
292
293 @*--- SELECTED PRODUCTS ---*@
294 @if (sourceType == "selected")
295 {
296 <input type="hidden" name="MainProductID" id="MainProductID_@Model.ID" value="@productIds">
297 }
298
299 @*--- RELATED PRODUCTS ---*@
300 @if (sourceType == "related-products")
301 {
302 <input type="hidden" name="MainProductID" id="MainProductID_@Model.ID" value="@productIds">
303 }
304
305 @* General parameters *@
306 <input type="hidden" name="Link" value="@link">
307 <input type="hidden" name="HideTitle" value="@Model.Item.GetString("HideTitle")">
308 <input type="hidden" name="SortOrder" value="DESC">
309 @if (Model.Item.GetInt32("ProductsCount") != 0)
310 {
311 <input type="hidden" name="PageSize" value="@Model.Item.GetInt32("ProductsCount")">
312 }
313 <input type="hidden" name="HeadingTitle" id="RelatedProductsTitle_@Model.ID" value="@title">
314 @if (!string.IsNullOrEmpty(Model.Item.GetString("Subtitle")))
315 {
316 <input type="hidden" name="Subtitle" value="@Model.Item.GetString("Subtitle")">
317 }
318 @if (!string.IsNullOrEmpty(Model.Item.GetString("LinkText")))
319 {
320 <input type="hidden" name="LinkText" value="@Model.Item.GetString("LinkText")">
321 }
322 @if (!string.IsNullOrEmpty(Model.Item.GetString("ImageAspectRatio")))
323 {
324 string ratio = Model.Item.GetRawValueString("ImageAspectRatio", "");
325 ratio = ratio != "0" ? ratio : "";
326 <input type="hidden" name="ImageAspectRatio" value="@ratio">
327 }
328 @if (!string.IsNullOrEmpty(Model.Item.GetString("Layout")))
329 {
330 <input type="hidden" name="Layout" value="@Model.Item.GetRawValueString("Layout")">
331 }
332 @if (titleFontSize != "")
333 {
334 <input type="hidden" name="TitleFontSize" value="@titleFontSize">
335 }
336 @if (subtitleFontSize != "")
337 {
338 <input type="hidden" name="SubtitleFontSize" value="@subtitleFontSize">
339 }
340 @if (buttonStyle != "")
341 {
342 <input type="hidden" name="ButtonStyle" value="@buttonStyle">
343 }
344 @if (generalTheme != "")
345 {
346 <input type="hidden" name="GeneralTheme" value="@generalTheme">
347 }
348 @if (theme != "")
349 {
350 <input type="hidden" name="Theme" value="@theme">
351 }
352 @if (imageTheme != "")
353 {
354 <input type="hidden" name="ImageTheme" value="@imageTheme">
355 }
356 @if (!string.IsNullOrEmpty(Model.Item.GetString("ContentPadding")))
357 {
358 string contentPadding = Model.Item.GetRawValueString("ContentPadding");
359 <input type="hidden" name="ContentPadding" value="@contentPadding">
360 }
361 <input type="hidden" name="TextReadability" value="@maxWidth">
362 <input type="hidden" name="ParentColumnSize" id="ParentColumnSize_@Model.ID" value="12">
363
364 <input type="hidden" name="SaleBadgeType" value="@Model.Item.GetRawValue("SaleBadgeType")">
365 <input type="hidden" name="SaleBadgeCssClassName" value="@Model.Item.GetRawValue("SaleBadgeDesign")">
366 <input type="hidden" name="NewBadgeCssClassName" value="@Model.Item.GetRawValue("NewBadgeDesign")">
367 <input type="hidden" name="NewPublicationDays" value="@Model.Item.GetInt32("NewPublicationDays")">
368
369 @if (campaignValues != "")
370 {
371 <input type="hidden" name="CampaignBadgesValues" value="@campaignValues">
372 }
373 </form>
374
375 <script type="module" src="~/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script>
376 <script type="module">
377 swift.AssetLoader.Load('Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css', 'css');
378 </script>
379
380 if (sourceType != "related-products")
381 {
382 <div class="w-100 h-100">
383 <div id="RelatedProducts_@Model.ID" class="h-100" style="min-height: 345px"></div>
384 </div>
385 }
386 else if (product?.RelatedGroups != null)
387 {
388 @* Create multiple slider containers, if type is Product relation *@
389 <div class="grid w-100 h-100@(generalTheme)" style="grid-row-gap: 4rem">
390 @foreach (var group in product.RelatedGroups)
391 {
392 <div id="RelatedProducts_@(Model.ID)_@group.Id" class="g-col-12 h-100" style="min-height: 345px"></div>
393 }
394 </div>
395 }
396
397 @* Initialize *@
398 if (sourceType != "related-products")
399 {
400 <script type="module">
401 if (document.querySelector("#RelatedProducts_@Model.ID").closest("[data-col-size]")) {
402 document.querySelector("#ParentColumnSize_@Model.ID").value = document.querySelector("#RelatedProducts_@Model.ID").closest("[data-col-size]").getAttribute("data-col-size");
403 }
404 swift.PageUpdater.Update(document.querySelector("#RelatedProductsForm_@Model.ID"));
405 </script>
406 }
407 else if (product?.RelatedGroups != null)
408 {
409 @* Create multiple sliders, if type is Product relation *@
410 foreach (var group in product.RelatedGroups)
411 {
412 IList<string> fromProductIds = new List<string> { };
413
414 foreach (var relatedProduct in group.Products)
415 {
416 fromProductIds.Add(relatedProduct.ProductId);
417 }
418 <script type="module">
419 document.querySelector("#ParentColumnSize_@Model.ID").value = document.querySelector("#RelatedProducts_@(Model.ID)_@group.Id").closest("[data-col-size]").getAttribute("data-col-size");
420 document.querySelector("#MainProductID_@Model.ID").value = "@string.Join(",", fromProductIds)";
421 document.querySelector("#RelatedProductsTitle_@Model.ID").value = "@group.Name";
422 document.querySelector("#RelatedProductsForm_@Model.ID").setAttribute("data-response-target-element", "RelatedProducts_@(Model.ID)_@group.Id");
423
424 swift.PageUpdater.Update(document.querySelector("#RelatedProductsForm_@Model.ID"));
425 </script>
426 }
427 }
428 }
429