Exemplo n.º 1
0
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    IList <int> filterableSpecificationAttributeOptionIds,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper,
                                                    IWorkContext workContext)
            {
                var specificationAttributeOptions = specificationAttributeService.GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds);
                SpecificationFilterGroup specificationFilterGroup = null;

                foreach (var specificationGroup in specificationAttributeOptions.GroupBy(sao => sao.SpecificationAttributeId))
                {
                    var specification = specificationGroup.FirstOrDefault().SpecificationAttribute;
                    specificationFilterGroup = new SpecificationFilterGroup()
                    {
                        Name = specification.GetLocalized(x => x.Name), Id = specification.Id
                    };

                    foreach (var item in specificationGroup)
                    {
                        specificationFilterGroup.Items.Add(new SpecificationFilterItem()
                        {
                            Id = item.Id, Name = item.GetLocalized(x => x.Name), State = alreadyFilteredSpecOptionIds.Contains(item.Id)?FilterItemState.Checked:FilterItemState.Unchecked
                        });
                    }
                    this.Groups.Add(specificationFilterGroup);
                }
            }
Exemplo n.º 2
0
            /// <summary>
            /// Prepare model
            /// </summary>
            /// <param name="alreadyFilteredSpecOptionIds">IDs of already filtered specification options</param>
            /// <param name="filterableSpecificationAttributeOptionIds">IDs of filterable specification options</param>
            /// <param name="specificationAttributeService"></param>
            /// <param name="webHelper">Web helper</param>
            /// <param name="workContext">Work context</param>
            /// <param name="cacheManager">Cache manager</param>
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    int[] filterableSpecificationAttributeOptionIds,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper, IWorkContext workContext, ICacheManager cacheManager)
            {
                Enabled = false;
                var optionIds = filterableSpecificationAttributeOptionIds != null
                    ? string.Join(",", filterableSpecificationAttributeOptionIds) : string.Empty;

                var cacheKey = string.Format(ModelCacheEventConsumer.SPECS_FILTER_MODEL_KEY, optionIds, workContext.WorkingLanguage.Id);

                var allOptions = specificationAttributeService.GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds);
                var allFilters = cacheManager.Get(cacheKey, () => allOptions.Select(sao =>
                                                                                    new SpecificationAttributeOptionFilter
                {
                    SpecificationAttributeId                 = sao.SpecificationAttribute.Id,
                    SpecificationAttributeName               = sao.SpecificationAttribute.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                    SpecificationAttributeDisplayOrder       = sao.SpecificationAttribute.DisplayOrder,
                    SpecificationAttributeOptionId           = sao.Id,
                    SpecificationAttributeOptionName         = sao.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                    SpecificationAttributeOptionColorRgb     = sao.ColorSquaresRgb,
                    SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder
                }).ToList());

                if (!allFilters.Any())
                {
                    return;
                }

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

                //prepare the model properties
                Enabled = true;
                var removeFilterUrl = webHelper.RemoveQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM);

                RemoveFilterUrl = ExcludeQueryStringParams(removeFilterUrl, webHelper);

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

                AlreadyFilteredItems = alreadyFilteredOptions.Select(x =>
                                                                     new SpecificationFilterItem
                {
                    SpecificationAttributeName           = x.SpecificationAttributeName,
                    SpecificationAttributeOptionName     = x.SpecificationAttributeOptionName,
                    SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb
                }).ToList();

                //get not filtered specification options
                NotFilteredItems = allFilters.Except(alreadyFilteredOptions).Select(x =>
                {
                    //filter URL
                    var alreadyFiltered = alreadyFilteredSpecOptionIds.Concat(new List <int> {
                        x.SpecificationAttributeOptionId
                    });
                    var queryString = string.Format("{0}={1}", QUERYSTRINGPARAM, GenerateFilteredSpecQueryParam(alreadyFiltered.ToList()));
                    var filterUrl   = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), queryString, null);

                    return(new SpecificationFilterItem()
                    {
                        SpecificationAttributeName = x.SpecificationAttributeName,
                        SpecificationAttributeOptionName = x.SpecificationAttributeOptionName,
                        SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb,
                        FilterUrl = ExcludeQueryStringParams(filterUrl, webHelper)
                    });
                }).ToList();
            }
            public virtual void PrepareSpecsFilters(IList<int> alreadyFilteredSpecOptionIds,
                IList<int> filterableSpecificationAttributeOptionIds,
                ISpecificationAttributeService specificationAttributeService, 
                IWebHelper webHelper,
                IWorkContext workContext)
            {
                var allFilters = new List<SpecificationAttributeOptionFilter>();
                var specificationAttributeOptions = specificationAttributeService
                    .GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds != null ?
                    filterableSpecificationAttributeOptionIds.ToArray() : null);
                foreach (var sao in specificationAttributeOptions)
                {
                    var sa = sao.SpecificationAttribute;
                    if (sa != null)
                    {
                        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
                        });
                    }
                }

                //sort loaded options
                allFilters = allFilters.OrderBy(saof => saof.SpecificationAttributeDisplayOrder)
                    .ThenBy(saof => saof.SpecificationAttributeName)
                    .ThenBy(saof => saof.SpecificationAttributeOptionDisplayOrder)
                    .ThenBy(saof => saof.SpecificationAttributeOptionName).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
                    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 = x.SpecificationAttributeOptionName;

                        return item;
                    }).ToList();

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

                        //filter URL
                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                            alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                        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;
                }
            }
