public virtual ProductDetailViewModel CreateDetailsViewModel()
        {
            ProductDetailViewModel productDetailViewModel = null;

            var currentProduct =
                Ucommerce.EntitiesV2.Product.FirstOrDefault(x => x.Guid == CatalogContext.CurrentProduct.Guid);

            if (currentProduct != null)
            {
                var    imageService    = ObjectFactory.Instance.Resolve <IImageService>();
                var    currentCategory = CatalogContext.CurrentCategory;
                string displayName     = string.Empty;
                if (currentProduct.ParentProduct != null)
                {
                    displayName = $"{currentProduct.ParentProduct.DisplayName()} ";
                }

                displayName += currentProduct.DisplayName();

                var productPrice = CatalogLibrary.CalculatePrices(new List <Guid>()
                {
                    currentProduct.Guid
                }).Items
                                   .FirstOrDefault();

                decimal price    = 0;
                decimal discount = 0;

                if (productPrice != null)
                {
                    price    = productPrice.PriceExclTax;
                    discount = productPrice.DiscountExclTax;
                    var currentCatalog = CatalogContext.CurrentCatalog;
                    if (currentCatalog != null && currentCatalog.ShowPricesIncludingTax)
                    {
                        price    = productPrice.PriceInclTax;
                        discount = productPrice.DiscountInclTax;
                    }
                }

                var imageUrl         = imageService.GetImage(currentProduct.PrimaryImageMediaId).Url;
                var absoluteImageUrl = UrlPath.ResolveAbsoluteUrl(imageUrl);

                var definition      = currentProduct.ProductDefinition;
                var isProductFamily = definition.IsProductFamily();

                productDetailViewModel = new ProductDetailViewModel()
                {
                    DisplayName          = displayName,
                    Guid                 = currentProduct.Guid,
                    PrimaryImageMediaUrl = absoluteImageUrl,
                    LongDescription      = currentProduct.LongDescription(),
                    ShortDescription     = currentProduct.ShortDescription(),
                    ProductUrl           = UrlService.GetUrl(CatalogContext.CurrentCatalog, CatalogContext.CurrentProduct),
                    Price                = new Money(price, CatalogContext.CurrentPriceGroup.CurrencyISOCode).ToString(),
                    Discount             = discount > 0
                                                ? new Money(discount, CatalogContext.CurrentPriceGroup.CurrencyISOCode).ToString()
                                                : "",
                    Sku               = currentProduct.Sku,
                    Rating            = Convert.ToInt32(Math.Round(currentProduct.Rating.GetValueOrDefault())),
                    VariantSku        = currentProduct.VariantSku,
                    IsVariant         = currentProduct.IsVariant,
                    IsProductFamily   = currentProduct.ProductDefinition.IsProductFamily(),
                    AllowOrdering     = currentProduct.AllowOrdering,
                    IsSellableProduct = !isProductFamily || currentProduct.Variants.Any()
                };

                if (currentProduct.ParentProduct != null)
                {
                    var parentProduct = CatalogLibrary.GetProduct(currentProduct.ParentProduct.Sku);
                    productDetailViewModel.ParentProductUrl =
                        UrlService.GetUrl(CatalogContext.CurrentCatalog, parentProduct);
                    productDetailViewModel.ParentProductDisplayName = currentProduct.ParentProduct.DisplayName();
                }

                if (currentCategory != null)
                {
                    productDetailViewModel.CategoryDisplayName = currentCategory.DisplayName;
                    productDetailViewModel.CategoryUrl         = UrlService.GetUrl(CatalogContext.CurrentCatalog,
                                                                                   CatalogContext.CurrentCategories.Append(CatalogContext.CurrentCategory).Compact(),
                                                                                   CatalogContext.CurrentProduct);
                    productDetailViewModel.ProductUrl =
                        UrlService.GetUrl(CatalogContext.CurrentCatalog, CatalogContext.CurrentProduct);
                }

                var invariantFields = currentProduct.ProductProperties;

                var localizationContext = ObjectFactory.Instance.Resolve <ILocalizationContext>();

                var fieldsForCurrentLanguage =
                    currentProduct.GetProperties(localizationContext.CurrentCultureCode).ToList();

                productDetailViewModel.ProductProperties = invariantFields.Concat(fieldsForCurrentLanguage).ToList();


                var uniqueVariants = from v in currentProduct.Variants.SelectMany(p => p.ProductProperties)
                                     where v.ProductDefinitionField.DisplayOnSite
                                     group v by v.ProductDefinitionField
                                     into g
                                     select g;

                foreach (var vt in uniqueVariants)
                {
                    var typeViewModel = productDetailViewModel.VariantTypes
                                        .Where(z => z.Id == vt.Key.ProductDefinitionFieldId)
                                        .FirstOrDefault();

                    if (typeViewModel == null)
                    {
                        typeViewModel = new VariantTypeViewModel
                        {
                            Id          = vt.Key.ProductDefinitionFieldId,
                            Name        = vt.Key.Name,
                            DisplayName = vt.Key.GetDisplayName()
                        };

                        productDetailViewModel.VariantTypes.Add(typeViewModel);
                    }

                    var variants = vt.ToList();

                    foreach (var variant in variants)
                    {
                        var variantViewModel = typeViewModel.Values
                                               .Where(v => v.Value == variant.Value)
                                               .FirstOrDefault();

                        if (variantViewModel == null)
                        {
                            variantViewModel = new VariantViewModel
                            {
                                Value    = variant.Value,
                                TypeName = typeViewModel.Name
                            };

                            if (!string.IsNullOrEmpty(variant.Product.PrimaryImageMediaId))
                            {
                                var variantImageUrl = imageService.GetImage(variant.Product.PrimaryImageMediaId).Url;
                                variantViewModel.PrimaryImageMediaUrl = UrlPath.ResolveAbsoluteUrl(variantImageUrl);
                            }

                            typeViewModel.Values.Add(variantViewModel);
                        }
                    }
                }

                productDetailViewModel.Routes.Add(RouteConstants.ADD_TO_BASKET_ROUTE_NAME,
                                                  RouteConstants.ADD_TO_BASKET_ROUTE_VALUE);
            }

            return(productDetailViewModel);
        }
