Пример #1
0
        public async Task <IActionResult> ProductOverview(long id)
        {
            var product = await _productRepository.Query()
                          .Include(x => x.OptionValues)
                          .Include(x => x.ProductLinks).ThenInclude(p => p.LinkedProduct)
                          .Include(x => x.ThumbnailImage)
                          .Include(x => x.Medias).ThenInclude(m => m.Media)
                          .FirstOrDefaultAsync(x => x.Id == id && x.IsPublished);

            if (product == null)
            {
                return(NotFound());
            }

            var model = new ProductDetail
            {
                Id   = product.Id,
                Name = _contentLocalizationService.GetLocalizedProperty(product, nameof(product.Name), product.Name),
                CalculatedProductPrice = _productPricingService.CalculateProductPrice(product),
                IsCallForPricing       = product.IsCallForPricing,
                IsAllowToOrder         = product.IsAllowToOrder,
                StockTrackingIsEnabled = product.StockTrackingIsEnabled,
                StockQuantity          = product.StockQuantity,
                ShortDescription       = _contentLocalizationService.GetLocalizedProperty(product, nameof(product.ShortDescription), product.ShortDescription),
                ReviewsCount           = product.ReviewsCount,
                RatingAverage          = product.RatingAverage,
            };

            MapProductVariantToProductVm(product, model);
            MapProductOptionToProductVm(product, model);
            MapProductImagesToProductVm(product, model);

            return(PartialView(model));
        }
        private IList <BreadcrumbViewModel> Create(long categoryId)
        {
            var category = _categoryRepository
                           .Query()
                           .Include(x => x.Parent)
                           .FirstOrDefault(x => x.Id == categoryId);
            var breadcrumbModels = new List <BreadcrumbViewModel>
            {
                new BreadcrumbViewModel
                {
                    Text = _contentLocalizationService.GetLocalizedProperty(category, nameof(category.Name), category.Name),
                    Url  = category.Slug
                }
            };
            var parentCategory = category.Parent;

            while (parentCategory != null)
            {
                breadcrumbModels.Insert(0, new BreadcrumbViewModel
                {
                    Text = _contentLocalizationService.GetLocalizedProperty(parentCategory, nameof(parentCategory.Name), parentCategory.Name),
                    Url  = parentCategory.Slug
                });
                parentCategory = parentCategory.Parent;
            }

            return(breadcrumbModels);
        }
        public IViewComponentResult Invoke(WidgetInstanceViewModel widgetInstance)
        {
            var model = new SimpleProductWidgetComponentVm
            {
                Id         = widgetInstance.Id,
                WidgetName = _contentLocalizationService.GetLocalizedProperty(nameof(WidgetInstance), widgetInstance.Id, nameof(widgetInstance.Name), widgetInstance.Name),
                Setting    = JsonConvert.DeserializeObject <SimpleProductWidgetSetting>(widgetInstance.Data)
            };

            foreach (var item in model.Setting.Products)
            {
                var product = _productRepository.Query().Where(x => x.Id == item.Id).Include(x => x.ThumbnailImage).FirstOrDefault();

                if (product != null)
                {
                    var productThumbnail = ProductThumbnail.FromProduct(product);
                    productThumbnail.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), productThumbnail.Id, nameof(product.Name), productThumbnail.Name);
                    productThumbnail.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                    productThumbnail.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
                    model.Products.Add(productThumbnail);
                }
            }

            return(View(this.GetViewPath(), model));
        }
Пример #4
0
        public IViewComponentResult Invoke(WidgetInstanceViewModel widgetInstance)
        {
            var model = new ProductWidgetComponentVm
            {
                Id         = widgetInstance.Id,
                WidgetName = _contentLocalizationService.GetLocalizedProperty(nameof(WidgetInstance), widgetInstance.Id, nameof(widgetInstance.Name), widgetInstance.Name),
                Setting    = JsonConvert.DeserializeObject <ProductWidgetSetting>(widgetInstance.Data)
            };

            var query = _productRepository.Query()
                        .Where(x => x.IsPublished && x.IsVisibleIndividually);

            if (model.Setting.CategoryId.HasValue && model.Setting.CategoryId.Value > 0)
            {
                query = query.Where(x => x.Categories.Any(c => c.CategoryId == model.Setting.CategoryId.Value));
            }

            if (model.Setting.FeaturedOnly)
            {
                query = query.Where(x => x.IsFeatured);
            }

            if (model.Setting.OrderBy == ProductWidgetOrderBy.Newest)
            {
                query = query.OrderByDescending(p => p.CreatedOn);
            }

            if (model.Setting.OrderBy == ProductWidgetOrderBy.BestSelling)
            {
                //TODO: ProductWidgetOrderBy.BestSelling must be managed
                // create a new  property in product incremented each time a product
                // is created or updated or calculated how many time the products already
                // ordered ?
            }

            var productThumbnail = query
                                   .Include(x => x.ThumbnailImage)
                                   .Select(x => ProductThumbnail.FromProduct(x));

            if (model.Setting.OrderBy == ProductWidgetOrderBy.Discount)
            {
                model.Products = model.Products.OrderByDescending(p => p.CalculatedProductPrice.PercentOfSaving).ToList();
            }



            model.Products = productThumbnail.Take(model.Setting.NumberOfProducts).ToList();

            foreach (var product in model.Products)
            {
                product.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), product.Id, nameof(product.Name), product.Name);
                product.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                product.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
            }

            return(View(this.GetViewPath(), model));
        }
