Error executing template "Designs/Dwsimple/eCom/Productlist/ProductListPageNoPagination.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_476fdf49c76f4846a02ced90cb6978d0.Execute() in C:\inetpub\Dynamicweb\KBH ListeFabrik\Files\Templates\Designs\Dwsimple\eCom\Productlist\ProductListPageNoPagination.cshtml:line 383
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.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2 @using System;
3 @using System.Web;
4 @using ListeFabrik.CustomModules.Classes;
5 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
6 @using System;
7 @using System.Web;
8 @using ListeFabrik.CustomModules;
9 @using ListeFabrik.CustomModules.Classes;
10
11 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
12 @using System;
13 @using System.Web;
14 @using System.Text.RegularExpressions
15
16
17 @functions{
18 public class WrapMethods
19 {
20 //Gets the contrasting color
21 public static string getContrastYIQ(string hexcolor)
22 {
23 if (hexcolor != "")
24 {
25 hexcolor = Regex.Replace(hexcolor, "[^0-9a-zA-Z]+", "");
26
27 int r = Convert.ToByte(hexcolor.Substring(0, 2), 16);
28 int g = Convert.ToByte(hexcolor.Substring(2, 2), 16);
29 int b = Convert.ToByte(hexcolor.Substring(4, 2), 16);
30 int yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;
31
32 if (yiq >= 128)
33 {
34 return "black";
35 }
36 else
37 {
38 return "white";
39 }
40 }
41 else
42 {
43 return "black";
44 }
45 }
46
47
48 //Truncate text
49 public static string Truncate (string value, int count, bool strip=true)
50 {
51 if (strip == true){
52 value = StripHtmlTagByCharArray(value);
53 }
54
55 if (value.Length > count)
56 {
57 value = value.Substring(0, count - 1) + "...";
58 }
59
60 return value;
61 }
62
63
64 //Strip text from HTML
65 public static string StripHtmlTagByCharArray(string htmlString)
66 {
67 char[] array = new char[htmlString.Length];
68 int arrayIndex = 0;
69 bool inside = false;
70
71 for (int i = 0; i < htmlString.Length; i++)
72 {
73 char let = htmlString[i];
74 if (let == '<')
75 {
76 inside = true;
77 continue;
78 }
79 if (let == '>')
80 {
81 inside = false;
82 continue;
83 }
84 if (!inside)
85 {
86 array[arrayIndex] = let;
87 arrayIndex++;
88 }
89 }
90 return new string(array, 0, arrayIndex);
91 }
92
93 //Make the correct count of columns
94 public static string ColumnMaker(int Col, string ScreenSize)
95 {
96 string Columns = "";
97
98 switch (Col)
99 {
100 case 1:
101 Columns = "col-"+ScreenSize+"-12";
102 break;
103
104 case 2:
105 Columns = "col-"+ScreenSize+"-6";
106 break;
107
108 case 3:
109 Columns = "col-"+ScreenSize+"-4";
110 break;
111
112 case 4:
113 Columns = "col-"+ScreenSize+"-3";
114 break;
115
116 default:
117 Columns = "col-"+ScreenSize+"-3";
118 break;
119 }
120
121 return Columns;
122 }
123
124
125 private string Custom(string firstoption, string secondoption)
126 {
127 if (firstoption == "custom")
128 {
129 return secondoption;
130 }
131 else
132 {
133 return firstoption;
134 }
135 }
136 }
137 }
138
139
140 @helper GetProductList(dynamic Loop, int ColMD = 3, int ColSM = 3, int ColXS = 1)
141 {
142 var area = Dynamicweb.Services.Areas.GetArea(Pageview.Area.ID);
143
144 string searchWords = HttpContext.Current.Request.QueryString["search"];
145 bool isSearch = (!string.IsNullOrWhiteSpace(searchWords)) ? true : false;
146
147 int Count = 0;
148
149 string ColumnsMD = WrapMethods.ColumnMaker(ColMD, "md");
150 string ColumnsSM = WrapMethods.ColumnMaker(ColSM, "sm");
151 string ColumnsXS = WrapMethods.ColumnMaker(ColXS, "xs");
152
153
154 foreach (LoopItem product in Loop)
155 {
156 var standardPrice = product.GetDouble("Ecom:Product.DBPrice");
157 var customerPrice = product.GetDouble("Ecom:Product.Price.Price");
158 string perUnitText = "/" + product.GetString("Ecom:Product:Field.ProductUnit");
159 bool soldByLength = perUnitText == "/M";
160 var currency = product.GetString("Ecom:Product.Price.Currency.Code");
161 string Image = product.GetString("Ecom:Product:Field.MainProductImage");
162 string Picto = product.GetString("Ecom:Product:Field.ProductPictogram");
163 string GroupLink = product.GetString("Ecom:Product.LinkGroup.Clean");
164 string Name = product.GetString("Ecom:Product.Name");
165 string Description = product.GetString("Ecom:Product.ShortDescription");
166 string Discount = product.GetString("Ecom:Product.Discount.Price");
167 string Price = product.GetString("Ecom:Product.Price");
168 string RawPrice = product.GetString("Ecom:Product.Price.PricePIP");
169 string Filters = product.GetString("Ecom:Product:Field.FilterValues");
170 string filterClasses = string.Empty;
171 string imagealttext = product.GetString("Ecom:Product:Field.ProductImageAltText");
172
173 if (!string.IsNullOrWhiteSpace(Filters))
174 {
175 filterClasses = "filter-" + Filters.Trim().Replace(",", " filter-");
176 }
177
178 if (isSearch)
179 {
180 // If the primary group is not in the current shop, we have to take the group link to the first group that's in the shop
181 // Otherwise DW takes the first group regardless if it belongs to the area or not
182 bool isPrimaryGroupInShop = false;
183
184 string primaryGroupID = product.GetString("Ecom:Product.PrimaryGroupID");
185
186 if (!string.IsNullOrEmpty(primaryGroupID))
187 {
188 var primaryGroup = Dynamicweb.Ecommerce.Products.Group.GetGroupById(primaryGroupID);
189 isPrimaryGroupInShop = primaryGroup.Shops.Any(x => x.Id == area.EcomShopId);
190 }
191
192 if (!isPrimaryGroupInShop)
193 {
194 foreach (var loopGroup in product.GetLoop("AssociatedGroups"))
195 {
196 var group = Dynamicweb.Ecommerce.Products.Group.GetGroupById(loopGroup.GetString("Ecom:Group.ID"));
197 if (group.ShopId == area.EcomShopId)
198 {
199 GroupLink = loopGroup.GetString("Ecom:Group.Link.Clean") + "&ProductID=" + product.GetString("Ecom:Product.ID.UrlEncoded");
200 break;
201 }
202 }
203 }
204 }
205
206 <div class="productlist grid-item @ColumnsMD @ColumnsSM @ColumnsXS @filterClasses"
207 data-name="@HttpUtility.HtmlEncode(Name.ToLower())"
208 data-price="@RawPrice"
209 data-filter-classes="@filterClasses">
210
211 <div class="boxproduct wp-block product">
212 <div class="listproductright">
213 <a href="@GroupLink" title="@HttpUtility.HtmlEncode(Name)">
214 <figure style="" class="productfigure">
215 @if (!string.IsNullOrEmpty(Image))
216 {
217 <img alt="@HttpUtility.HtmlEncode(imagealttext)" src="@PIMCommerceUtilities.GetPerfionImageUrl(Image,"100x100")" class="img-responsive img-center">
218 }
219 </figure>
220 @if (!string.IsNullOrEmpty(Picto))
221 {
222 <span class="product-picto"><img alt="" src="@PIMCommerceUtilities.GetPerfionImageUrl(Picto, "50x50")" /></span>
223 }
224 </a>
225 </div>
226 <div class="extracolumn">
227 <h2 class="product-title"><a href="@GroupLink">@Name.Replace("/", " / ")</a></h2>
228 <p>@Translate("Product number", "Product number"): <span>@product.GetString("Ecom:Product.Number")</span></p>
229 </div>
230 <div class="listproductleft wp-block-footer">
231 @if (customerPrice < standardPrice)
232 {
233 <span class="productprice price pull-right" style=" font-size: 16px !important" content="@product.GetString("Ecom:Product.Price.Price").Replace(",", ".")"><strong>@product.GetString("Ecom:Product.Price.Price") @currency@perUnitText</strong></span><span> </span>
234 <span class="productpricebr"></span>
235 <p class="productoldprice price" style="margin-top: -15px !important; padding-top: 0px !important; color: #AAAAAA !important; font-size: 12px !important; text-align: right; text-decoration: line-through">@standardPrice.ToString("F") @currency@perUnitText</p>
236 }
237 else
238 {
239 <span class="productprice price pull-right" style="font-size: 16px !important" content="@product.GetString("Ecom:Product.Price.Price").Replace(",", ".")"><strong>@product.GetString("Ecom:Product.Price.Price") @currency@perUnitText</strong></span><span> </span>
240 }
241 </div>
242 </div>
243
244 </div>
245
246 Count++;
247
248 if (Count == ColMD)
249 {
250 <div class="row"></div>
251 Count = 0;
252 }
253 }
254 }
255
256
257 @{
258 string searchWords = HttpContext.Current.Request.QueryString["search"];
259 bool isSearch = (!string.IsNullOrWhiteSpace(searchWords)) ? true : false;
260 string grouplink = "";
261
262 if (!string.IsNullOrWhiteSpace(GetString("Ecom:ProductList:Page.GroupID")))
263 {
264 grouplink = "/Default.aspx?ID=" + GetString("Ecom:ProductList:Page.ID") + "&GroupID=" + GetString("Ecom:ProductList:Page.GroupID");
265 }
266 else
267 {
268 grouplink = "/Default.aspx?ID=" + GetString("Ecom:ProductList:Page.ID") + "&search=" + GetString("Ecom:ProductList:Search.Query");
269 }
270
271 var products = GetLoop("Products");
272 var distinctFilters = (from LoopItem product in products select product.GetString("Ecom:Product:Field.FilterValues").Split(',')).SelectMany(x => x).Distinct();
273 }
274
275 <div class="row">
276 <div class="col-md-4 col-sm-4 col-xs-4">
277 @if (isSearch)
278 {
279 <h3 class="section-title">@searchWords</h3>
280 }
281 else
282 {
283 <h1 class="section-title">
284 @GetString("Ecom:ProductList:Page.GroupName")
285 </h1>
286 <h2 class="section-title">@GetString("Ecom:Group:Field.WebCategoryTextH2.Value")</h2>
287 if (!string.IsNullOrEmpty(GetString("Ecom:Group:Field.CategoryImage.Value")))
288 {
289 <img src="@PIMCommerceUtilities.GetPerfionImageUrl(GetString("Ecom:Group:Field.CategoryImage.Value"), "600x200")" alt="@GetString("Ecom:Group:Field.WebCategoryAltText.Value")" class="group-img img-center" />
290 }
291 }
292 </div>
293
294 <div class="col-md-4 col-sm-4 col-xs-4 hidden-xs"></div>
295
296 <div class="col-md-4 col-sm-4 col-xs-4 pull-right">
297 <div class="btn-group pull-right hidden-xs" style="" id="viewbtns">
298 <button type="button" class="btn btn-xs btn-three" onclick="ListView(true)"><span class="glyphicon glyphicon-th-list"></span></button>
299 <button type="button" class="btn btn-xs btn-three" onclick="BoxView(true)"><span class="glyphicon glyphicon-th"></span></button>
300 </div>
301 <div class="pull-right">
302 <div class="btn-group">
303 <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
304 @Translate("Sort by", "Sort by") <span class="caret"></span>
305 </button>
306 <ul class="dropdown-menu dropdown-menu-right" role="menu">
307 <li><a class="pill-left sort-btn" data-sortby="price" data-sortorder="asc">@Translate("Price low-high", "Price low-high")</a></li>
308 <li><a class="pill-left sort-btn" data-sortby="price" data-sortorder="desc">@Translate("Price high-low", "Price high-low")</a></li>
309 </ul>
310 </div>
311
312 </div>
313 </div>
314 </div>
315
316
317 @if (!isSearch)
318 {
319 <div class="row">
320 <div class="col-md-12 group-description">
321 <article>
322 <p>
323 @GetString("Ecom:Group.Description")
324 </p>
325 </article>
326 </div>
327 </div>
328
329 <div class="row">
330 <div class="col-md-12">
331 <ul class="filters-list">
332 @foreach (var feature in GetLoop("FilterFeatures"))
333 {
334 int nbFilters = (from LoopItem option in feature.GetLoop("Options") select option.GetString("Option.Value")).Distinct().Count();
335
336 if (nbFilters > 1)
337 {
338 var options = feature.GetLoop("Options");
339 var applicableFilters = options.Count(x => distinctFilters.Contains(x.GetString("Option.Value")));
340
341 if (applicableFilters > 1)
342 {
343 <li class="filter button-group" data-filter-group="@feature.GetString("Feature.name")">
344 <h4>@feature.GetString("Feature.caption")</h4>
345 <select class="filter-options-list">
346 <option class="filter-option is-checked" data-filter="">
347 @Translate("AllFilters", "All")
348 </option>
349 @foreach (var option in options)
350 {
351 if (distinctFilters.Contains(option.GetString("Option.Value")))
352 {
353 <option class="filter-option" data-filter=".filter-@option.GetString("Option.Value")">
354 @option.GetString("Option.Label")
355 </option>
356 }
357 }
358 </select>
359 </li>
360 }
361 }
362 }
363 </ul>
364
365 </div>
366 </div>
367 }
368
369 <div class="row grid main-product-list">
370 @GetProductList(products, 4)
371 </div>
372
373
374 <script>
375 @{
376 string banner = string.Empty;
377
378 if (!isSearch)
379 {
380 if (string.IsNullOrEmpty(GetString("Ecom:Group:Field.Banner")))
381 {
382 // if no banner, we take the parent group banner
383 var parents = Dynamicweb.Ecommerce.Products.Group.GetGroupById(GetString("Ecom:Group.ID")).ParentGroups;
384 if (parents.Count > 0)
385 {
386 string parentBanner = parents[0].ProductGroupFieldValues.GetProductGroupFieldValue("CategoryImage").Value.ToString();
387 if (!string.IsNullOrEmpty(parentBanner))
388 {
389 banner = PIMCommerceUtilities.GetPerfionImageUrl(parentBanner);
390 }
391 }
392 }
393 else
394 {
395 banner = PIMCommerceUtilities.GetPerfionImageUrl(GetString("Ecom:Group:Field.CategoryImage"));
396 }
397 }
398 }
399
400 ProductListSettings = {
401 GroupLink: '@grouplink',
402 GroupBanner: '@banner',
403 EcommerceProductListForm: '@Pageview.Area.Item["EcommerceProductListForm"].ToString()',
404 SortSettings: { sortBy: 'original-order' },
405 IsSearch: @isSearch.ToString().ToLower()
406 };
407 </script>
408
409 <script src="/Files/Templates/Designs/Dwsimple/js/pages/productlist.js" defer="defer"></script>
410 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
411 <script src="/Files/Templates/Designs/Dwsimple/js/vendor/readmore.js"></script>
412
413 <script>
414 $('article').readmore({
415 speed: 500,
416 collapsedHeight: 60,
417 heightMargin: 16,
418 moreLink: '<a class="btn btn btn-sm btn-dw-secondary" href="#">@Translate("ReadMore", "Læs mere")</a>',
419 lessLink: '<a class="btn btn btn-sm btn-dw-secondary" href="#">@Translate("Close", "Luk")</a>',
420 });
421 </script>