在nopcommerce 3.0网站上显示所有类别和子类别?

时间:2013-07-17 16:29:25

标签: c# nopcommerce

我想知道是否有人知道如何修改代码以使左手导航菜单显示除主页,类别,搜索和放大器类别之外的所有子类别。产品页面?

我只需要朝着正确的方向努力。代码非常复杂,但我可以说它组织得很好。

2 个答案:

答案 0 :(得分:2)

nopCommerce执行延迟加载以获取类别的子类别。

要在菜单加载期间进行加载,必须获取所有类别的所有子类别。

获取这些子类别后,需要将这些数据存储在缓存中以提高网站的性能。

答案 1 :(得分:1)

NopCommerce对3.x做出了奇怪的决定,只加载活动类别的子类别,并为每个类别制作单独的缓存。此举的原因是通过单个请求阻止从数据库加载数千个类别来提高性能。这当然对数百种类别没有多大意义,它实际上使得缓存过期的浏览存储更慢。

加载所有类别修复

要加载所有类别(包括子类别),您必须在第218行 \ Presentation \ Nop.Web \ Controllers \ CatalogController.cs 中更改方法 PrepareCategoryNavigationModel

for (int i = 0; i <= breadCrumbIds.Count - 1; i++)
if (breadCrumbIds[i] == category.Id)
categoryModel.SubCategories.AddRange(PrepareCategoryNavigationModel(category.Id, breadCrumbIds));

categoryModel.SubCategories.AddRange(PrepareCategoryNavigationModel(category.Id, breadCrumbIds));

单一导航缓存修复

要制作单个导航缓存而不是为每个活动类别创建相同的缓存,请在第1157行进行更改

string cacheKey = string.Format(
    ModelCacheEventConsumer.CATEGORY_NAVIGATION_MODEL_KEY,
    _workContext.WorkingLanguage.Id,
    string.Join(",", customerRolesIds),
    _storeContext.CurrentStore.Id, 
    activeCategoryId);

string cacheKey = string.Format(
    ModelCacheEventConsumer.CATEGORY_NAVIGATION_MODEL_KEY,
    _workContext.WorkingLanguage.Id,
    string.Join(",", customerRolesIds),
    _storeContext.CurrentStore.Id, 
    0);

var breadCrumb = activeCategory != null ?
    activeCategory.GetCategoryBreadCrumb(categoryService, aclService, storeMappingService).Select(x => x.Id).ToList() : new List<int>();

var breadCrumb = new List<int>();

注意:更新防范方法

要在更新NopCommerce时保持更改,您可以将CatalogController.cs / CategoryNavigation复制为插件中的新控制器。然后在主题中更改视图_ColumnsTwo,_ColumnsThree以使用此新控制器。或者告诉NopCommerce添加设置以在两种方法之间切换:-P。