Пример #5
0
        public IViewComponentResult Invoke(WidgetInstanceViewModel widgetInstance)
        {
            var model = new SpaceBarWidgetComponentVm
            {
                Id         = widgetInstance.Id,
                WidgetName = _contentLocalizationService.GetLocalizedProperty(nameof(WidgetInstance), widgetInstance.Id, nameof(widgetInstance.Name), widgetInstance.Name),
                Items      = JsonConvert.DeserializeObject <List <SpaceBarWidgetSetting> >(widgetInstance.Data)
            };

            foreach (var item in model.Items)
            {
                if (!string.IsNullOrWhiteSpace(item.Title))
                {
                    item.Title = _localizer[item.Title];
                }
                if (!string.IsNullOrWhiteSpace(item.Description))
                {
                    item.Description = _localizer[item.Description];
                }

                if (!string.IsNullOrEmpty(item.Image))
                {
                    item.ImageUrl = _mediaService.GetMediaUrl(item.Image);
                }
            }

            return(View(this.GetViewPath(), model));
        }
Пример #6
0
        public IViewComponentResult Invoke(WidgetInstanceViewModel widgetInstance)
        {
            var model = new CategoryWidgetComponentVm()
            {
                Id         = widgetInstance.Id,
                WidgetName = _contentLocalizationService.GetLocalizedProperty(nameof(WidgetInstance), widgetInstance.Id, nameof(widgetInstance.Name), widgetInstance.Name),
            };
            var settings = JsonConvert.DeserializeObject <CategoryWidgetSettings>(widgetInstance.Data);

            if (settings != null)
            {
                var category = _categoriesRepository.Query()
                               .Include(c => c.ThumbnailImage)
                               .FirstOrDefault(c => c.Id == settings.CategoryId);
                model.Category = new CategoryThumbnail()
                {
                    Id             = category.Id,
                    Description    = category.Description,
                    Name           = category.Name,
                    Slug           = category.Slug,
                    ThumbnailImage = category.ThumbnailImage,
                    ThumbnailUrl   = _mediaService.GetThumbnailUrl(category.ThumbnailImage)
                };
            }

            return(View(this.GetViewPath(), model));
        }
Пример #7
0
        public IActionResult PageDetail(long id)
        {
            var page = _pageRepository.Query().FirstOrDefault(x => x.Id == id);

            if (page == null)
            {
                return(NotFound());
            }

            var model = new PageVm
            {
                Name            = _contentLocalizationService.GetLocalizedProperty(page, nameof(page.Name), page.Name),
                Body            = _contentLocalizationService.GetLocalizedProperty(page, nameof(page.Body), page.Body),
                MetaTitle       = page.MetaTitle,
                MetaKeywords    = page.MetaKeywords,
                MetaDescription = page.MetaDescription
            };

            return(View(model));
        }