Exemplo n.º 4
0
            /// <summary>
            /// Prepare model
            /// </summary>
            /// <param name="alreadyFilteredSpecOptionIds">IDs of already filtered specification options</param>
            /// <param name="filterableSpecificationAttributeOptionIds">IDs of filterable specification options</param>
            /// <param name="specificationAttributeService"></param>
            /// <param name="webHelper">Web helper</param>
            /// <param name="workContext">Work context</param>
            /// <param name="cacheManager">Cache manager</param>
            public virtual void PrepareSpecsFilters(IList<int> alreadyFilteredSpecOptionIds,
                int[] filterableSpecificationAttributeOptionIds,
                ISpecificationAttributeService specificationAttributeService, 
                IWebHelper webHelper, IWorkContext workContext, ICacheManager cacheManager)
            {
                Enabled = false;
                var optionIds = filterableSpecificationAttributeOptionIds != null
                    ? string.Join(",", filterableSpecificationAttributeOptionIds) : string.Empty;
                var cacheKey = string.Format(ModelCacheEventConsumer.SPECS_FILTER_MODEL_KEY, optionIds, workContext.WorkingLanguage.Id);

                var allOptions = specificationAttributeService.GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds);
                var allFilters = cacheManager.Get(cacheKey, () => allOptions.Select(sao =>
                    new SpecificationAttributeOptionFilter
                    {
                        SpecificationAttributeId = sao.SpecificationAttribute.Id,
                        SpecificationAttributeName = sao.SpecificationAttribute.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                        SpecificationAttributeDisplayOrder = sao.SpecificationAttribute.DisplayOrder,
                        SpecificationAttributeOptionId = sao.Id,
                        SpecificationAttributeOptionName = sao.GetLocalized(x => x.Name, workContext.WorkingLanguage.Id),
                        SpecificationAttributeOptionColorRgb = sao.ColorSquaresRgb,
                        SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder
                    }).ToList());

                if (!allFilters.Any())
                    return;

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

                //prepare the model properties
                Enabled = true;
                var removeFilterUrl = webHelper.RemoveQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM);
                RemoveFilterUrl = ExcludeQueryStringParams(removeFilterUrl, webHelper);

                //get already filtered specification options
                var alreadyFilteredOptions = allFilters.Where(x => alreadyFilteredSpecOptionIds.Contains(x.SpecificationAttributeOptionId));
                AlreadyFilteredItems = alreadyFilteredOptions.Select(x =>
                    new SpecificationFilterItem
                    {
                        SpecificationAttributeName = x.SpecificationAttributeName,
                        SpecificationAttributeOptionName = x.SpecificationAttributeOptionName,
                        SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb
                    }).ToList();

                //get not filtered specification options
                NotFilteredItems = allFilters.Except(alreadyFilteredOptions).Select(x =>
                {
                    //filter URL
                    var alreadyFiltered = alreadyFilteredSpecOptionIds.Concat(new List<int> { x.SpecificationAttributeOptionId });
                    var queryString = string.Format("{0}={1}", QUERYSTRINGPARAM, GenerateFilteredSpecQueryParam(alreadyFiltered.ToList()));
                    var filterUrl = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), queryString, null);

                    return new SpecificationFilterItem()
                    {
                        SpecificationAttributeName = x.SpecificationAttributeName,
                        SpecificationAttributeOptionName = x.SpecificationAttributeOptionName,
                        SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb,
                        FilterUrl = ExcludeQueryStringParams(filterUrl, webHelper)
                    };
                }).ToList();
            }
