in src/Foundation/CommerceServer/code/Managers/CatalogManager.cs [630:691]
protected IEnumerable<CategoryViewModel> GroupRelationshipsByDescription([NotNull] CommerceStorefront storefront, [NotNull] IVisitorContext visitorContext, RelationshipField field, IEnumerable<string> relationshipNames, IEnumerable<CatalogRelationshipInformation> productRelationshipInfoList, Rendering rendering)
{
var relationshipGroups = new Dictionary<string, CategoryViewModel>(StringComparer.OrdinalIgnoreCase);
if (field != null && productRelationshipInfoList != null)
{
foreach (var relationshipInfo in productRelationshipInfoList)
{
if (!relationshipNames.Any() || relationshipNames.Contains(relationshipInfo.RelationshipName, StringComparer.OrdinalIgnoreCase))
{
Item lookupItem = null;
bool usingRelationshipName = string.IsNullOrWhiteSpace(relationshipInfo.RelationshipDescription);
var relationshipDescription = string.IsNullOrWhiteSpace(relationshipInfo.RelationshipDescription) ? StorefrontManager.GetRelationshipName(relationshipInfo.RelationshipName, out lookupItem) : relationshipInfo.RelationshipDescription;
CategoryViewModel categoryModel;
if (!relationshipGroups.TryGetValue(relationshipDescription, out categoryModel))
{
categoryModel = new CategoryViewModel
{
ChildProducts = new List<ProductViewModel>(),
RelationshipName = relationshipInfo.RelationshipName,
RelationshipDescription = relationshipDescription,
LookupRelationshipItem = (usingRelationshipName) ? lookupItem : null
};
relationshipGroups[relationshipDescription] = categoryModel;
}
var targetItemId = ID.Parse(relationshipInfo.ToItemExternalId);
var targetItem = field.InnerField.Database.GetItem(targetItemId);
var productModel = new ProductViewModel(targetItem);
productModel.Initialize(rendering);
this.GetProductRating(targetItem);
categoryModel.ChildProducts.Add(productModel);
}
}
}
if (relationshipGroups.Count > 0)
{
List<ProductViewModel> productViewModelList = new List<ProductViewModel>();
foreach (string key in relationshipGroups.Keys)
{
CategoryViewModel viewModel = relationshipGroups[key];
var childProducts = viewModel.ChildProducts;
if (childProducts != null && childProducts.Count > 0)
{
productViewModelList.AddRange(childProducts);
}
}
if (productViewModelList.Count > 0)
{
this.GetProductBulkPrices(visitorContext, productViewModelList);
this.InventoryManager.GetProductsStockStatusForList(storefront, productViewModelList);
}
}
return relationshipGroups.Values;
}