예제 #2
0
        public virtual ProductDetailViewModel CreateDetailsViewModel()
        {
            ProductDetailViewModel productDetailViewModel = null;

            var currentProduct = SiteContext.Current.CatalogContext.CurrentProduct;

            if (currentProduct != null)
            {
                var    imageService    = UCommerce.Infrastructure.ObjectFactory.Instance.Resolve <IImageService>();
                var    currentCategory = SiteContext.Current.CatalogContext.CurrentCategory;
                string displayName     = string.Empty;
                if (currentProduct.ParentProduct != null)
                {
                    displayName = $"{currentProduct.ParentProduct.DisplayName()} ";
                }

                displayName += currentProduct.DisplayName();

                var productPrice = CatalogLibrary.CalculatePrice(new List <Product>()
                {
                    currentProduct
                }).Items.FirstOrDefault();

                decimal price    = 0;
                decimal discount = 0;

                if (productPrice != null)
                {
                    price    = productPrice.PriceExclTax;
                    discount = productPrice.DiscountExclTax;
                    var currentCatalog = SiteContext.Current.CatalogContext.CurrentCatalog;
                    if (currentCatalog != null && currentCatalog.ShowPricesIncludingVAT)
                    {
                        price    = productPrice.PriceInclTax;
                        discount = productPrice.DiscountInclTax;
                    }
                }

                var imageUrl         = imageService.GetImage(currentProduct.PrimaryImageMediaId).Url;
                var absoluteImageUrl = UrlPath.ResolveAbsoluteUrl(imageUrl);

                productDetailViewModel = new ProductDetailViewModel()
                {
                    DisplayName          = displayName,
                    Guid                 = currentProduct.Guid,
                    PrimaryImageMediaUrl = absoluteImageUrl,
                    LongDescription      = currentProduct.LongDescription(),
                    ShortDescription     = currentProduct.ShortDescription(),
                    ProductUrl           = CatalogLibrary.GetNiceUrlForProduct(currentProduct, currentCategory),
                    Price                = new Money(price, SiteContext.Current.CatalogContext.CurrentPriceGroup.Currency).ToString(),
                    Discount             = new Money(discount, SiteContext.Current.CatalogContext.CurrentPriceGroup.Currency).ToString(),
                    Sku             = currentProduct.Sku,
                    Rating          = Convert.ToInt32(Math.Round(currentProduct.Rating.GetValueOrDefault())),
                    VariantSku      = currentProduct.VariantSku,
                    IsVariant       = currentProduct.IsVariant,
                    IsProductFamily = currentProduct.ProductDefinition.IsProductFamily(),
                    AllowOrdering   = currentProduct.AllowOrdering,
                };

                if (currentProduct.ParentProduct != null)
                {
                    productDetailViewModel.ParentProductUrl =
                        CatalogLibrary.GetNiceUrlForProduct(currentProduct.ParentProduct, currentCategory);
                    productDetailViewModel.ParentProductDisplayName = currentProduct.ParentProduct.DisplayName();
                }

                if (currentCategory != null)
                {
                    productDetailViewModel.CategoryDisplayName = currentCategory.DisplayName();
                    productDetailViewModel.CategoryUrl         = CatalogLibrary.GetNiceUrlForCategory(currentCategory);
                    productDetailViewModel.ProductUrl          = CatalogLibrary.GetNiceUrlForProduct(currentProduct, currentCategory);
                }


                foreach (var pv in currentProduct.Variants)
                {
                    foreach (var v in pv.ProductProperties)
                    {
                        if (v.ProductDefinitionField != null && v.ProductDefinitionField.IsVariantProperty)
                        {
                            if (productDetailViewModel.VariantTypes.Any(t => t.Id == v.ProductDefinitionField.Id))
                            {
                            }
                        }
                    }
                }


                var uniqueVariants = from v in currentProduct.Variants.SelectMany(p => p.ProductProperties)
                                     where v.ProductDefinitionField.DisplayOnSite
                                     group v by v.ProductDefinitionField into g
                                     select g;

                foreach (var vt in uniqueVariants)
                {
                    var typeViewModel = productDetailViewModel.VariantTypes
                                        .Where(z => z.Id == vt.Key.ProductDefinitionFieldId)
                                        .FirstOrDefault();

                    if (typeViewModel == null)
                    {
                        typeViewModel = new VariantTypeViewModel
                        {
                            Id          = vt.Key.ProductDefinitionFieldId,
                            Name        = vt.Key.Name,
                            DisplayName = vt.Key.GetDisplayName()
                        };

                        productDetailViewModel.VariantTypes.Add(typeViewModel);
                    }

                    var variants = vt.ToList();

                    foreach (var variant in variants)
                    {
                        var variantViewModel = typeViewModel.Values
                                               .Where(v => v.Value == variant.Value)
                                               .FirstOrDefault();

                        if (variantViewModel == null)
                        {
                            variantViewModel = new VariantViewModel
                            {
                                Value    = variant.Value,
                                TypeName = typeViewModel.Name
                            };

                            if (!string.IsNullOrEmpty(variant.Product.PrimaryImageMediaId))
                            {
                                var variantImageUrl = imageService.GetImage(variant.Product.PrimaryImageMediaId).Url;
                                variantViewModel.PrimaryImageMediaUrl = UrlPath.ResolveAbsoluteUrl(variantImageUrl);
                            }

                            typeViewModel.Values.Add(variantViewModel);
                        }
                    }
                }

                productDetailViewModel.Routes.Add(RouteConstants.ADD_TO_BASKET_ROUTE_NAME, RouteConstants.ADD_TO_BASKET_ROUTE_VALUE);
            }

            return(productDetailViewModel);
        }