Exemplo n.º 5
0
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    IList <int> filterableSpecificationAttributeOptionIds,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper,
                                                    IWorkContext workContext)
            {
                var allFilters = new List <SpecificationAttributeOptionFilter>();
                var specificationAttributeOptions = specificationAttributeService
                                                    .GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds != null ?
                                                                                           filterableSpecificationAttributeOptionIds.ToArray() : null);

                foreach (var sao in specificationAttributeOptions)
                {
                    var sa = sao.SpecificationAttribute;
                    if (sa != null)
                    {
                        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
                        });
                    }
                }

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

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

                foreach (var saof in allFilters)
                {
                    allFilteredOptions.Add(saof);
                }

                //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
                    notFilteredOptions.Add(saof);
                }

                //prepare the model properties

                this.AllFilteredItems = allFilteredOptions.ToList().Select(x =>
                {
                    var item = new SpecificationFilterItem();
                    item.SpecificationAttributeName       = x.SpecificationAttributeName;
                    item.SpecificationAttributeOptionName = x.SpecificationAttributeOptionName;
                    item.SpecificationAttributeOptionId   = x.SpecificationAttributeOptionId;

                    //filter URL
                    var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);

                    if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                    {
                        alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                    }
                    else
                    {
                        item.isSelected = true;
                        alreadyFilteredOptionIds.Remove(x.SpecificationAttributeOptionId);
                    }
                    string newQueryParam = GenerateFilteredSpecQueryParam(alreadyFilteredOptionIds);
                    string filterUrl     = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM + "=" + newQueryParam, null);
                    filterUrl            = ExcludeQueryStringParams(filterUrl, webHelper);
                    item.FilterUrl       = filterUrl;

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

                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 = x.SpecificationAttributeOptionName;

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

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

                        //filter URL
                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                        }
                        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;
                }
            }
Exemplo n.º 6
0
            /// <summary>
            /// Prepare model
            /// </summary>
            /// <param name="alreadyFilteredSpecOptionIds">IDs of already filtered specification options</param>
            /// <param name="filterableSpecificationAttributeOptionIds">IDs of filterable specification options</param>
            /// <param name="specificationAttributeService"></param>
            /// <param name="localizationService">Localization service</param>
            /// <param name="webHelper">Web helper</param>
            /// <param name="workContext">Work context</param>
            /// <param name="staticCacheManager">Cache manager</param>
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    int[] filterableSpecificationAttributeOptionIds,
                                                    ISpecificationAttributeService specificationAttributeService, ILocalizationService localizationService,
                                                    IWebHelper webHelper, IWorkContext workContext, IStaticCacheManager staticCacheManager)
            {
                Enabled = false;
                var cacheKey = staticCacheManager.PrepareKeyForDefaultCache(NopModelCacheDefaults.SpecsFilterModelKey, filterableSpecificationAttributeOptionIds, workContext.WorkingLanguage);

                var allOptions = specificationAttributeService.GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds);
                var allFilters = staticCacheManager.Get(cacheKey, () => allOptions.Select(sao =>
                {
                    var specAttribute = specificationAttributeService.GetSpecificationAttributeById(sao.SpecificationAttributeId);

                    return(new SpecificationAttributeOptionFilter
                    {
                        SpecificationAttributeId = specAttribute.Id,
                        SpecificationAttributeName = localizationService.GetLocalized(specAttribute, x => x.Name, workContext.WorkingLanguage.Id),
                        SpecificationAttributeDisplayOrder = specAttribute.DisplayOrder,
                        SpecificationAttributeOptionId = sao.Id,
                        SpecificationAttributeOptionName = localizationService.GetLocalized(sao, x => x.Name, workContext.WorkingLanguage.Id),
                        SpecificationAttributeOptionColorRgb = sao.ColorSquaresRgb,
                        SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder
                    });
                }).ToList());

                if (!allFilters.Any())
                {
                    return;
                }

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

                //prepare the model properties
                Enabled = true;
                var removeFilterUrl = webHelper.RemoveQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM);

                RemoveFilterUrl = ExcludeQueryStringParams(removeFilterUrl, webHelper);

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

                AlreadyFilteredItems = alreadyFilteredOptions.Select(x =>
                                                                     new SpecificationFilterItem
                {
                    SpecificationAttributeName           = x.SpecificationAttributeName,
                    SpecificationAttributeOptionName     = x.SpecificationAttributeOptionName,
                    SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb
                }).ToList();

                //get not filtered specification options
                NotFilteredItems = allFilters.Except(alreadyFilteredOptions).Select(x =>
                {
                    //filter URL
                    var alreadyFiltered = alreadyFilteredSpecOptionIds.Concat(new List <int> {
                        x.SpecificationAttributeOptionId
                    });
                    var filterUrl = webHelper.ModifyQueryString(webHelper.GetThisPageUrl(true), QUERYSTRINGPARAM,
                                                                alreadyFiltered.OrderBy(id => id).Select(id => id.ToString()).ToArray());

                    return(new SpecificationFilterItem()
                    {
                        SpecificationAttributeName = x.SpecificationAttributeName,
                        SpecificationAttributeOptionName = x.SpecificationAttributeOptionName,
                        SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb,
                        FilterUrl = ExcludeQueryStringParams(filterUrl, webHelper)
                    });
                }).ToList();
            }
