1

ホームページ、カテゴリ、検索、製品ページのカテゴリに加えて、左側のナビゲーション メニューにすべてのサブカテゴリを表示するようにコードを変更する方法を誰かが知っているかどうか疑問に思っていました。

正しい方向へのプッシュが必要です。コードは非常に複雑ですが、非常によく整理されていることがわかります。

4

2 に答える 2

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 を変更して、この新しいコントローラーを使用します。または、2 つのアプローチを切り替える設定を追加するように NopCommerce に指示します:-P.

于 2013-09-30T15:52:14.723 に答える