protected override ProductDetailsModel.ProductBreadcrumbModel PrepareProductBreadcrumbModel(Product product)
{
if (product == null)
throw new ArgumentNullException(nameof(product));
var cacheKey = string.Format(NopModelCacheDefaults.ProductBreadcrumbModelKey,
product.Id,
_workContext.WorkingLanguage.Id,
string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()),
_storeContext.CurrentStore.Id);
var cachedModel = _cacheManager.Get(cacheKey, () =>
{
var breadcrumbModel = new ProductDetailsModel.ProductBreadcrumbModel
{
Enabled = _catalogSettings.CategoryBreadcrumbEnabled,
ProductId = product.Id,
ProductName = _localizationService.GetLocalized(product, x => x.Name),
ProductSeName = _urlRecordService.GetSeName(product)
};
var productCategories = _categoryService.GetProductCategoriesByProductId(product.Id);
if (!productCategories.Any())
return breadcrumbModel;
//override to get referring URL instead of defaulting to 1st cat
var urlReferrer = _webHelper.GetUrlReferrer();
var category = !string.IsNullOrEmpty(urlReferrer)
? GetReferringCategory(urlReferrer, productCategories)
: productCategories[0].Category;
if (category == null)
return breadcrumbModel;
foreach (var catBr in _categoryService.GetCategoryBreadCrumb(category))
{
breadcrumbModel.CategoryBreadcrumb.Add(new CategorySimpleModel
{
Id = catBr.Id,
Name = _localizationService.GetLocalized(catBr, x => x.Name),
SeName = _urlRecordService.GetSeName(catBr),
IncludeInTopMenu = catBr.IncludeInTopMenu
});
}
return breadcrumbModel;
});
return cachedModel;
}
private Category GetReferringCategory(string referringUrl, IList<ProductCategory> categories)
{
var referringUrlSplit = referringUrl.Split('/');
if (referringUrlSplit.Length > 0)
{
for (var i = 0; i < referringUrlSplit.Length; i++)
{
if (referringUrlSplit[i].Length > 0)
{
var referringCategoryURL = referringUrlSplit[i];
var url = _urlRecordService.GetBySlug(referringCategoryURL);
if (url != null && url.EntityName.ToLower() == "category")
{
var referringCategory = _categoryService.GetCategoryById(url.EntityId);
if (referringCategory != null)
return referringCategory;
}
}
}
}
return categories[0].Category;
}