Esempio n. 1
0
        public ActionResult OptionList(int specificationAttributeId, GridCommand command)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageCatalog))
            {
                return(AccessDeniedView());
            }

            var options   = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttributeId);
            var gridModel = new GridModel <SpecificationAttributeOptionModel>
            {
                Data = options.Select(x =>
                {
                    var model = x.ToModel();
                    //locales
                    //AddLocales(_languageService, model.Locales, (locale, languageId) =>
                    //{
                    //    locale.Name = x.GetLocalized(y => y.Name, languageId, false, false);
                    //});
                    return(model);
                }),
                Total = options.Count()
            };

            return(new JsonResult
            {
                Data = gridModel
            });
        }
Esempio n. 2
0
        public ActionResult OptionList(int specificationAttributeId, DataSourceRequest command)
        {
            if (!_permissionService.Authorize(StandardPermissionProvider.ManageAttributes))
            {
                return(AccessDeniedView());
            }

            var options   = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttributeId);
            var gridModel = new DataSourceResult
            {
                Data = options.Select(x =>
                {
                    var model = x.ToModel();
                    //in order to save performance to do not check whether a product is deleted, etc
                    model.NumberOfAssociatedProducts = _specificationAttributeService
                                                       .GetProductSpecificationAttributeCount(0, x.Id);
                    //locales
                    //AddLocales(_languageService, model.Locales, (locale, languageId) =>
                    //{
                    //    locale.Name = x.GetLocalized(y => y.Name, languageId, false, false);
                    //});
                    return(model);
                }),
                Total = options.Count()
            };

            return(Json(gridModel));
        }
