Skip to content

Commit 2425b53

Browse files
committed
Product bundle: Selecting an attribute of a bundle or associated item updates its thumbnail on the product detail page
1 parent a2e69c1 commit 2425b53

5 files changed

Lines changed: 67 additions & 32 deletions

File tree

src/Presentation/SmartStore.Web/Controllers/CatalogController.cs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,7 +1388,7 @@ protected ProductDetailsModel PrepareProductDetailModel(ProductDetailsModel mode
13881388

13891389
#region Attribute combinations
13901390

1391-
if (!isBundle || (isBundle && product.BundlePerItemPricing))
1391+
if (!isBundle)
13921392
{
13931393
model.Combinations = _productAttributeService.GetAllProductVariantAttributeCombinations(product.Id);
13941394

@@ -2675,6 +2675,7 @@ public ActionResult UpdateProductDetails(int productId, string itemType, int bun
26752675
int quantity = 1;
26762676
int galleryStartIndex = -1;
26772677
string galleryHtml = null;
2678+
string dynamicThumbUrl = null;
26782679
bool isAssociated = itemType.IsCaseInsensitiveEqual("associateditem");
26792680
var pictureModel = new ProductDetailsPictureModel();
26802681
var m = new ProductDetailsModel();
@@ -2702,40 +2703,43 @@ public ActionResult UpdateProductDetails(int productId, string itemType, int bun
27022703
// get merged model data
27032704
PrepareProductDetailModel(m, product, isAssociated, bundleItem, bundleItems, form, quantity);
27042705

2705-
// get updated image gallery
2706-
if (product.ProductType != ProductType.BundledProduct && bundleItem == null)
2707-
{
2708-
var pictures = _pictureService.GetPicturesByProductId(productId);
2706+
if (bundleItem != null) // update bundle item thumbnail
2707+
{
2708+
if (!bundleItem.HideThumbnail)
2709+
{
2710+
var picture = m.GetAssignedPicture(_pictureService, null, bundleItem.ProductId);
2711+
dynamicThumbUrl = _pictureService.GetPictureUrl(picture, _mediaSettings.BundledProductPictureSize, false);
2712+
}
2713+
}
2714+
else if (isAssociated) // update associated product thumbnail
2715+
{
2716+
var picture = m.GetAssignedPicture(_pictureService, null, productId);
2717+
dynamicThumbUrl = _pictureService.GetPictureUrl(picture, _mediaSettings.AssociatedProductPictureSize, false);
2718+
}
2719+
else if (product.ProductType != ProductType.BundledProduct) // update image gallery
2720+
{
2721+
var pictures = _pictureService.GetPicturesByProductId(productId);
27092722

2710-
if (pictures.Count <= _catalogSettings.DisplayAllImagesNumber)
2711-
{
2712-
// all pictures rendered... only index is required
2713-
if (m.CombinationSelected != null)
2714-
{
2715-
var combiAssignedImages = m.CombinationSelected.GetAssignedPictureIds();
2716-
if (combiAssignedImages.Length > 0)
2717-
{
2718-
var picture = pictures.FirstOrDefault(p => p.Id == combiAssignedImages[0]);
2719-
if (picture != null)
2720-
galleryStartIndex = pictures.IndexOf(picture);
2721-
}
2722-
}
2723-
}
2724-
else
2725-
{
2726-
var allCombinationImageIds = new List<int>();
2723+
if (pictures.Count <= _catalogSettings.DisplayAllImagesNumber) // all pictures rendered... only index is required
2724+
{
2725+
var picture = m.GetAssignedPicture(_pictureService, pictures);
2726+
galleryStartIndex = (picture == null ? 0 : pictures.IndexOf(picture));
2727+
}
2728+
else
2729+
{
2730+
var allCombinationImageIds = new List<int>();
27272731

27282732
_productAttributeService
27292733
.GetAllProductVariantAttributeCombinations(product.Id)
27302734
.GetAllCombinationImageIds(allCombinationImageIds);
27312735

2732-
PrepareProductDetailsPictureModel(pictureModel, pictures, product.GetLocalized(x => x.Name), allCombinationImageIds,
2736+
PrepareProductDetailsPictureModel(pictureModel, pictures, product.GetLocalized(x => x.Name), allCombinationImageIds,
27332737
false, bundleItem, m.CombinationSelected);
27342738

2735-
galleryHtml = this.RenderPartialViewToString("_ProductDetailsPictures", pictureModel);
2736-
galleryStartIndex = pictureModel.GalleryStartIndex;
2737-
}
2738-
}
2739+
galleryStartIndex = pictureModel.GalleryStartIndex;
2740+
galleryHtml = this.RenderPartialViewToString("_ProductDetailsPictures", pictureModel);
2741+
}
2742+
}
27392743

27402744
#region data object
27412745
object data = new
@@ -2788,8 +2792,9 @@ public ActionResult UpdateProductDetails(int productId, string itemType, int bun
27882792
Availability = new { Text = m.StockAvailability, Show = product.DisplayStockAvailability, Available = m.IsAvailable }
27892793
},
27902794

2791-
GalleryHtml = galleryHtml,
2792-
GalleryStartIndex = galleryStartIndex
2795+
DynamicThumblUrl = dynamicThumbUrl,
2796+
GalleryStartIndex = galleryStartIndex,
2797+
GalleryHtml = galleryHtml
27932798
};
27942799
#endregion
27952800

src/Presentation/SmartStore.Web/Extensions/ProductDetailsExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Web.Mvc;
55
using SmartStore.Web.Models.Catalog;
66
using SmartStore.Core.Domain.Catalog;
7+
using SmartStore.Core.Domain.Media;
8+
using SmartStore.Services.Media;
79

810
namespace SmartStore.Web.Extensions
911
{
@@ -26,6 +28,29 @@ public static bool RenderBundleTitle(this ProductDetailsModel model)
2628
{
2729
return model.BundleTitleText.HasValue() && model.BundledItems.Where(x => x.BundleItem.Visible).Count() > 0;
2830
}
31+
public static Picture GetAssignedPicture(this ProductDetailsModel model, IPictureService pictureService, IList<Picture> pictures, int productId = 0)
32+
{
33+
if (model != null && model.CombinationSelected != null)
34+
{
35+
Picture picture = null;
36+
var combiAssignedImages = model.CombinationSelected.GetAssignedPictureIds();
37+
38+
if (combiAssignedImages.Length > 0)
39+
{
40+
if (pictures == null)
41+
picture = pictureService.GetPictureById(combiAssignedImages[0]);
42+
else
43+
picture = pictures.FirstOrDefault(p => p.Id == combiAssignedImages[0]);
44+
}
45+
46+
if (picture == null && productId != 0)
47+
{
48+
picture = pictureService.GetPicturesByProductId(productId, 1).FirstOrDefault();
49+
}
50+
return picture;
51+
}
52+
return null;
53+
}
2954

3055
public static bool ShouldBeRendered(this ProductDetailsModel.ProductVariantAttributeModel variantAttribute)
3156
{

src/Presentation/SmartStore.Web/Scripts/public.product-detail.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@
103103
attrLine.find(".value").html(newValue);
104104
attrLine.removeClass("hide");
105105
attrLine.addClass("in");
106-
} else {
106+
}
107+
else {
107108
attrLine.find(".value").html();
108109
attrLine.addClass("hide");
109110
attrLine.removeClass("in");
@@ -120,6 +121,10 @@
120121
updateAttrLine(".attr-stock", data.Stock.Availability.Text);
121122

122123
context.find('.add-to-cart .form-inline').toggle(data.Stock.Availability.Available);
124+
125+
if (data.DynamicThumblUrl && data.DynamicThumblUrl.length > 0) {
126+
$(context).find('.dynamic-image img').attr('src', data.DynamicThumblUrl);
127+
}
123128
};
124129

125130
this.initialized = false;

src/Presentation/SmartStore.Web/Views/Catalog/_ProductBundleItems.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
@if (item.DetailsPictureModel.DefaultPictureModel.ImageUrl.HasValue() && !item.BundleItem.HideThumbnail)
1212
{
13-
<div class="bundle-item-image" style="min-width: @(item.ThumbDimensions)px; min-height: @(item.ThumbDimensions)px;">
13+
<div class="bundle-item-image dynamic-image" style="min-width: @(item.ThumbDimensions)px; min-height: @(item.ThumbDimensions)px;">
1414
<img src="@item.DetailsPictureModel.DefaultPictureModel.ImageUrl" alt="@item.DetailsPictureModel.AlternateText" title="@item.DetailsPictureModel.DefaultPictureModel.Title" />
1515
</div>
1616
}

src/Presentation/SmartStore.Web/Views/Catalog/_ProductTemplate.Grouped.AssociatedProduct.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<div class="clearfix">
99
@if (!String.IsNullOrWhiteSpace(Model.DetailsPictureModel.DefaultPictureModel.ImageUrl))
1010
{
11-
<div class="variant-picture equalized-column" data-equalized-column-name="pd">
11+
<div class="variant-picture dynamic-image equalized-column" data-equalized-column-name="pd">
1212
<img alt="@Model.DetailsPictureModel.AlternateText" src="@Model.DetailsPictureModel.DefaultPictureModel.ImageUrl"
1313
title="@Model.DetailsPictureModel.DefaultPictureModel.Title" />
1414
</div>

0 commit comments

Comments
 (0)