public SearchModel(IShopRepository repository, int langId, int? page, string categoryName = null, string productName = null, string articleName = null, string filter = null, string query = null, string sortOrder = null, string sortBy = null, bool showSpecialOffers = false) : base(repository, langId, "category", showSpecialOffers) { _repository = repository; IQueryable<Product> products = null; if (query != null && query.Length > 1) { products = _repository.GetProductsByQueryString(query).Where(p => p.ProductStocks.Any(ps => ps.IsAvailable)); } else { products = _repository.GetProductsByCategory(""); } switch (sortOrder) { case "desc": products = products.OrderByDescending(p => p.Price).ThenBy(p => p.Name).AsQueryable(); break; case "asc": products = products.OrderBy(p => p.Price).ThenBy(p => p.Name).AsQueryable(); break; default: // "abc" products = products.OrderBy(p => p.Name).AsQueryable(); break; } var pageSize = int.Parse(SiteSettings.GetShopSetting("ProductsPageSize")); Products = products.Include(x => x.ProductAttributeValues) .Include(x => x.ProductImages) .ToList(); ProductTotalCount = Products.Count(); if (page > Products.Count() / pageSize) { page = 0; } Products = ApplyPaging(Products.AsQueryable(), page, pageSize).ToList(); foreach (var product in Products) { product.CurrentLang = langId; if (product.ProductImages.Any()) { var pi = product.ProductImages.FirstOrDefault(c => c.IsDefault) ?? product.ProductImages.First(); product.ImageSource = pi.ImageSource; } } _sw.Stop(); Log.DebugFormat("SiteModel+SearchModel: {0}", _sw.Elapsed); }
public static string Execute(IShopRepository repository, int currentLangId, string categoryName) { var products = repository.GetProductsByCategory(categoryName).ToList(); var attributes = repository.GetProductAttributes(categoryName).ToList(); foreach (var productAttribute in attributes) { productAttribute.CurrentLang = currentLangId; } var sb = new StringBuilder(); // Генерация заголовков begin var productFields = TransferData.ProductFields; foreach (var field in productFields) { sb.Append(field.Key); sb.Append(";"); } int attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; sb.Append(productAttribute.ExternalId); if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); foreach (var field in productFields) { sb.Append(field.Value); sb.Append(";"); } attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; sb.Append(productAttribute.Title); if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); // Генерация заголовков end foreach (var product in products) { product.CurrentLang = currentLangId; sb.Append(product.ExternalId); sb.Append(";"); sb.Append(product.Name); sb.Append(";"); sb.Append(product.Title); sb.Append(";"); sb.Append(product.OldPrice); sb.Append(";"); sb.Append(product.Price); sb.Append(";"); sb.Append(product.IsNew); sb.Append(";"); sb.Append(product.IsDiscount); sb.Append(";"); sb.Append(product.IsTopSale); sb.Append(";"); sb.Append(product.IsActive); sb.Append(";"); sb.Append(product.SeoDescription); sb.Append(";"); sb.Append(product.SeoKeywords); sb.Append(";"); sb.Append(product.SeoText); sb.Append(";"); sb.Append(!string.IsNullOrEmpty(product.Description) ? product.Description.Replace("\n", " ").Replace(";","") : product.Description); sb.Append(";"); var firstProductStock = product.ProductStocks.OrderBy(ps => ps.StockNumber).FirstOrDefault(); if (firstProductStock != null) { sb.Append(firstProductStock.StockNumber); sb.Append(";"); sb.Append(firstProductStock.Size); sb.Append(";"); sb.Append(firstProductStock.Color); sb.Append(";"); } else { sb.Append(";"); sb.Append(";"); sb.Append(";"); } attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; var result = new List<string>(); foreach (var pav in product.ProductAttributeValues) { pav.CurrentLang = currentLangId; if (productAttribute.ProductAttributeValues.Contains(pav)) { result.Add(pav.Title); } } var res = DataSynchronizationHelper.ConvertToStringWithSeparators(result); if (res != null) { sb.Append(res); } if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); foreach (var ps in product.ProductStocks.OrderBy(ps => ps.StockNumber).Skip(1)) { sb.Append(product.ExternalId); sb.Append(";"); sb.Append(product.Name); sb.Append(";"); sb.Append(product.Title); sb.Append(";"); sb.Append(product.OldPrice); sb.Append(";"); sb.Append(product.Price); sb.Append(";"); sb.Append(product.IsNew); sb.Append(";"); sb.Append(product.IsDiscount); sb.Append(";"); sb.Append(product.IsTopSale); sb.Append(";"); sb.Append(product.IsActive); sb.Append(";"); sb.Append(product.SeoDescription); sb.Append(";"); sb.Append(product.SeoKeywords); sb.Append(";"); sb.Append(product.SeoText); sb.Append(";"); sb.Append(!string.IsNullOrEmpty(product.Description) ? product.Description.Replace("\n", " ").Replace(";", "") : product.Description); sb.Append(";"); sb.Append(ps.StockNumber); sb.Append(";"); sb.Append(ps.Size); sb.Append(";"); sb.Append(ps.Color); sb.Append(";"); attrCnt = 0; foreach (var productAttribute in attributes) { attrCnt++; var result = new List<string>(); foreach (var pav in product.ProductAttributeValues) { pav.CurrentLang = currentLangId; if (productAttribute.ProductAttributeValues.Contains(pav)) { result.Add(pav.Title); } } var res = DataSynchronizationHelper.ConvertToStringWithSeparators(result); if (res != null) { sb.Append(res); } if (attrCnt != attributes.Count()) sb.Append(";"); } sb.Append("\r\n"); } } return sb.ToString(); }
public CatalogueModel(IShopRepository repository, int langId, int? page, string categoryName = null, string filter = null, string sortOrder = null, bool showSpecialOffers = false) : base(repository, langId, "category", showSpecialOffers) { _repository = repository; //FilterArray = new string[0]; if (categoryName != null) { var category = Categories.First(c => c.Name == categoryName); ProductAttributes = _repository.GetProductAttributes(category.Id).Where(pa => pa.IsFilterable).ToList(); //CurrentFilter = filter ?? string.Empty; filter = filter ?? string.Empty; //var filterValueGroups = GroupFilterString(categoryName, filter); var filters = filter.Split(new[] {"-"}, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); Dictionary<int, List<int>> groupedAttributes = GroupProductAttributes(ProductAttributes, filters); IQueryable<Product> products = _repository.GetProductsByCategory(categoryName) .Where(p => p.ProductStocks.Any(ps => ps.IsAvailable)); if (filters.Any()) { products = products.Where(x => x.ProductAttributeValues.Any(pav => filters.Contains(pav.Id))); IsFiltered = true; } products = OrderProducts(products, sortOrder); var pageSize = int.Parse(SiteSettings.GetShopSetting("ProductsPageSize")); Products = products.Include(x => x.ProductAttributeValues) .Include(x => x.ProductImages) .ToList(); // полный пэ //if (filters.Any()) //{ // var filteredProducts = new List<Product>(); // foreach (var product in Products) // { // var matched = 0; // foreach (KeyValuePair<int, List<int>> groupedAttribute in groupedAttributes) // { // if (product.ProductAttributeValues.Any(pav => groupedAttribute.Value.Contains(pav.Id))) // { // matched++; // } // } // if (matched == groupedAttributes.Count) // { // filteredProducts.Add(product); // } // } // Products = filteredProducts; //} if (filters.Any()) { Products = Products.Where( product => groupedAttributes.Count( groupedAttribute => product.ProductAttributeValues.Any( pav => groupedAttribute.Value.Contains(pav.Id))) == groupedAttributes.Count) .ToList(); } ProductTotalCount = Products.Count(); if (page > Products.Count()/pageSize) { page = 0; } //foreach (var product in Products) //{ // product.IsSelectedByFilter = true; //} foreach (var productAttribute in ProductAttributes) { foreach (var productAttributeValue in productAttribute.ProductAttributeValues) { productAttributeValue.AvailableProductsCount = Products.Count(p => p.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id)); //productAttributeValue.AvailableProductsCountAfterApplyingFilter = AllProducts.Count(p => p.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id)); //foreach (var product in Products.Where(p => p.IsSelectedByFilter)) //{ // if (filters.Contains(productAttributeValue.Id)) // product.IsSelectedByFilter = product.ProductAttributeValues.Any(pav => pav.Id == productAttributeValue.Id); //} } } //Products = Products.Where(p => p.IsSelectedByFilter); // создание фильтров Filters = new List<FilterViewModel>(); //var filterValueGroups = GroupFilterString(categoryName, CurrentFilter); foreach (var productAttribute in ProductAttributes.OrderBy(p => p.SortOrder)) { if (groupedAttributes.ContainsKey(productAttribute.Id) || productAttribute.ProductAttributeValues.Any(pav => pav.AvailableProductsCount > 0)) { var fvm = new FilterViewModel { Title = productAttribute.Title, FilterItems = new List<FilterItem>() }; foreach (var categoryValue in productAttribute.ProductAttributeValues.OrderBy(a => a.Title)) { if (groupedAttributes.ContainsKey(productAttribute.Id) || categoryValue.AvailableProductsCount > 0) { var filterItem = new FilterItem { Title = categoryValue.Title, AvaibleProductsCount = categoryValue.AvailableProductsCount, AvaibleProductsCountAfterApplyingFilter = categoryValue.AvailableProductsCountAfterApplyingFilter, Selected = filters.Contains(categoryValue.Id), FilterAttributeString = CatalogueFilterHelper.GetFilterStringForCheckbox(filters, categoryValue.Id, filters.Contains(categoryValue.Id)), Id = "cb_" + categoryValue.Id }; fvm.FilterItems.Add(filterItem); } } Filters.Add(fvm); } } Products = ApplyPaging(Products.AsQueryable(), page, pageSize).ToList(); foreach (var product in Products) { product.CurrentLang = langId; if (product.ProductImages.Any()) { var pi = product.ProductImages.FirstOrDefault(c => c.IsDefault) ?? product.ProductImages.First(); product.ImageSource = pi.ImageSource; } } CurrentCategory = category; _sw.Stop(); Log.DebugFormat("SiteModel+CatalogueModel: {0}", _sw.Elapsed); } }