Esempio n. 3
0
        public IActionResult GetOptionsBySpecificationAttributeId(int id, string fields = "")
        {
            if (id <= 0)
            {
                return(Error(HttpStatusCode.BadRequest, "id", "invalid id"));
            }

            var specificationAttributeOptions = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(id);

            if (specificationAttributeOptions == null)
            {
                return(Error(HttpStatusCode.NotFound, "specification attribute options", "not found"));
            }

            IList <SpecificationAttributeOptionDto> attributesOptionAsDtos = specificationAttributeOptions.Select(specificAttribute =>
            {
                return(_dtoHelper.PrepareSpecificationAttributeOptionDTO(specificAttribute));
            }).ToList();

            var productAttributesRootObject = new SpecificationAttributesOptionRootObjectDto()
            {
                SpecificationAttributeOptions = attributesOptionAsDtos
            };

            var json = JsonFieldsSerializer.Serialize(productAttributesRootObject, fields);

            return(new RawJsonActionResult(json));
        }
        /// <summary>
        /// Prepare paged specification attribute option list model
        /// </summary>
        /// <param name="searchModel">Specification attribute option search model</param>
        /// <param name="specificationAttribute">Specification attribute</param>
        /// <returns>Specification attribute option list model</returns>
        public virtual SpecificationAttributeOptionListModel PrepareSpecificationAttributeOptionListModel(
            SpecificationAttributeOptionSearchModel searchModel, SpecificationAttribute specificationAttribute)
        {
            if (searchModel == null)
            {
                throw new ArgumentNullException(nameof(searchModel));
            }

            if (specificationAttribute == null)
            {
                throw new ArgumentNullException(nameof(specificationAttribute));
            }

            //get specification attribute options
            var options = _specificationAttributeService
                          .GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttribute.Id).ToPagedList(searchModel);

            //prepare list model
            var model = new SpecificationAttributeOptionListModel().PrepareToGrid(searchModel, options, () =>
            {
                return(options.Select(option =>
                {
                    //fill in model values from the entity
                    var optionModel = option.ToModel <SpecificationAttributeOptionModel>();

                    //in order to save performance to do not check whether a product is deleted, etc
                    optionModel.NumberOfAssociatedProducts = _specificationAttributeService
                                                             .GetProductSpecificationAttributeCount(specificationAttributeOptionId: option.Id);

                    return optionModel;
                }));
            });

            return(model);
        }
        /// <summary>
        /// Prepare paged specification attribute option list model
        /// </summary>
        /// <param name="searchModel">Specification attribute option search model</param>
        /// <param name="specificationAttribute">Specification attribute</param>
        /// <returns>Specification attribute option list model</returns>
        public virtual SpecificationAttributeOptionListModel PrepareSpecificationAttributeOptionListModel(
            SpecificationAttributeOptionSearchModel searchModel, SpecificationAttribute specificationAttribute)
        {
            if (searchModel == null)
            {
                throw new ArgumentNullException(nameof(searchModel));
            }

            if (specificationAttribute == null)
            {
                throw new ArgumentNullException(nameof(specificationAttribute));
            }

            //get specification attribute options
            var options = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttribute.Id);

            //prepare list model
            var model = new SpecificationAttributeOptionListModel
            {
                Data = options.PaginationByRequestModel(searchModel).Select(option =>
                {
                    //fill in model values from the entity
                    var optionModel = option.ToModel <SpecificationAttributeOptionModel>();


                    return(optionModel);
                }),
                Total = options.Count
            };

            return(model);
        }
        public ActionResult OptionList(int specificationAttributeId, GridCommand command)
        {
            var gridModel = new GridModel <SpecificationAttributeOptionModel>();
            var options   = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttributeId);

            gridModel.Data = options.Select(x =>
            {
                var model        = x.ToModel();
                model.NameString = Server.HtmlEncode(x.Color.IsEmpty() ? x.Name : $"{x.Name} - {x.Color}");

                return(model);
            });
            gridModel.Total = options.Count();

            return(new JsonResult
            {
                Data = gridModel
            });
        }
        public HttpResponseMessage GetOptionListBySAId(HttpRequestMessage request, int specificationAttributeId, string getType = "list")
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response = request.CreateErrorResponse(HttpStatusCode.NotFound, "Invalid specification attribute id.");
                if (getType.Equals("create", StringComparison.InvariantCultureIgnoreCase))
                {
                    var specificationAttribute = _specificationAttributeService.GetSpecificationAttributeById(specificationAttributeId);
                    if (specificationAttribute != null)
                    {
                        var model = new SpecificationAttributeOptionVM
                        {
                            SpecificationAttributeId = specificationAttributeId
                        };
                        response = request.CreateResponse <SpecificationAttributeOptionVM>(HttpStatusCode.OK, model);
                    }
                }
                else if (getType.Equals("list", StringComparison.InvariantCultureIgnoreCase))
                {
                    var options = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttributeId);
                    if (options != null)
                    {
                        var gridModel = new DataSourceResult
                        {
                            Data = options.Select(x =>
                            {
                                var model = x.ToModel();
                                //in order to save performance to do not check whether a product is deleted, etc
                                model.NumberOfAssociatedProducts = _specificationAttributeService.GetProductSpecificationAttributeCount(0, x.Id);
                                return model;
                            }),
                            Total = options.Count()
                        };

                        response = request.CreateResponse <DataSourceResult>(HttpStatusCode.OK, gridModel);
                    }
                }

                return response;
            }));
        }
Esempio n. 8
0
        public ActionResult OptionList(int specificationAttributeId, GridCommand command)
        {
            var gridModel = new GridModel <SpecificationAttributeOptionModel>();

            if (_permissionService.Authorize(StandardPermissionProvider.ManageCatalog))
            {
                var options = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(specificationAttributeId);

                gridModel.Data  = options.Select(x => x.ToModel());
                gridModel.Total = options.Count();
            }
            else
            {
                gridModel.Data = Enumerable.Empty <SpecificationAttributeOptionModel>();

                NotifyAccessDenied();
            }

            return(new JsonResult
            {
                Data = gridModel
            });
        }
