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); } }
/// <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; } }
/// <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 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; } }
/// <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(); }
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); }
/// <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; } }