示例#1
0
        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);
        }
示例#2
0
        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();
        }
示例#3
0
        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);
            }
        }