Exception in template (Designs\BocaBearings\eCom/Product/product.cshtml): System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at Dynamicweb.Modules.Searching.Rules.Parser.UnescapeStrings(String s)
at Dynamicweb.Modules.Searching.Rules.Parser.ParseSimpleExpression(String expression)
at Dynamicweb.Modules.Searching.Rules.Parser.Parse(String input)
at Dynamicweb.Modules.ItemPublisher.FilterHelper.ToXml(String filter)
at Dynamicweb.Modules.ItemPublisher.Frontend.GetContentBySettings(String settings)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Dynamicweb.Extensibility.AddInManager.InvokeFunction(Object instance, String FunctionName, Object[] Params)
at Dynamicweb.Rendering.RazorTemplateBase`1.RenderItemList(Object settings)
at CompiledRazorTemplates.Dynamic.dcfaecedad.<>c__DisplayClass6.b__3(TextWriter __razor_helper_writer)
at CompiledRazorTemplates.Dynamic.dcfaecedad.Execute()
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context)
at RazorEngine.Razor.Parse[T](String razorTemplate, T model, String cacheName)
at Dynamicweb.Rendering.Template.Output()
@inherits RazorTemplateBase<RazorTemplateModel<Template>>
@using System;
@using System.IO;
@using System.Web;
@using System.Text;
@using Dynamicweb.Rendering;
@using System.Collections.Generic;
@using System.Linq
@using System.Text.RegularExpressions;
@using System;
@using System.Collections.Generic;
@using System.Web.Script.Serialization;
@{
List<LoopItem> obj_loopVariantCombinations = GetLoop("VariantCombinations");
Dictionary<string, Dictionary<string, Dictionary<string, string>>> dic_product = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
Dictionary<string, Dictionary<string, string>> dic_variants = new Dictionary<string, Dictionary<string, string>>();
string str_productJSON = "";
if(obj_loopVariantCombinations.Any()){
foreach (LoopItem variant in obj_loopVariantCombinations){
string str_variantHref = "/"+ variant.GetValue("Ecom:VariantCombination.Link.Clean") + "?PID=" + Dynamicweb.Frontend.PageView.Current().CurrentParagraph.ID.ToString();
string str_articleNumVar = variant.GetString("Ecom:Product.Number");
string str_price = variant.GetString("Ecom:Product.Price");
string str_stock = variant.GetString("Ecom:Product.AvailableAmount");
string str_smallImage = variant.GetString("Ecom:Product.ImageSmall.Clean");
string str_id = variant.GetString("Ecom:VariantCombination.VariantID");
string str_variantName = variant.GetString("Ecom:VariantCombination.VariantText");
string str_variantShortDescription = variant.GetString("Ecom:VariantCombination.VariantText");
Dictionary<string, string> dic_variant = new Dictionary<string, string>();
dic_variant.Add("name", str_variantName);
dic_variant.Add("id", str_id);
dic_variant.Add("number", str_articleNumVar);
dic_variant.Add("price", str_price);
dic_variant.Add("stock", str_stock);
dic_variant.Add("smallImage", str_smallImage);
dic_variant.Add("productIsFavorite", variant.GetString("Ecom:Product.IsProductInFavoriteList"));
dic_variant.Add("addToList", variant.GetString("Ecom:Product.AddToList"));
dic_variant.Add("removeFromList", variant.GetString("Ecom:Product.RemoveFromList"));
dic_variants.Add(str_id, dic_variant);
}
dic_product.Add("product", dic_variants);
}
str_productJSON = new JavaScriptSerializer().Serialize(dic_product);
}
@functions{
public static string GetImage(string str_source, int num_width, int num_height, int num_widthTablet, int num_heightTablet, int num_widthMobile, int num_heightMobile, string str_format = "", int num_compression = 0, int num_crop = 5)
{
Dynamicweb.Frontend.PageView obj_currentPageview = Dynamicweb.Frontend.PageView.Current();
string str_currDevice = obj_currentPageview.Device.ToString();
string str_alternativeImage = obj_currentPageview.Area.Item["NoImage"] != null ? obj_currentPageview.Area.Item["NoImage"].ToString() : "/Files/Templates/Designs/BocaBearings/images/alternativeImage.jpg";
string str_width = "";
string str_height = "";
int num_getImageWidth = num_width != 0 ? num_width : 0;
int num_getImageHeight = num_height != 0 ? num_height : 0;
string str_getImageFormat = str_format != "" ? "&Format=" + str_format : "";
string str_getImageCompression = num_compression != 0 ? "&Compression=" + num_compression : "";
if (str_currDevice == Dynamicweb.Frontend.PageView.DeviceType.Tablet.ToString())
{
num_getImageWidth = num_widthTablet != 0 ? num_widthTablet : num_getImageWidth;
num_getImageHeight = num_heightTablet != 0 ? num_heightTablet : num_getImageHeight;
}
else if (str_currDevice == Dynamicweb.Frontend.PageView.DeviceType.Mobile.ToString())
{
num_getImageWidth = num_widthMobile != 0 ? num_widthMobile : num_getImageWidth;
num_getImageHeight = num_heightMobile != 0 ? num_heightMobile : num_getImageHeight;
}
if (num_getImageWidth != 0)
{
str_width = "&Width=" + num_getImageWidth;
}
if (num_getImageHeight != 0)
{
str_height = "&Height=" + num_getImageHeight;
}
string str_output = "/Admin/Public/GetImage.ashx?Image=" + str_source + str_width + str_height + "&altFmImage_path=" + str_alternativeImage + str_getImageFormat + str_getImageCompression + "&Crop=" + num_crop;
return str_output;
}
}
@functions{
public string RenderDimensions(string dimension){
return dimension;
if(!string.IsNullOrEmpty(dimension)){
string dimensionClean = dimension;
string[] cleanUpDictionary = {"Metric","Inch","es","Millimeters"," "};
foreach(string dictionary in cleanUpDictionary){
dimensionClean = dimensionClean.Replace(dictionary,"");
}
dimensionClean = dimensionClean.ToLower();
string[] dimensions = (dimensionClean ?? "").Split(new [] { 'x' },StringSplitOptions.RemoveEmptyEntries);
if(dimensions.Any()){
dimensionClean ="";
foreach(string d in dimensions){
var dimensionDouble = Double.Parse(d);
var hasDecimals = (int)dimensionDouble != dimensionDouble;
string str_d = hasDecimals ? dimensionDouble.ToString("#,##0.0000") : dimensionDouble.ToString("#,##0");
dimensionClean = dimensionClean + " x " + str_d ;
}
dimensionClean = dimensionClean.Substring(3);
}
return dimensionClean;
}
}
}
@functions{
public string GetIcon(string path) {
string icon = "";
switch(Path.GetExtension(path)) {
case ".pdf":
icon = "fa-file-pdf-o";
break;
case ".jpg":
icon = "fa-picture-o";
break;
case ".png":
icon = "fa-picture-o";
break;
case ".gif":
icon = "fa-picture-o";
break;
default:
icon = "fa-envelope-o";
break;
}
return icon;
}
}
@{
Pageview.Meta.Add("customCan", "<link rel=\"canonical\" href=\""+HttpContext.Current.Request.RawUrl+"\"");
var itemArea = Pageview.Area.Item;
string str_currentPageId = Pageview.Page.ID.ToString();
string str_pageInfo = itemArea["PageInformation"].ToString();
string str_variantDefaultId = GetString("Ecom:Product.DefaultVariantComboID");
string str_variantCurrentId = GetString("Ecom:Product.VariantID");
string str_variantId = (!String.IsNullOrEmpty(str_variantCurrentId)) ? str_variantCurrentId : str_variantDefaultId;
bool bol_productIsFavorite = GetBoolean("Ecom:Product.IsProductInFavoriteList");
int inquireForm = Convert.ToInt32((Pageview.Area.Item["InquireAvailability"] ?? "0").ToString());
string str_productId = GetString("Ecom:Product.ID");
string str_productLanguage = GetString("Ecom:Product.LanguageID");
string str_productName = GetString("Ecom:Product.Name");
string str_articleNum = GetString("Ecom:Product.Number");
string str_patternImage = "/Files/Files/BocaBearing/Products/Images/" + str_articleNum + ".jpg";
string str_pattern = str_articleNum + "_*";
string str_productImage = !string.IsNullOrEmpty(GetString("Ecom:Product.ImageSmall.Default.Clean")) ? GetString("Ecom:Product.ImageSmall.Default.Clean") : !string.IsNullOrEmpty(GetString("Ecom:Product.ImageMedium.Default.Clean")) ? GetString("Ecom:Product.ImageMedium.Default.Clean") : !string.IsNullOrEmpty(GetString("Ecom:Product.ImageLarge.Default.Clean")) ? GetString("Ecom:Product.ImageLarge.Default.Clean") : str_patternImage;
str_productImage = str_productImage.ToLower().Replace("/files/files/files/", "/files/files/");
string str_metaDescription = GetString("Ecom:Product.MetaDescription");
str_metaDescription = String.IsNullOrWhiteSpace(str_metaDescription) ? GetString("Ecom:Product.LongDescription") :str_metaDescription;
if (!String.IsNullOrWhiteSpace(str_metaDescription) && String.IsNullOrWhiteSpace(GetString("Ecom:Product.MetaDescription")))
{
Pageview.Meta.Add("description", Dynamicweb.Base.TeaserString(StripHtml(str_metaDescription), 155, "..."));
}
string str_productGetImage = GetImage(str_productImage, 0, 400, 0, 200, 0, 200, "jpg", 90, 5);
string str_productIntro = GetString("Ecom:Product:Field.Dimensions"); //GetString("Ecom:Product.ShortDescription");
str_productIntro = RenderDimensions(str_productIntro).ToString();
string str_productDescription = GetString("Ecom:Product.LongDescription");
string str_productRemoveFromList = "/Default.aspx?Id=" + str_currentPageId + "&CCRemoveFromMyLists=" + str_productId + "&CCRemoveFromListVariantID=" + str_variantId + "&CCRemoveFromListLanguageID=" + str_productLanguage;
string str_productAddToList = "/Default.aspx?Id=" + str_currentPageId + "&CCAddToMyLists=" + str_productId + "&CCAddToListVariantID=" + str_variantId + "&CCAddToListLanguageID=" + str_productLanguage;
string str_favoriteUrl = bol_productIsFavorite ? str_productRemoveFromList : str_productAddToList;
string str_downloadsAndVideosFilter = "Products contains 'p_" + str_productId + ",' or Products contains 'p_" + str_productId + ":' or Products ends with 'p_" + str_productId + "'";
string str_fitmentsFilter = "Product_ID contains 'p_" + str_productId + ",' or Product_ID contains 'p_" + str_productId + ":' or Product_ID ends with 'p_" + str_productId + "'";
str_fitmentsFilter = "Product_ID='" + str_productId + "'";
bool countImages = true;
string str_titleKey = "title";
string str_title = "";
string str_imageKey = "image";
string str_image = "";
string str_prodNameWithFits = str_productName;
str_prodNameWithFits += System.Web.HttpContext.Current.Request.Params["make"] != null ? " | " + System.Web.HttpContext.Current.Request.Params["make"] + ", " + System.Web.HttpContext.Current.Request.Params["model"] + " - " + System.Web.HttpContext.Current.Request.Params["feature"] : "";
List<Dictionary<string, string>> lst_images = new List<Dictionary<string, string>>();
string str_folderPath = Path.GetDirectoryName(HttpContext.Current.Server.MapPath("/Files/Files/BocaBearing/Products/Images/" + str_articleNum + ".jpg"));
string str_urlInquire = "/Default.aspx?ID=" + itemArea["InquireAboutAvailability"].ToString() + "&prodID=" + GetString("Ecom:Product.ID");
bool bol_userLogged = Pageview.User.LoggedIn;
string schematic = GetString("Ecom:Product:Field.SchematicUrl.Value.FullPath");
string techImage = GetString("Ecom:Product:Field.TechnicalImage.Value.Clean");
bool inquireProduct = GetBoolean("Ecom:Product:Field.InquiryProduct.Value");
string mmfURL = "";
mmfURL += !String.IsNullOrWhiteSpace((System.Web.HttpContext.Current.Request.Params["make"] ?? "").ToString()) ? "make=" + System.Web.HttpUtility.UrlEncode((System.Web.HttpContext.Current.Request.Params["make"] ?? "").ToString()).Replace("+", "%20") : "";
mmfURL += !String.IsNullOrWhiteSpace((System.Web.HttpContext.Current.Request.Params["model"] ?? "").ToString()) ? "&model=" + System.Web.HttpUtility.UrlEncode((System.Web.HttpContext.Current.Request.Params["model"] ?? "").ToString()).Replace("+", "%20") : "";
mmfURL += !String.IsNullOrWhiteSpace((System.Web.HttpContext.Current.Request.Params["feature"] ?? "").ToString()) ? "&feature=" + System.Web.HttpUtility.UrlEncode((System.Web.HttpContext.Current.Request.Params["feature"] ?? "").ToString()).Replace("+", "%20") : "";
string sideCartInfo = str_productId;
//sideCartInfo += !String.IsNullOrWhiteSpace(mmfURL) ? "?" + mmfURL : "";
// TODO do ajax call to get this values
List<LoopItem> productPrices = GetLoop("Product.Prices");
List<LoopItem> bomLoop = new List<LoopItem>();
if (GetString("Ecom:Product.Type") == "2" || bomLoop != null) {
bomLoop = GetLoop("BOMProducts");
}
string groupId = (!bol_userLogged) ? string.Empty : GetFirstUserGroupID(Pageview.User.Groups.ToArray(), productPrices.Select(p => p.GetString("Ecom:Product.Prices.GroupID")).Distinct().ToList());
if (Directory.Exists(str_folderPath))
{
string str_temp = @"\";
foreach (string file in Directory.GetFiles(str_folderPath, str_pattern))
{
Dictionary<string, string> dct_image = new Dictionary<string, string>();
str_image = "/Files/Files/BocaBearing/Products/Images/" + file.Substring((file.LastIndexOf(@str_temp) + 1), (file.Length - file.LastIndexOf(@str_temp) - 1));
string str_metafield = "title";
var metadata = Dynamicweb.Content.Files.Metadata.EditorFactory.GetMetadataForFile(str_image);
str_title = metadata != null ? metadata.GetValue(str_metafield).ToString() : str_productName;
dct_image.Add(str_titleKey, str_title);
dct_image.Add(str_imageKey, str_image);
lst_images.Add(dct_image);
}
}
string productSpecificationColumn = "col-sm-12";
<div id="product-container" data-inquire="@inquireProduct" data-hasCad="@GetString("Ecom:Product:Field.HasCad")" data-pageId="@str_currentPageId" data-productId="@str_productId" data-variantId="@str_variantId" data-errorCombination1='@Translate("Combination not available")' data-pageInfo='/@str_pageInfo'>
<article id="product-description" class="col-xs-12">
<div id="product-images" class="col-sm-4 col-xs-12">
<figure class="text-center">
<img itemprop="image" class="img-responsive" src="@str_productGetImage" alt="@str_productName" title="@str_productName" />
</figure>
<div id="imgThumbs" class="col-xs-12 noPadding">
<ul>
@foreach (var image in lst_images)
{
string str_getimageImg = GetImage(image["image"].ToString(), 0, 105, 0, 105, 0, 105, "jpg", 90, 5);
string liClass = countImages ? "active" : "";
<li class="col-sm-4 col-xs-4 @liClass">
<img class="img-responsive" src="@str_getimageImg" title="@image["title"]" alt="@image["title"]" />
</li>
countImages = false;
}
</ul>
</div>
</div>
<div id="product-info-wrapper" class="col-sm-8 col-xs-12 noPaddingRight">
<div data-prodname="@str_productName" itemprop="name" class="product-title padding-bottom h2">@str_prodNameWithFits</div>
@if (!String.IsNullOrEmpty(str_productIntro))
{
<h2>@RenderDimensions(str_productIntro)</h2>
}
@RenderRatingReview()
<div class="col-xs-12 noPadding description" itemprop="description">
@if (!String.IsNullOrEmpty(str_productDescription))
{
<p class="lead">@Translate("Description", "Description")</p>
if (!String.IsNullOrEmpty(str_productDescription))
{
@str_productDescription
}
}
</div>
@if(!inquireProduct) {
<!-- Interface related with Add to cart -->
@OrderNow(str_currentPageId,str_productId,str_variantId,productPrices,groupId,str_urlInquire)
<!-- Interface Add to Wish List -->
@AddWishList(itemArea["Retail"].ToString(),bol_productIsFavorite,techImage,groupId,str_favoriteUrl, bol_userLogged)
}
else {
if(!String.IsNullOrEmpty(GetString("Ecom:Product:Field.Video.Value"))) {
<div class="col-xs-12 noPadding productVideo">
<iframe width="78%" height="315" src="@GetString("Ecom:Product:Field.Video.Value")">
</iframe>
</div>
}
}
</div>
@if(!inquireProduct) {
if(!GetString("Ecom:Product.PrimaryGroupID").Equals("L3CATALOGS-Catalogs")) {
decimal customValueInt;
bool valParsed = false;
<!-- Tabs -->
<div id="tabsContainer" class="col-xs-12 blueBottomBar">
@CreateTabs(bomLoop,schematic,techImage,GetBoolean("Ecom:Product:Field.HasCad.Value"))
<!-- Product Specifications -->
<div class="hide" id="productSpecifications">
<div class="@productSpecificationColumn noPadding">
<dl class="col-xs-6 specificationsList noPadding">
@*<dt class="col-xs-6 blue">@Translate("productType", "Product Type")</dt>
<dd class="col-xs-6"><a target="_blank" class="blue" href="/Default.aspx?ID=@Pageview.Page.ID&GroupID=@GetString("Ecom:Product.PrimaryOrFirstGroupID")">@GetString("PRODUCT_TYPE.Clean")</a></dd>*@
@foreach (KeyValuePair<string, string> entry in GetProductSpecifications())
{
valParsed = Decimal.TryParse(entry.Value, out customValueInt);
if(!String.IsNullOrEmpty(entry.Value)) {
if(!(valParsed && customValueInt == 0)) {
<dt class="col-xs-6">@entry.Key</dt>
<dd class="col-xs-6">@entry.Value</dd>
}
}
}
</dl>
</div>
</div>
@if (bomLoop.Any())
{
@RenderKitComponents()
}
@RenderTabsInfo(schematic,techImage,bol_userLogged,itemArea["RequestDrawing"].ToString(),itemArea["Request3DCAD"].ToString(),itemArea["ProductDownloads"].ToString(),itemArea["ProductVideos"].ToString(),str_downloadsAndVideosFilter,str_fitmentsFilter,str_productName)
</div>
<div class="toAppend">
</div>
@RenderReviews(itemArea,str_articleNum,str_productName,str_productIntro)
}
}
else {
@RenderParagraphContent(inquireForm)
}
</article>
</div>
@SnippetStart("jsOnLoad") @:onLoadProductDetail({obj_product:@str_productJSON}, @GetGroupsStructure()); @SnippetEnd("jsOnLoad")
}
@helper RenderReviews(Dynamicweb.Content.Items.Item itemArea,string str_articleNum, string str_productName, string str_productIntro) {
List<LoopItem> comments = GetLoop("Comments");
string str_starClass = "";
string str_halfStar = "";
<div id="reviewsContainer" class="col-xs-12 noPadding">
<h3 class="productTitles">
@Translate("reviews", "Reviews")
<a id="reviewThisProdButton" href="#" class="btn-blue generalButton pull-right underline hidden-xs">@Translate("reviewThisProduct", "Review this product")</a>
</h3>
<div class="col-xs-12 noPadding reviewsHead">
<ul class="rating">
@for (int s = 5; s > 0; s--)
{
if (s == Math.Ceiling(GetDouble("Comments.Rating")))
{
str_starClass = "class='star'";
str_halfStar = !(GetDouble("Comments.Rating") - Math.Round(GetDouble("Comments.Rating")) == 0) ? "fa-star-half-o" : "fa-star";
}
else {
str_starClass = "";
str_halfStar = "fa-star";
}
<li data-star="@s" @str_starClass><i class="fa @str_halfStar"></i></li>
}
</ul>
<span id="totalReviews">@GetDouble("Comments.TotalCount") @Translate("reviews", "Reviews")</span>
</div>
@if (comments.Any())
{
<div class="col-xs-12 noPadding">
<ul id="productReviews" class="col-xs-12 noPadding">
@foreach (LoopItem comment in comments)
{
DateTime dat_date = comment.GetDate("CreatedDate");
string str_date = dat_date.Month.ToString() + "/" + dat_date.Day.ToString() + "/" + dat_date.Year.ToString();
<li class="col-xs-12 noPadding">
<div class="col-xs-12 col-sm-4 noPadding">
<div class="col-xs-12 noPaddingLeft titleGray">
<ul class="rating">
@for (int s = 5; s > 0; s--)
{
if (s == Math.Ceiling(comment.GetDouble("Rating")))
{
str_starClass = "class='star'";
str_halfStar = !(comment.GetDouble("Rating") - Math.Round(comment.GetDouble("Rating")) == 0) ? "fa-star-half-o" : "fa-star";
}
else {
str_starClass = "";
str_halfStar = "fa-star";
}
<li data-star="@s" @str_starClass><i class="fa @str_halfStar"></i></li>
}
</ul>
</div>
<div class="col-xs-12 fivePxMarginLeft">@Translate("reviewer", "Reviewer") : @comment.GetString("Name")</div>
<div class="col-xs-12 fivePxMarginLeft">@Translate("date", "Date") : @str_date</div>
</div>
<div class="col-xs-12 col-sm-8 noPadding">
<div class="titleGray">@comment.GetString("Website").Replace("http://", "") </div>
@comment.GetString("Text")
</div>
</li>
}
</ul>
</div>
}
<div id="reviewsFormContainer" data-alert='@Translate("success", "Your review has been submitted for approval.")' class="col-xs-12 noPadding">
<h2 class="titleGray">@Translate("reviewThisProduct", "Review this product")</h2>
<div id="reviewsForm" class="col-xs-12">
<h3>@Translate("rating", "Rating")</h3>
<form method="post" action="/Default.aspx?ID=@Pageview.Page.ID">
<input type="hidden" name="Comment.ItemType" value="ecomProduct">
<input type="hidden" name="Comment.Active" value="False">
<input type="hidden" name="Comment.ItemID" value="@GetValue("Ecom:Product.ID")">
<input type="hidden" name="Comment.LangID" value="@GetValue("Ecom:Product.LanguageID")">
<input type="hidden" name="Comment.Command" id="Comment.Command" value="create">
<input type="hidden" name="_sys_to_email" value="bot@dynamicweb.com">
<input disabled="disabled" type="hidden" name="ProductName" value="@GetString("Ecom:Product.Name")">
<input disabled="disabled" type="hidden" name="FM_Charset" value="iso-8859-1">
<input disabled="disabled" type="hidden" name="FM_html" value="true">
<input disabled="disabled" type="hidden" name="FM_Subject" value="BocaBearings - New Review">
<input disabled="disabled" type="hidden" name="FM_FromEmail" value="@Translate("noreply@bocabearings.com")">
<input disabled="disabled" type="hidden" name="FM_FromName" value="BocaBearings">
<input disabled="disabled" type="hidden" name="FM_Template" value="sendReviewToAdmin.cshtml">
@*<input disabled="disabled" type="hidden" name="FM_ToEmail" value="@itemArea["Email"]">*@
<input disabled="disabled" type="hidden" name="FM_ToEmail" value="@itemArea["ReviewEmailReceiver"]">
<input disabled="disabled" type="hidden" name="FM_Redirect" value="/Default.aspx?ID=@itemArea["Review_Approve"]">
<input disabled="disabled" type="hidden" name="ApprovalURL" value="/Default.aspx?ID=@itemArea["ApproveReview"]">
<fieldset class="ratingContainer">
<ul id="commentRating">
<li class="star"><input type="radio" name="Comment.Rating" value="5" checked="checked" /><i class="fa fa-star"></i></li>
<li><input type="radio" name="Comment.Rating" value="4" /><i class="fa fa-star"></i></li>
<li><input type="radio" name="Comment.Rating" value="3" /><i class="fa fa-star"></i></li>
<li><input type="radio" name="Comment.Rating" value="2" /><i class="fa fa-star"></i></li>
<li><input type="radio" name="Comment.Rating" value="1" /><i class="fa fa-star"></i></li>
</ul>
</fieldset>
<fieldset class="mandatory name">
<label for="Comment.Name">@Translate("name", "Name"):</label>
<input type="text" name="Comment.Name" id="Comment.Name" value="" />
</fieldset>
<fieldset class="mandatory email checkEmail">
<label for="Comment.Email">@Translate("email", "Email"):</label>
<input type="text" name="Comment.Email" id="CommentEmail" value="" />
</fieldset>
<fieldset class="mandatory title">
<label for="Comment.Website">@Translate("title", "Title"):</label>
<input type="text" name="Comment.Website" id="Comment.Website" value="" />
</fieldset>
<fieldset class="last mandatory">
<label for="Comment.Text">@Translate("comments", "Comments"):</label>
<textarea maxlength="800" name="Comment.Text" id="Comment.Text" rows="10" cols="50"></textarea>
</fieldset>
<input class="generalButton" type="submit" value="@Translate("submit", "Submit")" />
</form>
</div>
</div>
<div id="shareContainer" class="col-xs-12 noPadding">
<div class="shareIcons">
<span>@Translate("share", "Share")</span>
<ul>
<li>
<a class="fa-facebook fa" target="_blank" href='///www.facebook.com/sharer/sharer.php?u=@GetGlobalValue("Global:Request.Scheme")://@GetGlobalValue("Global:Request.Host")@GetGlobalValue("Global:Pageview.Url")'><span>@Translate("shareFacebook", "Share facebook")</span></a>
</li>
<li>
<a class="fa-twitter fa" target="_blank" href='///twitter.com/home?status=@GetGlobalValue("Global:Request.Scheme")://@GetGlobalValue("Global:Request.Host")@GetGlobalValue("Global:Pageview.Url")'><span>@Translate("shareTwitter", "Share twitter")</span></a>
</li>
<li>
<a class="fa-linkedin fa" target="_blank" href='///www.linkedin.com/shareArticle?mini=true&url=@GetGlobalValue("Global:Request.Scheme")://@GetGlobalValue("Global:Request.Host")@GetGlobalValue("Global:Pageview.Url")&title=@str_productName&summary=@str_productIntro&source='><span>@Translate("shareLinkedin", "Share linkedin")</span></a>
</li>
</ul>
</div>
</div>
</div>
}
@helper RenderTabsInfo(string schematic, string techImage,bool bol_userLogged,string requestDrawing,string request3DCAD, string productDownloads, string productVideos,string str_downloadsAndVideosFilter,string str_fitmentsFilter,string prodName) {
var primaryGroup = Dynamicweb.eCommerce.Products.Group.GetGroupByID(GetString("Ecom:Product.PrimaryGroupID"));
var requestDrawingLabel = primaryGroup != null ? primaryGroup.ProductGroupFieldValues.FirstOrDefault(gf => gf.ProductGroupField.SystemName.Equals("DrawingLabel")).Value.ToString() : string.Empty;
var technicalImageLabel = primaryGroup != null ? primaryGroup.ProductGroupFieldValues.FirstOrDefault(gf => gf.ProductGroupField.SystemName.Equals("TechnicalImageLabel")).Value.ToString() : string.Empty;
var productID = GetString("Ecom:Product.ID");
requestDrawingLabel = string.IsNullOrEmpty(requestDrawingLabel) ? Translate("requestDrawing", "Request Drawing") : requestDrawingLabel;
technicalImageLabel = string.IsNullOrEmpty(technicalImageLabel) ? Translate("techImage", "Technical Image") : technicalImageLabel;
string log3DCADDownload = (Pageview.Area.Item["Log3DCADDownload"] ?? "").ToString();
log3DCADDownload = !String.IsNullOrWhiteSpace(log3DCADDownload) ? Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(log3DCADDownload) : "/";
string logTechImageDownload = (Pageview.Area.Item["LogTechnicalImageDownload"] ?? "").ToString();
logTechImageDownload = !String.IsNullOrWhiteSpace(logTechImageDownload) ? Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(logTechImageDownload) : "/";
string logSchematicURL = (Pageview.Area.Item["LogSchematicURL"] ?? "").ToString();
logSchematicURL = !String.IsNullOrWhiteSpace(logSchematicURL) ? Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(logSchematicURL) : "/";
<div id="tabDownloads">
@if(!string.IsNullOrEmpty(schematic)) {
var icon = GetIcon(schematic);
<ul>
<li>
@if (!bol_userLogged)
{
<a class="downloadFile" href="javascript:void(0)" data-toggle="modal" data-target="#myModal"><i class="fa fa-download"></i> @Translate("downloadSchematic", "Download Schematic URL")</a>
}
else
{
<a class="downloadFile schematicUrlDownload" href="@schematic" target="_blank" data-partNumber="@productID" data-schematicUrlLogPage="@logSchematicURL">
<i class="fa @icon"></i>
@Translate("schematic", "Schematic URL")
</a>
}
</li>
</ul>
}
@if(!string.IsNullOrEmpty(techImage)) {
var icon = GetIcon(techImage);
string techImageURL = techImage.Contains('/') ? String.Format("{0}/{1}", techImage.Substring(0, techImage.LastIndexOf('/')), HttpContext.Current.Server.UrlEncode(techImage.Substring(techImage.LastIndexOf('/') + 1, (techImage.Length - techImage.LastIndexOf('/') - 1)))) : HttpContext.Current.Server.UrlEncode(techImage);
techImageURL = techImageURL.Replace("+", "%20");
<ul>
<li>
@if (!bol_userLogged)
{
<a class="downloadFile" href="javascript:void(0)" data-toggle="modal" data-target="#myModal"><i class="fa fa-download"></i> @Translate("downloadTechImage", "Download Technical Image")</a>
}
else
{
<a class="downloadFile techImageDownload" href="@techImageURL" target="_blank" data-partNumber="@productID" data-techImageLogPage="@logTechImageDownload">
<i class="fa @icon"></i>
@technicalImageLabel
</a>
}
<li>
</ul>
}
@if (string.IsNullOrEmpty(techImage) || GetBoolean("Ecom:Product:Field.HasCad.Value"))
{
<ul>
@if (string.IsNullOrEmpty(techImage))
{
<li>
<a class="downloadFile" href="@requestDrawing?prodID=@GetString("Ecom:Product.ID")"><i class="fa fa-envelope-o"></i> @requestDrawingLabel</a>
</li>
}
@if (GetBoolean("Ecom:Product:Field.HasCad.Value"))
{
<li>
@if (!bol_userLogged)
{
<a class="downloadFile" href="javascript:void(0)" data-toggle="modal" data-target="#myModal"><i class="fa fa-download"></i> @Translate("downloadCAD", "Download CAD")</a>
}
else
{
string partNumber = prodName.Replace(" ", ":").Replace("/", "_").Replace("#", "_").Replace(".", "_");
<div id="cds-cad-container" class="cadDownload" data-partNumber="@productID" data-logPage="@log3DCADDownload">
<button id="cds-cad-view-button">@Translate("ViewCad", "View 3D CAD")</button>
<button id="cds-cad-download-button">@Translate("downloadCad", "Download 3D CAD")</button>
<select id="cds-cad-download-formats"></select><br>
</div>
}
</li>
}
else
{
<li>
<a class="downloadFile" href="@request3DCAD?prodID=@GetString("Ecom:Product.ID")"><i class="fa fa-envelope-o"></i> @Translate("request3Dcad", "Request 3D CAD")</a>
</li>
}
</ul>
}
@RenderItemList(new
{
ItemType = "ProductVideosAndDownloads",
ListSourceType = "Page",
ListSourcePage = productDownloads,
ItemFieldsList = "*",
ListTemplate = "ItemPublisher/List/ProductDownloadsAndVideos.cshtml",
ListPageSize = 10,
IncludeParagraphItems = true,
Filter = str_downloadsAndVideosFilter
})
</div>
<div class="hide" id="tabVideos">
@RenderItemList(new
{
ItemType = "ProductVideosAndDownloads",
ListSourceType = "Page",
ListSourcePage = productVideos,
ItemFieldsList = "*",
ListTemplate = "ItemPublisher/List/ProductDownloadsAndVideos.cshtml",
ListPageSize = 10,
IncludeParagraphItems = true,
Filter = str_downloadsAndVideosFilter
})
</div>
if (GetString("Ecom:Product.Type") == "2")
{
<div class="hide" id="tabAlsoFits">
@RenderItemList(new
{
ItemType = "Fitments",
ListSourceType = "Area",
ListSourceArea = 2,
ItemFields = "*",
ItemFieldsList = "Fits",
ListTemplate = "ItemPublisher/List/Fitments.cshtml",
ListPageSize = 25,
Filter = str_fitmentsFilter
})
</div>
}
@RenderLoginForm(bol_userLogged)
}
@helper RenderLoginForm(bool isUserLoggedIn)
{
if (!isUserLoggedIn)
{
<div id="myModal" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">@Translate("login", "Login")</h4>
</div>
<div class="modal-body">
@{
bool bol_userLogged2 = Pageview.User.LoggedIn;
var areaItem = Pageview.Area.Item;
string friendlyURL = "Default.aspx?ID=" + Pageview.Page.ID.ToString();
string recoverPasswordPageID = (areaItem["RecoverPassword"] ?? Pageview.Page.ID).ToString();
if(System.Web.HttpContext.Current.Request["productid"] != null)
{
friendlyURL += "&productid=" + System.Web.HttpContext.Current.Request["productid"].ToString();
}
friendlyURL = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(friendlyURL);
}
@if(!bol_userLogged2) {
<form id="ExtUserForm" class="col-xs-12 DMForms userRelatedForms" action="/" method="post">
<input type="hidden" name="redirect" value="@friendlyURL">
<input type="hidden" name="ID" value="@(GetGlobalValue("Global:Page.ID"))">
<fieldset class="mandatory TextInput">
<label for="Username">@Translate("usernameEmail","Username / Email")</label>
<input type="email" id="Username" name="username" value="" tabindex="1">
</fieldset>
<fieldset class="mandatory TextInput">
<label for="Password">@Translate("password","Password")</label>
<input type="password" id="Password" name="password" value="" tabindex="2">
</fieldset>
<div class="col-xs-12 noPadding">
<input class="generalButton" name="LoginAction" type="submit" value='@Translate("Login", "Login")'>
</div>
<div class="forgotButtons col-xs-12 noPadding">
<a id="forgotPassword" href="/Default.aspx?id=@(recoverPasswordPageID)&LoginAction=Recovery">@Translate("forgotYourPassword","Forgot your password?")</a>
</div>
<div id="dontHaveAnAccount" class="col-xs-12 noPadding">
<div>
@Translate("dontHaveAnAccount","Don't have an account?")
<a class="underline" href="@areaItem["CreateAccount"]">@Translate("createAccount", "Create account")</a>
</div>
</div>
</form>
}
@SnippetStart("jsOnLoad")
onLoadLoginForm();
@SnippetEnd("jsOnLoad")
</div>
<div class="modal-footer footerModalLogin">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
}
}
@helper RenderKitComponents() {
<div class="hide" id="tabKitComponents">
<h2 class="hide">@Translate("kitComponents", "Kit Components")</h2>
<ul class="col-xs-12 noPadding">
@foreach (LoopItem comp in GetLoop("BOMProductItems"))
{
string str_bomPatternImage = "/Files/Files/BocaBearing/Products/Images/" + comp.GetString("Ecom:Product.Number") + ".jpg";
string str_bomImage = !string.IsNullOrEmpty(comp.GetString("Ecom:Product.ImageSmall.Default.Clean")) ? comp.GetString("Ecom:Product.ImageSmall.Default.Clean") : !string.IsNullOrEmpty(comp.GetString("Ecom:Product.ImageMedium.Default.Clean")) ? comp.GetString("Ecom:Product.ImageMedium.Default.Clean") : !string.IsNullOrEmpty(comp.GetString("Ecom:Product.ImageLarge.Default.Clean")) ? comp.GetString("Ecom:Product.ImageLarge.Default.Clean") : str_bomPatternImage;
str_bomImage = str_bomImage.Replace("/Files/files/files/", "/Files/files/");
string str_bomImg = GetImage(str_bomImage, 0, 180, 0, 0, 0, 0, "jpg", 90, 5);
string str_prodName = comp.GetString("Ecom:Product.Name");
string str_dimensionsType = comp.GetString("Ecom:Product:Field.DimensionType.Value");
string str_dimensionsID = comp.GetString("Ecom:Product:Field.ID.Value");
string str_dimensionsOD = comp.GetString("Ecom:Product:Field.OD.Value");
string str_dimensionsWidth = comp.GetString("Ecom:Product:Field.Width.Value");
string str_dimensions = str_dimensionsID + " x " + @str_dimensionsOD + " x " + @str_dimensionsWidth;
string str_quantity = comp.GetString("Ecom:Product.Item.Quantity");
string str_link = String.Format("/Default.aspx?ID={0}&productid={1}", (Pageview.Area.Item["ProductDetail"] ?? Pageview.Page.ID).ToString(), comp.GetString("Ecom:Product.ID"));
<li class="col-xs-12 noPadding">
<figure class="col-sm-1 col-xs-12 noPadding">
<a href="@str_link">
<img class="img-responsive" src="@str_bomImg" alt="@str_prodName" title="@str_prodName"/>
</a>
</figure>
<dl class="col-sm-9 col-xs-12">
<dt class="col-xs-3">@Translate("bearingAndBall", "Bearing & Ball Type")</dt>
<dd class="col-xs-9">
<h3>
<a class="underline" href="@str_link">
@str_prodName
</a>
</h3>
</dd>
<dt class="col-xs-3">@Translate("dimensions", "Dimensions")</dt>
<dd class="col-xs-9 bold">
@if (str_dimensionsType != "" && str_dimensionsID != "" && str_dimensionsOD != "" && str_dimensionsWidth != "")
{
@(RenderDimensions(str_dimensions) + " " + @str_dimensionsType)
}
else
{
@:---
}
</dd>
<dt class="col-xs-3">@Translate("quantity", "Quantity")</dt>
<dd class="col-xs-9 bold">
@(str_quantity != "" ? str_quantity : "---")
</dd>
</dl>
<div class="col-sm-2 col-xs-12">
<a href="@str_link" class="btn-softBlue pull-right">
@Translate("more", "More")
<i class="fa fa-angle-double-right"></i>
</a>
</div>
</li>
}
</ul>
</div>
}
@helper CreateTabs(List<LoopItem> bomLoop,string schematic,string techImage,bool isCad) {
<ul id="productTabs" class="col-xs-12 noPadding"> @*CUSTOM CODE - Removing Hide*@
@if (!bomLoop.Any())
{
<li data-id="productSpecifications" class="productSpecifications" onclick="ProductBorderColorBlue()">@Translate("productSpecifications", "Product Specifications")</li>
}
else
{
<li data-id="tabKitComponents" class="tabKitComponents">@Translate("kitComponents", "Kit Components")</li>
}
@if (GetString("Ecom:Product.Type") == "2")
{
<li data-id="tabAlsoFits" class="tabAlsoFits">@Translate("alsoFits", "Also Fits")</li>
}
@if(!string.IsNullOrEmpty(schematic) || !string.IsNullOrEmpty(techImage) || isCad || !GetString("Ecom:Product.PrimaryGroupID").Equals("L3CATALOGS-Catalogs")) {
<li data-id="tabDownloads" class="tabDownloads" onclick="ProductBorderColorGreen()">@Translate("downloads", "Downloads")</li>
}
<li data-id="tabVideos" class="tabVideos" onclick="ProductBorderColorBlue()">@Translate("videos", "Videos")</li>
</ul>
}
@helper AddWishList(string retail, bool isFavorite,string techImage,string groupID,string favoriteUrl, bool bol_userLogged) {
string wishListClass = (!bol_userLogged) ? "wishlistContainer hide" : "wishlistContainer";
<div class="col-xs-12 noPadding @wishListClass">
<a rel="nofollow" class="btn-red pull-left" id="favorite" data-favorite="@isFavorite" data-user="@Pageview.User.LoggedIn" data-addText='@Translate("addToFavorites", "Add to Wishlist")' data-removeText='@Translate("removeFromWishlist", "Remove from Wishlist")' href="@favoriteUrl">@Translate(isFavorite ? "Remove from wish list" : "Add to wish list")<i class="fa fa-heart"></i></a>
@*
@if (groupID.ToString() != retail)
{
<a rel="nofollow" class="btn-red pull-left" id="favorite" data-favorite="@isFavorite" data-user="@Pageview.User.LoggedIn" data-addText='@Translate("addToFavorites", "Add to Wishlist")' data-removeText='@Translate("removeFromWishlist", "Remove from Wishlist")' href="@favoriteUrl">@Translate(isFavorite ? "Remove from wish list" : "Add to wish list")<i class="fa fa-heart"></i></a>
}
else {
<a rel="nofollow" class="btn-red pull-left" id="favorite" data-favorite="@isFavorite" data-user="@Pageview.User.LoggedIn" data-addText='@Translate("addToFavoritesRetail", "Add to Purchase List")' data-removeText='@Translate("removeFromPurchaseList", "Remove from Purchase List")' href="@favoriteUrl">@Translate(isFavorite ? "Remove from Purchase List" : "Add to Purchase List")<i class="fa fa-heart"></i></a>
}
*@
@if(GetString("Ecom:Product.PrimaryGroupID").Equals("L3CATALOGS-Catalogs") && !String.IsNullOrEmpty(techImage)) {
var icon = GetIcon(techImage);
<a class="btn-red pull-left" href="@techImage" target="_blank"> @Translate("downloadCatalog", "Download Catalog") <i class="fa @icon"></i></a>
}
</div>
}
@helper RenderRatingReview() {
string str_starClass = "",str_halfStar = "";
<ul class="rating">
@for (int s = 5; s > 0; s--)
{
if (s == Math.Ceiling(GetDouble("Comments.Rating")))
{
str_starClass = "class='star'";
str_halfStar = !(GetDouble("Comments.Rating") - Math.Round(GetDouble("Comments.Rating")) == 0) ? "fa-star-half-o" : "fa-star";
}
else {
str_starClass = "";
str_halfStar = "fa-star";
}
<li data-star="@s" @str_starClass><i class="fa @str_halfStar"></i></li>
}
</ul>
<a id="totalReviews" rel="nofollow" href="javascript:void(0)">@GetDouble("Comments.TotalCount") @Translate("reviews", "Reviews")</a>
}
@helper OrderNow(string currentPage,string productID,string variantID,List<LoopItem> productPrices,string groupID,string inquireLink) {
string str_discountPrice = GetString("Ecom:Product.Price.Price");
string str_productPrice = GetString("Ecom:Product.DBPrice");
string str_myCart = (Pageview.Area.Item["MyCart"] ?? "").ToString();
string str_myMiniCart = (Pageview.Area.Item["MiniCart"] ?? "").ToString();
int num_stock = Convert.ToInt32(Dynamicweb.eCommerce.Products.Product.GetProductByID(productID).Stock); //GetInteger("Ecom:Product.Stock")
List<LoopItem> lst_quantityPrices = productPrices.Where(x => x.GetString("Ecom:Product.Prices.GroupID") == groupID && x.GetInteger("Ecom:Product.Prices.Quantity") < 100).OrderByDescending(p => p.GetInteger("Ecom:Product.Prices.Quantity")).ToList();
<div class="order-now">
<form name="addToCart" class="add-to-cart form-fields" action2='@Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("/Default.aspx?ID=" + str_myCart)' method="post" action="/@str_myMiniCart">
<input type="hidden" name="cartcmd" value="add" />
<input type="hidden" name="productID" value="@productID" />
<input type="hidden" name="variantID" id="variantID" value="@variantID" @((String.IsNullOrEmpty(variantID)) ? "disabled='disabled'" : "") />
@*<input type="hidden" name="redirect" value="false" />*@
@if(!Pageview.Device.ToString().Equals("Desktop") && !String.IsNullOrWhiteSpace(str_myCart)){
str_myMiniCart = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(str_myMiniCart);
<input type="hidden" name="redirect" value="@str_myCart" />
}
<div class="row">
<div class="col-md-6 col-xs-12 ">
<div class="product-price">
@if (Convert.ToDouble(str_discountPrice) < Convert.ToDouble(str_productPrice))
{
<dt>
@Translate("listPrice", "List Price:")
</dt>
<dd class="list-price">
@GetString("Ecom:Product.Currency.Symbol")@str_productPrice
</dd>
}
<dt>
@Translate("priceDetail", "Price:")
</dt>
<dd itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<meta itemprop="price" content="@GetString("Ecom:Product.Price.Price")">
<meta itemprop="priceCurrency" content="@GetString("Ecom:Product.CurrencyCode")">
@GetString("Ecom:Product.Currency.Symbol")@str_discountPrice
</dd>
@if (lst_quantityPrices.Any())
{
<a class="viewPrices" href="#pricesContainer">@Translate("viewPrices", "View quantity discounts")</a>
}
</div>
</div>
<div class="col-xs-12">
<div class="col-xs-12 priceContainer">
<div class="highlight-content text-right">
@if (num_stock > 0)
{
<div class="quantity-container pull-left">
@Translate("quantity", "Quantity")
<input class="quantity" name="Quantity" type="number" value="1" maxlength="4" min="1" />
<small class="clearBoth displayBlock noPadding-xs text-left">@Translate("qtyInStock", "qty in stock"): @num_stock</small>
</div>
<a rel="nofollow" class='btn-blue generalButton btn-action pull-left' id="addToCartSubmit">
@Translate("addToCart", "Add to Cart")@*CUSTOM CODE - removed icon*@
</a>
}
else
{
<a rel="nofollow" class='btn-blue generalButton btn-action pull-left' href='@inquireLink'>
@Translate("availability", "Inquire About Availability")
</a>
}
</div>
</div>
</div>
</div>
</form>
</div>
}
@functions {
public static string StripHtml(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}
public string GetGroupsStructure()
{
List<string[]> groups = new List<string[]>();
Dynamicweb.eCommerce.Products.Group primaryGroup = Dynamicweb.eCommerce.Products.Group.GetGroupByID(GetString("Ecom:Product.PrimaryOrFirstGroupID"), GetString("Ecom:Product.LanguageID"));
groups.Add(new string[] {primaryGroup.Name, Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(String.Format("Default.aspx?ID={0}&GroupID={1}", Pageview.Page.ID, primaryGroup.ID))});
GetGroupsStructureItem(primaryGroup, ref groups);
groups.Reverse();
return new JavaScriptSerializer().Serialize(groups);
}
public void GetGroupsStructureItem(Dynamicweb.eCommerce.Products.Group currentGroup, ref List<string[]> groups)
{
foreach (var g in currentGroup.ParentGroups)
{
groups.Add(new string[] { g.Name, Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(String.Format("Default.aspx?ID={0}&GroupID={1}", Pageview.Page.ID, g.ID)) });
GetGroupsStructureItem(g, ref groups);
}
}
public static string GetFirstUserGroupID(object[] userGroups, List<string> productPricesGroups)
{
string userFirstGroup = "";
foreach (var userGroup in userGroups)
{
if (productPricesGroups.Contains(userGroup.ToString()))
{
userFirstGroup = userGroup.ToString();
break;
}
}
return userFirstGroup;
}
public Dictionary<string, string> GetProductSpecifications()
{
Dictionary<string, string> result = new Dictionary<string, string>();
Dictionary<string, string> customFields = new Dictionary<string, string>();
customFields.Add(GetString("Ecom:Product:Field.BASICLOAD.Name"), GetString("Ecom:Product:Field.BASICLOAD"));
customFields.Add(GetString("Ecom:Product:Field.DYNAMICLOAD.Name"), GetString("Ecom:Product:Field.DYNAMICLOAD"));
customFields.Add(GetString("Ecom:Product:Field.WORKINGTEMP.Name"), GetString("Ecom:Product:Field.WORKINGTEMP"));
customFields.Add(GetString("Ecom:Product:Field.RPMGREASE.Name"), GetString("Ecom:Product:Field.RPMGREASE"));
customFields.Add(GetString("Ecom:Product:Field.RPMOIL.Name"), GetString("Ecom:Product:Field.RPMOIL"));
customFields.Add(GetString("Ecom:Product:Field.RPM.Name"), GetString("Ecom:Product:Field.RPM"));
foreach (var i in GetLoop("ProductCategories"))
{
foreach (var a in i.GetLoop("ProductCategoryFields").Where(s => !string.IsNullOrEmpty(s.GetString("Ecom:Product.CategoryField.Value.Clean")) && s.GetString("Ecom:Product.CategoryField.ID") != "PRODUCT_TYPE"))
{
string key = a.GetString("Ecom:Product.CategoryField.Label"),
value = a.GetString("Ecom:Product.CategoryField.Value");
if(!result.ContainsKey(a.GetString("Ecom:Product.CategoryField.Label"))){
result.Add(key, value);
}
}
}
foreach(KeyValuePair<string, string> cf in customFields)
{
if(!result.ContainsKey(cf.Key))
{
result.Add(cf.Key, cf.Value);
}
}
return result;//.OrderBy(i => i.Key).ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);
}
}
<!-- TODO can only be solved after the URL problems
Must open in the final page instead of the search page.
And replace all globalvalue to pageview property
-->
@SnippetStart("OGMeta")
<meta property="og:title" content='@str_productName' />
<meta property="og:image" content='@GetGlobalValue("Global:Request.Scheme")://@GetGlobalValue("Global:Request.Host")@str_productGetImage' />
<meta property="og:site_name" content='@GetGlobalValue("Global:Area.Name")' />
<meta property="og:url" content='@GetGlobalValue("Global:Request.Scheme")://@GetGlobalValue("Global:Request.Host")@GetGlobalValue("Global:Pageview.Url")' />
<meta property="og:description" content='@Dynamicweb.Base.TeaserString(StripHtml(str_metaDescription), 155, "...")' />
<meta property="og:type" content="article" />
<meta property="og:locale" content='@GetGlobalValue("Global:Area.LongLang").Replace("-", "_")' />
@SnippetEnd("OGMeta")
@RenderSnippet("cadFiles")
@SnippetStart("jsEndBody")
<!-- Google Code for Remarketing Tag -->
<script type="text/javascript">
var google_tag_params = {
ecomm_prodid: '@str_productId',
ecomm_pagetype: 'Product-Pages',
ecomm_totalvalue: @GetString("Ecom:Product.Price.Price")
};
</script>
<script type="text/javascript">
/* <![CDATA[ */
var google_conversion_id = 0; //1023402208
var google_custom_params = window.google_tag_params;
var google_remarketing_only = true;
/* ]]> */
</script>
<script type="text/javascript" src="//www.googleadservices.com/pagead/conversion.js">
</script>
<noscript>
<div style="display:inline;">
<img height="1" width="1" style="border-style:none;" alt="" src="//googleads.g.doubleclick.net/pagead/viewthroughconversion/1023402208/?guid=ON&script=0"/>
</div>
</noscript>
<script type="text/javascript">
var sidecar = sidecar || {};
sidecar.product_info = {
group_id: '@sideCartInfo'
};
</script>
@SnippetEnd("jsEndBody")