private void SaveSpecList(Product product, IEnumerable <YandexMarketSpecRecord> specList, int shopCategoryId, IEnumerable <SpecificationAttribute> allSpecAttrList) { var psaList = new List <ProductSpecificationAttribute>(); var category = _categoryService.GetCategoryById(shopCategoryId); foreach (var yandexMarketSpecRecord in specList) { var attributeOptionId = FindAttributeOptionId(yandexMarketSpecRecord.Key, yandexMarketSpecRecord.Value, allSpecAttrList); bool isShowInFilter; bool isShowInShortDescription; YandexMarketHelpers.IsSpecAllow(yandexMarketSpecRecord.Key, new List <Category>() { category }, out isShowInFilter, out isShowInShortDescription); var psa = new ProductSpecificationAttribute() { SpecificationAttributeOptionId = attributeOptionId, ProductId = product.Id, AllowFiltering = isShowInFilter, ShowOnProductPage = true, }; psaList.Add(psa); } _specificationAttributeService.InsertProductSpecificationAttributeList(psaList); }
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; } }