Пример #8
0
        public async Task <IActionResult> Index()
        {
            var currentUser = await _workContext.GetCurrentUser();

            var comparingProducts = _comparingProductRepository.Query()
                                    .Include(x => x.Product).ThenInclude(p => p.ThumbnailImage)
                                    .Include(x => x.Product).ThenInclude(p => p.AttributeValues).ThenInclude(a => a.Attribute)
                                    .Where(x => x.UserId == currentUser.Id).ToList();

            var allAttributes = new List <ProductAttribute>();

            foreach (var item in comparingProducts)
            {
                allAttributes.AddRange(item.Product.AttributeValues.Select(x => x.Attribute));
            }

            var model = new ProductComparisonVm();

            model.Attributes = allAttributes.Distinct().Select(x => new AttributeVm {
                AttributeId = x.Id, Name = _contentLocalizationService.GetLocalizedProperty(x, nameof(x.Name), x.Name)
            }).ToList();
            model.Products = comparingProducts.Select(x => new ComparingProductVm
            {
                ProductName            = _contentLocalizationService.GetLocalizedProperty(x.Product, nameof(x.Product.Name), x.Product.Name),
                ProductImage           = _mediaService.GetThumbnailUrl(x.Product.ThumbnailImage),
                CalculatedProductPrice = _productPricingService.CalculateProductPrice(x.Product),
                ProductId       = x.ProductId,
                AttributeValues = x.Product.AttributeValues.Select(a => new AttributeValueVm
                {
                    AttributeId = a.AttributeId,
                    Value       = _contentLocalizationService.GetLocalizedProperty(a, nameof(a.Value), a.Value)
                })
                                  .ToList()
            })
                             .ToList();

            return(View(model));
        }
        public IViewComponentResult Invoke(WidgetInstanceViewModel widgetInstance)
        {
            var model = new ProductWidgetComponentVm
            {
                Id         = widgetInstance.Id,
                WidgetName = _contentLocalizationService.GetLocalizedProperty(nameof(WidgetInstance), widgetInstance.Id, nameof(widgetInstance.Name), widgetInstance.Name),
                Setting    = JsonConvert.DeserializeObject <ProductWidgetSetting>(widgetInstance.Data)
            };

            var query = _productRepository.Query()
                        .Where(x => x.IsPublished && x.IsVisibleIndividually);

            if (model.Setting.CategoryId.HasValue && model.Setting.CategoryId.Value > 0)
            {
                query = query.Where(x => x.Categories.Any(c => c.CategoryId == model.Setting.CategoryId.Value));
            }

            if (model.Setting.FeaturedOnly)
            {
                query = query.Where(x => x.IsFeatured);
            }

            model.Products = query
                             .Include(x => x.ThumbnailImage)
                             .OrderByDescending(x => x.CreatedOn)
                             .Take(model.Setting.NumberOfProducts)
                             .Select(x => ProductThumbnail.FromProduct(x)).ToList();

            foreach (var product in model.Products)
            {
                product.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), product.Id, nameof(product.Name), product.Name);
                product.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                product.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
            }

            return(View(this.GetViewPath(), model));
        }
Пример #10
0
        private CategoryMenuItem Map(Category category)
        {
            var categoryMenuItem = new CategoryMenuItem
            {
                Id   = category.Id,
                Name = _contentLocalizationService.GetLocalizedProperty(category, nameof(category.Name), category.Name),
                Slug = category.Slug
            };

            var childCategories = category.Children;

            foreach (var childCategory in childCategories.OrderByDescending(x => x.DisplayOrder))
            {
                var childCategoryMenuItem = Map(childCategory);
                categoryMenuItem.AddChildItem(childCategoryMenuItem);
            }

            return(categoryMenuItem);
        }
        // TODO Number of items to config
        public async Task <IViewComponentResult> InvokeAsync(long?productId, int itemCount = 4)
        {
            var user = await _workContext.GetCurrentUser();

            IQueryable <Product> query = _productRepository.GetRecentlyViewedProduct(user.Id)
                                         .Include(x => x.ThumbnailImage);

            if (productId.HasValue)
            {
                query = query.Where(x => x.Id != productId.Value);
            }

            var model = query.Take(itemCount)
                        .Select(x => ProductThumbnail.FromProduct(x)).ToList();

            foreach (var product in model)
            {
                product.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), product.Id, nameof(product.Name), product.Name);
                product.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                product.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
            }

            return(View(this.GetViewPath(), model));
        }