Esempio n. 9
0
        public virtual IActionResult GetOptionsByAttributeId(string attributeId)
        {
            //do not make any permission validation here
            //because this method could be used on some other pages (such as product editing)
            //if (!_permissionService.Authorize(StandardPermissionProvider.ManageAttributes))
            //    return AccessDeniedView();

            //this action method gets called via an ajax request
            if (string.IsNullOrEmpty(attributeId))
            {
                throw new ArgumentNullException(nameof(attributeId));
            }

            var options = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(Convert.ToInt32(attributeId));
            var result  = (from o in options
                           select new { id = o.Id, name = o.Name }).ToList();

            return(Json(result));
        }
        private void MappingAttributeSpecificationOption(ProductSpecification entity,
                                                         SpecificationAttribute specificationAttribute)
        {
            if (!String.IsNullOrWhiteSpace(entity.Value))
            {
                entity.SpecificationId = specificationAttribute.Id;
                var specificationOptions =
                    _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(
                        entity.SpecificationId);
                //проверка связи спцификации и опции
                if (!specificationOptions.Any(x => x.Name.Equals(entity.Value)))
                {
                    var specificationAttributeOption = new SpecificationAttributeOption();
                    specificationAttributeOption.Name = entity.Value;

                    specificationAttributeOption.SpecificationAttributeId = entity.SpecificationId;
                    _specificationAttributeService.InsertSpecificationAttributeOption(specificationAttributeOption);
                }
            }
        }