Exemplo n.º 7
0
        public IList <Product> GetProducts(out IList <SpecificationItemDto> alreadyFilteredItems,
                                           out IList <SpecificationItemDto> notFilteredItems,
                                           IList <int> ids       = null,
                                           DateTime?createdAtMin = null, DateTime?createdAtMax           = null, DateTime?updatedAtMin = null, DateTime?updatedAtMax = null,
                                           int limit             = Configurations.DefaultLimit, int page = Configurations.DefaultPageValue, int sinceId = Configurations.DefaultSinceId,
                                           int?categoryId        = null, string vendorName               = null, bool?publishedStatus = null, IList <int> alreadyFilteredSpecOptionIds = null)
        {
            if (alreadyFilteredSpecOptionIds == null)
            {
                alreadyFilteredSpecOptionIds = new List <int>();
            }
            var categoryIds = categoryId != null ? new List <int> {
                categoryId.Value
            } : null;

            if (categoryIds != null)
            {
                categoryIds.AddRange(_categoryService.GetChildCategoryIds(parentCategoryId: categoryId.Value));
            }
            var products = _productService.SearchProducts(out IList <int> filterableSpecificationAttributeOptionIds,
                                                          loadFilterableSpecificationAttributeOptionIds: true,
                                                          pageIndex: page - 1,
                                                          pageSize: limit,
                                                          categoryIds: categoryIds,
                                                          filteredSpecs: alreadyFilteredSpecOptionIds
                                                          );

            var optionIds = filterableSpecificationAttributeOptionIds != null
                    ? string.Join(",", filterableSpecificationAttributeOptionIds) : string.Empty;

            var cacheKey = string.Format(SPECS_FILTER_MODEL_KEY, optionIds, _workContext.WorkingLanguage.Id);

            var allOptions = _specificationAttributeService.GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds.ToArray());
            var allFilters = _cacheManager.Get(cacheKey, () => allOptions.Select(sao =>
                                                                                 new SpecificationAttributeOptionFilter
            {
                SpecificationAttributeId                 = sao.SpecificationAttribute.Id,
                SpecificationAttributeName               = _localizationService.GetLocalized(sao.SpecificationAttribute, x => x.Name, _workContext.WorkingLanguage.Id),
                SpecificationAttributeDisplayOrder       = sao.SpecificationAttribute.DisplayOrder,
                SpecificationAttributeOptionId           = sao.Id,
                SpecificationAttributeOptionName         = _localizationService.GetLocalized(sao, x => x.Name, _workContext.WorkingLanguage.Id),
                SpecificationAttributeOptionColorRgb     = sao.ColorSquaresRgb,
                SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder
            }).ToList());

            if (allFilters.Any())
            {
                //sort loaded options
                allFilters = allFilters.OrderBy(saof => saof.SpecificationAttributeDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeName)
                             .ThenBy(saof => saof.SpecificationAttributeOptionDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeOptionName).ToList();
            }

            //prepare the model properties

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

            alreadyFilteredItems = alreadyFilteredOptions.Select(x =>
                                                                 new SpecificationItemDto
            {
                SpecificationAttributeOptionId       = x.SpecificationAttributeOptionId,
                SpecificationAttributeName           = x.SpecificationAttributeName,
                SpecificationAttributeOptionName     = x.SpecificationAttributeOptionName,
                SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb,
                SpecificationAttributeFilterIds      = string.Join(',', alreadyFilteredSpecOptionIds.Where(i => i != x.SpecificationAttributeOptionId))
            }).ToList();

            //get not filtered specification options
            notFilteredItems = allFilters.Except(alreadyFilteredOptions).Select(x =>
            {
                //filter URL
                var alreadyFiltered = alreadyFilteredSpecOptionIds.Concat(new List <int> {
                    x.SpecificationAttributeOptionId
                });

                return(new SpecificationItemDto
                {
                    SpecificationAttributeOptionId = x.SpecificationAttributeOptionId,
                    SpecificationAttributeName = x.SpecificationAttributeName,
                    SpecificationAttributeOptionName = x.SpecificationAttributeOptionName,
                    SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb,
                    SpecificationAttributeFilterIds = string.Join(',', alreadyFiltered)
                });
            }).ToList();

            return(products);
        }
