Beispiel #1
0
        public ParsedFilter Parse(FilterDescription definition, CommerceDataSourceContext context)
        {
            var paramValues = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase);

            foreach (var paramDef in definition.Parameters)
            {
                var param = ParameterValues.Find(p => p.ParameterName.Equals(paramDef.Name, StringComparison.OrdinalIgnoreCase));

                // Parameter is required but it's missing in data source settings (might cause by code changes). Parse failed.
                if (paramDef.Required && param == null)
                {
                    return(null);
                }

                var strParamValue = ParameterizedFieldValue.GetFieldValue(param.ParameterValue, context.ValueProvider);
                // Parameter is required but it's missing in current context. Parse failed.
                if (paramDef.Required && strParamValue == null)
                {
                    return(null);
                }

                var paramValue = StringConvert.ToObject(strParamValue, paramDef.ValueType);
                paramValues.Add(paramDef.Name, paramValue);
            }

            return(new ParsedFilter(definition.Name)
            {
                ParameterValues = paramValues
            });
        }
Beispiel #2
0
        public void OnResolvedPage(System.Web.Mvc.ControllerContext controllerContext, CMS.Sites.View.PageRequestContext pageRequestContext)
        {
            var page = pageRequestContext.Page;

            if (!page.CustomFields.ContainsKey("ProductId"))
            {
                return;
            }

            var value = ParameterizedFieldValue.GetFieldValue(page.CustomFields["ProductId"], pageRequestContext.GetValueProvider());

            if (String.IsNullOrEmpty(value))
            {
                return;
            }

            int productId;

            if (Int32.TryParse(value, out productId))
            {
                BehaviorReceivers.Receive(Site.Current.GetCommerceInstanceName(),
                                          new Behavior
                {
                    Type   = BehaviorTypes.View,
                    ItemId = productId.ToString(),
                    UserId = controllerContext.RequestContext.HttpContext.EnsureVisitorUniqueId()
                });
            }
        }
Beispiel #3
0
        private int EvaluatePageSize(CommerceDataSourceContext context)
        {
            var pageSize = ParameterizedFieldValue.GetFieldValue(PageSize, context.ValueProvider);

            if (String.IsNullOrEmpty(pageSize))
            {
                return(60);
            }

            return(Convert.ToInt32(pageSize));
        }
Beispiel #4
0
        public Filter Parse(IValueProvider valueProvider)
        {
            var parsed = new Filter
            {
                Name              = Name,
                Fields            = Fields,
                UseRangeFiltering = UseRangeFiltering,
                FieldValue        = ParameterizedFieldValue.GetFieldValue(FieldValue, valueProvider),
                FromValue         = ParameterizedFieldValue.GetFieldValue(FromValue, valueProvider),
                FromInclusive     = FromInclusive,
                ToValue           = ParameterizedFieldValue.GetFieldValue(ToValue, valueProvider),
                ToInclusive       = ToInclusive,
                AnalyzeInput      = AnalyzeInput
            };

            return(parsed);
        }
Beispiel #5
0
        private int EvaluatePageNumber(CommerceDataSourceContext context)
        {
            var pageNumber = ParameterizedFieldValue.GetFieldValue(PageNumber, context.ValueProvider);

            if (String.IsNullOrEmpty(pageNumber))
            {
                return(1);
            }

            var page = Convert.ToInt32(pageNumber);

            if (page < 1)
            {
                page = 1;
            }

            return(page);
        }
Beispiel #6
0
        public object Execute(CommerceDataSourceContext context)
        {
            var culture = CultureInfo.InvariantCulture;

            if (!String.IsNullOrEmpty(context.Site.Culture))
            {
                var languageStore = LanguageStores.Get(context.Instance);
                if (languageStore.Exists(context.Site.Culture))
                {
                    culture = CultureInfo.GetCultureInfo(context.Site.Culture);
                }
            }

            var store = IndexStores.Get <ProductModel>(context.Instance, culture);
            var query = store.Query();

            // Apply defined filters
            if (Filters != null)
            {
                query = query.ApplyFilters(ParseFilters(context), culture);
            }

            // Apply implicit facet filters repsented in url query
            IList <Filter> facetFilters = null;

            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                facetFilters = GetFacetFilters(context);
                if (facetFilters.Count > 0)
                {
                    query = query.ApplyFilters(facetFilters, culture);
                }
            }

            // Apply sorting
            var sortField = ParameterizedFieldValue.GetFieldValue(SortField, context.ValueProvider);

            if (!String.IsNullOrEmpty(sortField))
            {
                query.AddOrderBy(sortField);
            }

            // Execute result
            var result = new ProductSearchResult();

            var pagination = query.Paginate(EvaluatePageNumber(context) - 1, EvaluatePageSize(context));

            result.Total    = pagination.TotalItems;
            result.Products = ToProducts(pagination.Cast <ProductModel>().ToList(), context.Site.Commerce());

            // Get facets
            if (IncludeFacets && Facets != null && Facets.Count > 0)
            {
                result.Facets = query.ToFacets(Facets);

                // Generate facet urls
                var url = HttpContext.Current.Request.RawUrl;

                CategoryTree localizedCategoryTree = null;

                foreach (var facetResult in result.Facets)
                {
                    // Categories are in tree structure, and all level of categories of a product are indexed for seaier search.
                    // If Category facet is not presented in url query, we should only return the ROOT level categories.
                    // If Category facet is presented in url query, we should only return it's children categories.
                    // Otherwise there'll be too many category results.
                    if (facetResult.Field == FacetDefinition.Category.Field)
                    {
                        if (localizedCategoryTree == null)
                        {
                            localizedCategoryTree = CategoryTree.Get(context.Instance).Localize(culture, "Name");
                        }

                        var filter = facetFilters.FirstOrDefault(f => f.Name == FacetDefinition.Category.Name);

                        if (filter != null)
                        {
                            var category = localizedCategoryTree.Desendants().FirstOrDefault(c => c.Name == filter.FieldValue);
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!category.Children.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                        else
                        {
                            foreach (var value in facetResult.Values.ToList())
                            {
                                if (!localizedCategoryTree.Categories.Any(c => c.Name == value.Term))
                                {
                                    facetResult.Values.Remove(value);
                                }
                            }
                        }
                    }

                    foreach (var value in facetResult.Values)
                    {
                        var paramName = facetResult.Name;
                        value.Url = UrlUtility.RemoveQuery(url, paramName);
                        value.Url = UrlUtility.AddQueryParam(value.Url, paramName, value.Term);
                    }
                }
            }

            return(result);
        }
Beispiel #7
0
 public string GetFieldValue(string field)
 {
     return(ParameterizedFieldValue.GetFieldValue(field, ValueProvider));
 }