我想知道是否有人知道如何修改代码以使左侧导航菜单显示除主页、类别、搜索和产品页面上的类别之外的所有子类别?
我只需要朝着正确的方向前进。代码非常复杂,但我可以说它组织得很好。
我想知道是否有人知道如何修改代码以使左侧导航菜单显示除主页、类别、搜索和产品页面上的类别之外的所有子类别?
我只需要朝着正确的方向前进。代码非常复杂,但我可以说它组织得很好。
nopCommerce 执行延迟加载以获取类别的子类别。
要在菜单加载期间进行加载,必须获取所有类别的所有子类别。
获得这些子类别后,将需要将这些数据存储在缓存中以提高网站的性能。
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。