Exemplo n.º 8
0
            /// <summary>
            /// Prepare model
            /// </summary>
            /// <param name="alreadyFilteredSpecOptionIds">IDs of already filtered specification options</param>
            /// <param name="filterableSpecificationAttributeOptionIds">IDs of filterable specification options</param>
            /// <param name="specificationAttributeService"></param>
            /// <param name="webHelper">Web helper</param>
            /// <param name="workContext">Work context</param>
            /// <param name="cacheManager">Cache manager</param>
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    int[] filterableSpecificationAttributeOptionIds,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper,
                                                    IWorkContext workContext,
                                                    ICacheManager cacheManager)
            {
                string cacheKey = string.Format(ModelCacheEventConsumer.SPECS_FILTER_MODEL_KEY,
                                                filterableSpecificationAttributeOptionIds != null ? string.Join(",", filterableSpecificationAttributeOptionIds) : "",
                                                workContext.WorkingLanguage.Id);
                var allFilters = cacheManager.Get(cacheKey, () =>
                                                  specificationAttributeService
                                                  .GetSpecificationAttributeOptionsByIds(filterableSpecificationAttributeOptionIds)
                                                  .Select(sao =>
                {
                    var sa = sao.SpecificationAttribute;
                    return(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),
                        SpecificationAttributeOptionColorRgb = sao.ColorSquaresRgb,
                        SpecificationAttributeOptionDisplayOrder = sao.DisplayOrder
                    });
                })
                                                  .ToList());

                //sort loaded options
                allFilters = allFilters.OrderBy(saof => saof.SpecificationAttributeDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeName)
                             .ThenBy(saof => saof.SpecificationAttributeOptionDisplayOrder)
                             .ThenBy(saof => saof.SpecificationAttributeOptionName).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
                    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
                        {
                            SpecificationAttributeName           = x.SpecificationAttributeName,
                            SpecificationAttributeOptionName     = x.SpecificationAttributeOptionName,
                            SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb
                        };

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

                    this.NotFilteredItems = notFilteredOptions.ToList().Select(x =>
                    {
                        var item = new SpecificationFilterItem()
                        {
                            SpecificationAttributeName           = x.SpecificationAttributeName,
                            SpecificationAttributeOptionName     = x.SpecificationAttributeOptionName,
                            SpecificationAttributeOptionColorRgb = x.SpecificationAttributeOptionColorRgb
                        };

                        //filter URL
                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                        }
                        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;
                }
            }