Esempio n. 11
0
        public async Task <ActionResult> CallApi(ConfigurationModel model)
        {
            var storeScope      = this.GetActiveStoreScopeConfiguration(_storeService, _workContext);
            var mappingSettings = _settingService.LoadSetting <ProductMappingSettings>(storeScope);

            var tokenebay = EbayExtensions.GetToken();

            var categoryWorldBuy = _categoryMappingRecord.Table.Where(u => u.CategoryId == model.CategoryId && u.SourceId == (int)Source.Ebay).ToList();

            if (categoryWorldBuy != null)
            {
                foreach (var cateIds in categoryWorldBuy)
                {
                    var clientapi1 = new HttpClient();
                    clientapi1.BaseAddress = new Uri("https://api.ebay.com/");
                    clientapi1.DefaultRequestHeaders.Clear();
                    clientapi1.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    clientapi1.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenebay);
                    clientapi1.Timeout = TimeSpan.FromMinutes(60);

                    var getCategoryId = _affiliateEbayService.Get(cateIds.CategorySourceId).EbayId.ToString();

                    string str = "buy/browse/v1/item_summary/search?limit=200&category_ids=" + getCategoryId;
                    if (!string.IsNullOrEmpty(model.KeyWord))
                    {
                        str = str + "&q=" + model.KeyWord;
                    }

                    HttpResponseMessage Res1 = await clientapi1.GetAsync(str);

                    if (Res1.IsSuccessStatusCode)
                    {
                        var EmpResponse1 = Res1.Content.ReadAsStringAsync().Result;
                        var result1      = JsonConvert.DeserializeObject <SearchOutput>(EmpResponse1);

                        int temp  = int.Parse(result1.total);
                        int value = 0;
                        while (temp > 0)
                        {
                            str = str + "&offset=" + value;
                            HttpResponseMessage Res2 = await clientapi1.GetAsync(str);

                            if (Res2.IsSuccessStatusCode)
                            {
                                var EmpResponse2 = Res2.Content.ReadAsStringAsync().Result;
                                var result2      = JsonConvert.DeserializeObject <SearchOutput>(EmpResponse2);

                                if (result2.itemSummaries != null)
                                {
                                    foreach (var item in result2.itemSummaries)
                                    {
                                        var checkProduct = _affiliateEbayService.GetProductBySourceId(productSourceId: item.itemId, source: (int)Source.Ebay);
                                        if (checkProduct.Id == 0)
                                        {
                                            var clientapi = new HttpClient();
                                            clientapi.BaseAddress = new Uri("https://api.ebay.com/");
                                            clientapi.DefaultRequestHeaders.Clear();
                                            clientapi.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                                            clientapi.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenebay);
                                            clientapi.Timeout = TimeSpan.FromMinutes(60);

                                            HttpResponseMessage Res = await clientapi.GetAsync("buy/browse/v1/item/" + item.itemId);

                                            if (Res.IsSuccessStatusCode)
                                            {
                                                var EmpResponse = Res.Content.ReadAsStringAsync().Result;
                                                var result      = JsonConvert.DeserializeObject <ProductModelApi>(EmpResponse);

                                                if (result.price != null)
                                                {
                                                    var price   = Convert.ToDecimal(result.price.value);
                                                    var product = new Product();
                                                    product.Name = result.title;
                                                    var currencyService = EngineContext.Current.Resolve <ICurrencyService>();
                                                    product.Price = Round(currencyService.ConvertToPrimaryStoreCurrency(price * (1 + mappingSettings.AdditionalCostPercent / 100), currencyService.GetCurrencyByCode("USD")), -3);
                                                    //if(result.marketingPrice == null)
                                                    //{
                                                    //    product.OldPrice = 0;
                                                    //}
                                                    //else
                                                    //{
                                                    //    if(result.marketingPrice.originalPrice == null)
                                                    //        product.OldPrice = 0;
                                                    //    else
                                                    //        product.OldPrice = Convert.ToDecimal(result.marketingPrice.originalPrice.value);
                                                    //}
                                                    product.ShortDescription = result.shortDescription;
                                                    product.FullDescription  = result.description;

                                                    product.VisibleIndividually         = true;
                                                    product.AllowCustomerReviews        = true;
                                                    product.UnlimitedDownloads          = true;
                                                    product.MaxNumberOfDownloads        = 10;
                                                    product.RecurringCycleLength        = 100;
                                                    product.RecurringTotalCycles        = 10;
                                                    product.RentalPriceLength           = 1;
                                                    product.IsShipEnabled               = true;
                                                    product.NotifyAdminForQuantityBelow = 1;
                                                    product.StockQuantity               = 1000;
                                                    product.OrderMaximumQuantity        = 1000;
                                                    product.OrderMinimumQuantity        = 1;
                                                    product.CreatedOnUtc = DateTime.UtcNow;
                                                    product.UpdatedOnUtc = DateTime.UtcNow;
                                                    _productService.InsertProduct(product);

                                                    var productMapping = new ProductMapping();
                                                    productMapping.ProductSourceId   = item.itemId;
                                                    productMapping.ProductSourceLink = item.itemWebUrl;
                                                    productMapping.SourceId          = (int)Source.Ebay;
                                                    productMapping.ProductId         = product.Id;
                                                    productMapping.Price             = price;
                                                    _productMappingService.InsertProduct(productMapping);

                                                    // Thêm hình chính
                                                    var imageMain = result.image.imageUrl.Split('?')[0];
                                                    System.Drawing.Image imageKey = EbayExtensions.DownloadImage(imageMain);
                                                    if (imageKey != null)
                                                    {
                                                        var contentTypeMain         = "";
                                                        var vendorPictureBinaryMain = EbayExtensions.ImageToByte(imageKey);

                                                        var fileExtensionMain = Path.GetExtension(imageMain);
                                                        if (!String.IsNullOrEmpty(fileExtensionMain))
                                                        {
                                                            fileExtensionMain = fileExtensionMain.ToLowerInvariant();
                                                        }
                                                        if (String.IsNullOrEmpty(contentTypeMain))
                                                        {
                                                            switch (fileExtensionMain)
                                                            {
                                                            case ".bmp":
                                                                contentTypeMain = MimeTypes.ImageBmp;
                                                                break;

                                                            case ".gif":
                                                                contentTypeMain = MimeTypes.ImageGif;
                                                                break;

                                                            case ".jpeg":
                                                            case ".jpg":
                                                            case ".jpe":
                                                            case ".jfif":
                                                            case ".pjpeg":
                                                            case ".pjp":
                                                                contentTypeMain = MimeTypes.ImageJpeg;
                                                                break;

                                                            case ".png":
                                                                contentTypeMain = MimeTypes.ImagePng;
                                                                break;

                                                            case ".tiff":
                                                            case ".tif":
                                                                contentTypeMain = MimeTypes.ImageTiff;
                                                                break;

                                                            default:
                                                                break;
                                                            }
                                                        }
                                                        var pictureMain = _pictureService.InsertPicture(vendorPictureBinaryMain, contentTypeMain, null);
                                                        _productService.InsertProductPicture(new ProductPicture
                                                        {
                                                            PictureId    = pictureMain.Id,
                                                            ProductId    = product.Id,
                                                            DisplayOrder = 0,
                                                        });
                                                    }

                                                    int display = 1;
                                                    if (result.additionalImages != null)
                                                    {
                                                        foreach (var ite in result.additionalImages)
                                                        {
                                                            var ima = ite.imageUrl.Split('?')[0];
                                                            System.Drawing.Image image = EbayExtensions.DownloadImage(ima);
                                                            if (image != null)
                                                            {
                                                                var contentType         = "";
                                                                var vendorPictureBinary = EbayExtensions.ImageToByte(image);

                                                                var fileExtension = Path.GetExtension(ima);
                                                                if (!String.IsNullOrEmpty(fileExtension))
                                                                {
                                                                    fileExtension = fileExtension.ToLowerInvariant();
                                                                }
                                                                if (String.IsNullOrEmpty(contentType))
                                                                {
                                                                    switch (fileExtension)
                                                                    {
                                                                    case ".bmp":
                                                                        contentType = MimeTypes.ImageBmp;
                                                                        break;

                                                                    case ".gif":
                                                                        contentType = MimeTypes.ImageGif;
                                                                        break;

                                                                    case ".jpeg":
                                                                    case ".jpg":
                                                                    case ".jpe":
                                                                    case ".jfif":
                                                                    case ".pjpeg":
                                                                    case ".pjp":
                                                                        contentType = MimeTypes.ImageJpeg;
                                                                        break;

                                                                    case ".png":
                                                                        contentType = MimeTypes.ImagePng;
                                                                        break;

                                                                    case ".tiff":
                                                                    case ".tif":
                                                                        contentType = MimeTypes.ImageTiff;
                                                                        break;

                                                                    default:
                                                                        break;
                                                                    }
                                                                }
                                                                var picture = _pictureService.InsertPicture(vendorPictureBinary, contentType, null);
                                                                _productService.InsertProductPicture(new ProductPicture
                                                                {
                                                                    PictureId    = picture.Id,
                                                                    ProductId    = product.Id,
                                                                    DisplayOrder = display++,
                                                                });
                                                            }
                                                        }
                                                    }

                                                    //Product specification attributes
                                                    if (result.localizedAspects != null)
                                                    {
                                                        foreach (var attributes in result.localizedAspects)
                                                        {
                                                            var getAttribute                 = _affiliateEbayService.GetSpecificationAttributeByName(attributes.name);
                                                            var specificationAttribute       = new SpecificationAttribute();
                                                            var specificationAttributeOption = new SpecificationAttributeOption();
                                                            if (getAttribute == null)
                                                            {
                                                                specificationAttribute.Name         = attributes.name;
                                                                specificationAttribute.DisplayOrder = 0;
                                                                _specificationAttributeService.InsertSpecificationAttribute(specificationAttribute);

                                                                specificationAttributeOption.DisplayOrder             = 0;
                                                                specificationAttributeOption.ColorSquaresRgb          = null;
                                                                specificationAttributeOption.Name                     = attributes.value;
                                                                specificationAttributeOption.SpecificationAttributeId = specificationAttribute.Id;
                                                                _specificationAttributeService.InsertSpecificationAttributeOption(specificationAttributeOption);
                                                            }

                                                            var productSpecificationAttribute = new ProductSpecificationAttribute();
                                                            productSpecificationAttribute.AttributeTypeId = (int)SpecificationAttributeType.CustomText;
                                                            if (getAttribute == null)
                                                            {
                                                                productSpecificationAttribute.SpecificationAttributeOptionId = specificationAttributeOption.Id;
                                                            }
                                                            else
                                                            {
                                                                var options = _specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(getAttribute.Id);
                                                                productSpecificationAttribute.SpecificationAttributeOptionId = options.FirstOrDefault().Id;
                                                            }
                                                            productSpecificationAttribute.ProductId         = product.Id;
                                                            productSpecificationAttribute.CustomValue       = attributes.value;
                                                            productSpecificationAttribute.AllowFiltering    = false;
                                                            productSpecificationAttribute.ShowOnProductPage = true;
                                                            productSpecificationAttribute.DisplayOrder      = 1;
                                                            _specificationAttributeService.InsertProductSpecificationAttribute(productSpecificationAttribute);
                                                        }
                                                    }

                                                    //categories
                                                    SaveCategoryMappings(product, new List <int>()
                                                    {
                                                        model.CategoryId
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            value = value + 200;
                            temp  = temp - 200;
                        }
                    }
                }
                SuccessNotification(_localizationService.GetResource("Admin.Catalog.Products.Added"));
            }
            else
            {
                ErrorNotification(_localizationService.GetResource("Plugins.AffiliateEbay.CallApi.Error"));
            }

            return(CallApi());
        }
            public virtual void PrepareSpecsFilters(IList <CategorySpecificationAtrribute> filterableSpecificationAttributes,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper,
                                                    IWorkContext workContext, string baseUrl)
            {
                var allFilters = new List <SpecificationAttributeOptionFilter>();

                foreach (var attr in filterableSpecificationAttributes)
                {
                    var specificationAttributeOptions = specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(attr.SpecificationAttributeId);
                    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 not filtered specification options
                var notFilteredOptions = new List <SpecificationAttributeOptionFilter>();

                foreach (var saof in allFilters)
                {
                    //else add it
                    notFilteredOptions.Add(saof);
                }

                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(baseUrl, QUERYSTRINGPARAM + "=" + newQueryParam, null);
                    filterUrl        = ExcludeQueryStringParams(filterUrl, webHelper);
                    item.FilterUrl   = filterUrl;

                    return(item);
                }).ToList();
            }
            public virtual void PrepareSpecsFilters(IList <int> alreadyFilteredSpecOptionIds,
                                                    IList <CategorySpecificationAtrribute> filterableSpecificationAttributes,
                                                    ISpecificationAttributeService specificationAttributeService,
                                                    IWebHelper webHelper,
                                                    IWorkContext workContext)
            {
                var allFilters = new List <SpecificationAttributeOptionFilter>();

                foreach (var attr in filterableSpecificationAttributes)
                {
                    var specificationAttributeOptions = specificationAttributeService.GetSpecificationAttributeOptionsBySpecificationAttribute(attr.SpecificationAttributeId);
                    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;
                    Dictionary <int, int> alreadyFilterAttribute = new Dictionary <int, int>();
                    this.AlreadyFilteredItems = alreadyFilteredOptions.ToList().Select(x =>
                    {
                        var item = new SpecificationFilterItem();
                        item.SpecificationAttributeName       = x.SpecificationAttributeName;
                        item.SpecificationAttributeOptionName = x.SpecificationAttributeOptionName;

                        if (!alreadyFilterAttribute.ContainsKey(x.SpecificationAttributeId))
                        {
                            alreadyFilterAttribute.Add(x.SpecificationAttributeId, x.SpecificationAttributeOptionId);
                        }

                        var alreadyFilteredOptionIds = GetAlreadyFilteredSpecOptionIds(webHelper);
                        if (alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            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();

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

                        //filter URL
                        List <int> alreadyFilteredOptionIds = new List <int>();
                        var _alreadyFilteredOptionIds       = GetAlreadyFilteredSpecOptionIds(webHelper);
                        foreach (int oid in _alreadyFilteredOptionIds)
                        {
                            int aid = 0;
                            if (alreadyFilterAttribute.TryGetValue(x.SpecificationAttributeId, out aid) && aid == oid)
                            {
                                alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                            }
                            else
                            {
                                alreadyFilteredOptionIds.Add(oid);
                            }
                        }
                        if (!alreadyFilteredOptionIds.Contains(x.SpecificationAttributeOptionId))
                        {
                            alreadyFilteredOptionIds.Add(x.SpecificationAttributeOptionId);
                        }

                        if (alreadyFilterAttribute.ContainsValue(x.SpecificationAttributeOptionId))
                        {
                            item.Filtered = false;
                        }
                        else
                        {
                            item.Filtered = true;
                        }

                        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);
                    removeFilterUrl      = webHelper.RemoveQueryString(removeFilterUrl, PriceRangeFilterModel.QUERYSTRINGPARAM);
                    removeFilterUrl      = ExcludeQueryStringParams(removeFilterUrl, webHelper);
                    this.RemoveFilterUrl = removeFilterUrl;
                }
                else
                {
                    this.Enabled = false;
                }
            }