示例#1
0
            public virtual void PrepareSpecsFilters(
                Category category,
                int productsTotalAmount,
                IEnumerable <SpecificationAttributeService.SpecificationAttributeOptionWithCount> allOptionsCountTbl,
                IList <int> alreadyFilteredSpecOptionIds,
                IList <int> filterableSpecificationAttributeOptionIds,
                ISpecificationAttributeService specificationAttributeService,
                IWebHelper webHelper,
                IWorkContext workContext)
            {
                var allFilters = new List <SpecificationAttributeOptionFilter>();

                if (filterableSpecificationAttributeOptionIds != null)
                {
                    // Для оптимизации нужно вытащить сразу все спецификации и их значения
                    var allSpecsAttribs = specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttributeList(filterableSpecificationAttributeOptionIds);

                    foreach (var sao in allSpecsAttribs)         // цикл по айдишникам значений
                    {
                        if (sao != null)
                        {
                            var sa = sao.SpecificationAttribute;                 // вытаскиваем из БД спецификацию
                            if (sa != null)
                            {
                                // не показываем для некоторых категорий некоторые фильтры
                                bool isShowInFilter;
                                bool isShowInShortDescription;
                                YandexMarketHelpers.IsSpecAllow(sa.Name, new List <Category>()
                                {
                                    category
                                }, out isShowInFilter, out isShowInShortDescription);

                                if (!isShowInFilter)
                                {
                                    continue;
                                }



                                int existTimes = GetSpecificationAttributeOptionExistTimesInFilteredProducts(allOptionsCountTbl, sao.Id);

                                allFilters.Add(
                                    new SpecificationAttributeOptionFilter
                                {
                                    SpecificationAttributeId                 = sa.Id,
                                    SpecificationAttributeName               = sa.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                                    SpecificationAttributeDisplayOrder       = sa.DisplayOrder,
                                    SpecificationAttributeOptionId           = sao.Id,
                                    SpecificationAttributeOptionName         = sao.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                                    SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder,
                                    SpecificationAttributeOptionExistTimesInFilteredProducts = existTimes
                                });
                            }
                        }
                    }         // end for
                }

                //sort loaded options
                allFilters = allFilters.OrderBy(saof => saof.SpecificationAttributeDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeName)
                             .ThenBy(saof => saof.SpecificationAttributeOptionDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeOptionName, new SpecOptionComp()).ToList();

                //get already filtered specification options
                var alreadyFilteredOptions = allFilters
                                             .Where(x => alreadyFilteredSpecOptionIds.Contains(x.SpecificationAttributeOptionId))
                                             .Select(x => x)
                                             .ToList();

                //get not filtered specification options
                var notFilteredOptions = new List <SpecificationAttributeOptionFilter>();

                foreach (var saof in allFilters)
                {
                    //do not add already filtered specification options
                    if (alreadyFilteredOptions.FirstOrDefault(x => x.SpecificationAttributeId == saof.SpecificationAttributeId) != null)
                    {
                        continue;
                    }

                    //else add it
                    if (productsTotalAmount != saof.SpecificationAttributeOptionExistTimesInFilteredProducts)
                    {
                        notFilteredOptions.Add(saof);
                    }
                }

                //prepare the model properties
                if (alreadyFilteredOptions.Count > 0 || notFilteredOptions.Count > 0)
                {
                    this.Enabled = true;

                    this.AlreadyFilteredItems = alreadyFilteredOptions.ToList().Select(x =>
                    {
                        var item = new SpecificationFilterItem();
                        item.SpecificationAttributeName       = x.SpecificationAttributeName;
                        item.SpecificationAttributeOptionName = RemoveHtmlTags(x.SpecificationAttributeOptionName);

                        //filter URL
                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            alreadyFilteredOptionIds.Remove(x.SpecificationAttributeOptionId);                            // add to old list me
                        }
                        string newQueryParam = GenerateFilteredSpecQueryParam(alreadyFilteredOptionIds);
                        string filterUrl     = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM + "=" + newQueryParam, null);
                        filterUrl            = ExcludeQueryStringParams(filterUrl, webHelper);
                        item.FilterUrl       = filterUrl;

                        return(item);
                    }).ToList();

                    this.NotFilteredItems = notFilteredOptions.ToList().Select(x =>
                    {
                        var item = new SpecificationFilterItem();
                        item.SpecificationAttributeName       = x.SpecificationAttributeName;
                        item.SpecificationAttributeOptionName = RemoveHtmlTags(x.SpecificationAttributeOptionName);
                        item.SpecificationAttributeOptionExistTimesInFilteredProducts = x.SpecificationAttributeOptionExistTimesInFilteredProducts;

                        //filter URL
                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);                            // add to old list me
                        }
                        string newQueryParam = GenerateFilteredSpecQueryParam(alreadyFilteredOptionIds);
                        string filterUrl     = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM + "=" + newQueryParam, null);
                        filterUrl            = ExcludeQueryStringParams(filterUrl, webHelper);
                        item.FilterUrl       = filterUrl;

                        return(item);
                    }).ToList();


                    //remove filter URL
                    string removeFilterUrl = webHelper.RemoveQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM);
                    removeFilterUrl      = ExcludeQueryStringParams(removeFilterUrl, webHelper);
                    this.RemoveFilterUrl = removeFilterUrl;
                }
                else
                {
                    this.Enabled = false;
                }
            }