Пример #12
0
        public IActionResult BrandDetail(long id, SearchOption searchOption)
        {
            var brand = _brandRepository.Query().FirstOrDefault(x => x.Id == id);

            if (brand == null)
            {
                return(Redirect("~/Error/FindNotFound"));
            }

            var model = new ProductsByBrand
            {
                BrandId             = id,
                BrandName           = brand.Name,
                BrandSlug           = brand.Slug,
                CurrentSearchOption = searchOption,
                FilterOption        = new FilterOption()
            };

            var query = _productRepository.Query().Where(x => x.BrandId == id && x.IsPublished && x.IsVisibleIndividually);

            if (query.Count() == 0)
            {
                model.TotalProduct = 0;
                return(View(model));
            }

            AppendFilterOptionsToModel(model, query);

            if (searchOption.MinPrice.HasValue)
            {
                query = query.Where(x => x.Price >= searchOption.MinPrice.Value);
            }

            if (searchOption.MaxPrice.HasValue)
            {
                query = query.Where(x => x.Price <= searchOption.MaxPrice.Value);
            }

            var categories = searchOption.GetCategories().ToArray();

            if (categories.Any())
            {
                query = query.Where(x => x.Categories.Any(c => categories.Contains(c.Category.Slug)));
            }

            model.TotalProduct = query.Count();
            var currentPageNum = searchOption.Page <= 0 ? 1 : searchOption.Page;
            var offset         = (_pageSize * currentPageNum) - _pageSize;

            while (currentPageNum > 1 && offset >= model.TotalProduct)
            {
                currentPageNum--;
                offset = (_pageSize * currentPageNum) - _pageSize;
            }

            query = ApplySort(searchOption, query);

            var products = query
                           .Include(x => x.ThumbnailImage)
                           .Skip(offset)
                           .Take(_pageSize)
                           .Select(x => ProductThumbnail.FromProduct(x))
                           .ToList();

            foreach (var product in products)
            {
                product.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), product.Id, nameof(product.Name), product.Name);
                product.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                product.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
            }

            model.Products = products;
            model.CurrentSearchOption.PageSize = _pageSize;
            model.CurrentSearchOption.Page     = currentPageNum;

            return(View(model));
        }
Пример #13
0
        public IActionResult Index(SearchOption searchOption)
        {
            if (string.IsNullOrWhiteSpace(searchOption.Query))
            {
                return(Redirect("~/"));
            }

            var brand = _brandRepository.Query().FirstOrDefault(x => x.Name == searchOption.Query && x.IsPublished);

            if (brand != null)
            {
                return(Redirect(string.Format("~/{0}", brand.Slug)));
            }

            var model = new SearchResult
            {
                CurrentSearchOption = searchOption,
                FilterOption        = new FilterOption()
            };

            var query = _productRepository.Query().Where(x => x.Name.Contains(searchOption.Query) && x.IsPublished && x.IsVisibleIndividually);

            if (!query.Any())
            {
                model.TotalProduct = 0;
                return(View(model));
            }

            AppendFilterOptionsToModel(model, query);

            if (searchOption.MinPrice.HasValue)
            {
                query = query.Where(x => x.Price >= searchOption.MinPrice.Value);
            }

            if (searchOption.MaxPrice.HasValue)
            {
                query = query.Where(x => x.Price <= searchOption.MaxPrice.Value);
            }

            if (string.Compare(model.CurrentSearchOption.Category, "all", StringComparison.OrdinalIgnoreCase) != 0)
            {
                var categories = searchOption.GetCategories();
                if (categories.Any())
                {
                    var categoryIds = _categoryRepository.Query().Where(x => categories.Contains(x.Slug)).Select(x => x.Id).ToList();
                    query = query.Where(x => x.Categories.Any(c => categoryIds.Contains(c.CategoryId)));
                }
            }

            var brands = searchOption.GetBrands();

            if (brands.Any())
            {
                var brandIs = _brandRepository.Query().Where(x => brands.Contains(x.Slug)).Select(x => x.Id).ToList();
                query = query.Where(x => x.BrandId.HasValue && brandIs.Contains(x.BrandId.Value));
            }

            model.TotalProduct = query.Count();
            var currentPageNum = searchOption.Page <= 0 ? 1 : searchOption.Page;
            var offset         = (_pageSize * currentPageNum) - _pageSize;

            while (currentPageNum > 1 && offset >= model.TotalProduct)
            {
                currentPageNum--;
                offset = (_pageSize * currentPageNum) - _pageSize;
            }

            SaveSearchQuery(searchOption, model);

            query = query
                    .Include(x => x.ThumbnailImage);

            query = AppySort(searchOption, query);

            var products = query
                           .Select(x => ProductThumbnail.FromProduct(x))
                           .Skip(offset)
                           .Take(_pageSize)
                           .ToList();

            foreach (var product in products)
            {
                product.Name                   = _contentLocalizationService.GetLocalizedProperty(nameof(Product), product.Id, nameof(product.Name), product.Name);
                product.ThumbnailUrl           = _mediaService.GetThumbnailUrl(product.ThumbnailImage);
                product.CalculatedProductPrice = _productPricingService.CalculateProductPrice(product);
            }

            model.Products = products;
            model.CurrentSearchOption.PageSize = _pageSize;
            model.CurrentSearchOption.Page     = currentPageNum;

            return(View(model));
        }