bugfix> c# > 投稿

私はeコマースのWebサイトを開始し、NopCommerce V4.00から開始することにしました。私はWordPressや他のCMSシステムをC#、. NET、MVCなどと共に使用して他のWebサイトを開発しましたが、NopCommerceに精通していないため、カスタマイズに取り組む最善の方法についての提案を探しています。

このサイトでは大規模なカスタマイズが必要になりますが、私が抱えている懸念の1つは保守性と更新に関するものです。 NopCommernceの新しいバージョンにアップグレードするときが来たときに、足元を撃ち、物事を本当に難しくしていないことを確認する必要があります。私はずっと前に、これらのシステムの上に常に追加し、可能な限りシステムコードをそのままにしておくことを学びました。

見つけたこの質問 ビューをオーバーライドすることに関して、ビューがテーマの下に存在する場合(同じ構造に従って)、そのビューが使用されると正しく仮定している場合、そのビューが使用されます。そうでない場合、デフォルトのビューはルート「ビュー」フォルダから使用されますか?

サイトの管理者側のカスタマイズについてはあまり見つけられないようで、ソースに触れずにサイトをカスタマイズする方法がわかりません。基本的に私が成し遂げる必要があるのは、あなたがそうするなら、「ダミーの証明」バージョンである管理領域の短縮バージョンを提供することです。新しい製品や属性を入力し、代わりにプラグインを提供するなど、カスタムインターフェイスを提供する必要がある領域を非表示にして、代わりに管理メニューに追加するには、アクセスコントロールとカスタムカスタマーロールを使用する方が賢明でしょうか?または、パブリック側で完全に別個のプラグインとしてこの全体を実行し、管理側を完全に除外する方が良いでしょうか?私はまだこのシステムで十分な経験がありません。別のエリアにあるため、許可の問題を回避したり、セキュリティに穴を開けたりしたくないです。

また、一般的にNopCommerceで知っておくべきヒントや落とし穴もありがたいです。かなりの数のサイトを見つけましたが、これらはすべてV2またはV3を参照しているようで、それ以降に大きな変更があったかどうかはわかりません。

ありがとう!


更新

この同じ情報を探している他の人がいる場合、答えに加えて、他の人がこれに対処するのに役立つかもしれないリンクをいくつか見つけることができました。

  • NopCommernceフォーラム-管理ビューと管理コントローラーのオーバーライド

  • NopCommerce管理ビューと部分ビューのオーバーライド 

  • NopCommerceプラグインによるビューのオーバーライドと追加 

  • nopCommerceプラグインでビューを表示する3つの方法(埋め込みリソース、テーマオーバーライド、カスタムビューエンジン)

  • Nopバージョン4.0で既存のコントローラーとアクションをオーバーライドする

  • Nop 4.0でカスタムビューエンジンを登録する場所

回答 2 件
  • まず、一度に複数の質問を追加しないでください。必要な数の質問をすることができますが、別々に !

    Maintainability and updates.

    nopCommerceで作業したように、プロジェクトのメンテナンスとアップグレードは簡単です。ただし、どのプラクティスに従うかによって異なります。いくつかあります一般 デフォルトコードを上書きしてカスタムコードを作成する方法。最適な方法は、要件に合わせてプラグインを開発することです。これにより、アップグレードプロセスがシームレスになります。

    しかし、nopCommerceが新しいテクノロジーに移行すると、既存のサイトを更新するのが面倒になります。nopCommerce3.90から4.0へのアップグレードで起こったことは、ASP.NETコアに移行するための抜本的な変更でした。しかし、技術に関する適切な知識があれば、簡単に行うことができます。

    I learned long ago to always try and add on top of these systems and leave the system code alone whenever possible

    はい、それは開発者にとって最も望ましい方法です。デフォルトのコードに触れずにシステム上でコードを実行することはできません。それがプラグ可能なアーキテクチャの使用目的です。

    if the view is present under the theme (following the same structure) then that view will be used otherwise the default view is used from the root 'Views' Folder?

    はい、最初にテーマフォルダの下にビューページを表示し、次にルートビューページを表示します。どちらもプラグインからオーバーライドできます。

    how to customize it without touching the source

    必要な機能を備えたプラグインを作成し、システムコードに挿入します。

    Would it be wiser to use the Access Control and possibly custom Customer Roles to hide any areas that I need to provide a custom interface for, such as entering new Products or Attributes and provide a Plugin instead and add that to the Admin Menu.

    新しいロールを作成して、ACL( Access Control List

    Or would it be better to do this whole thing as a totally separate Plugin on the Public side and leave the admin side totally out of it?

    管理者側またはフロントサイドで変更を行いたい場合は、要件によって異なりますが、どちらもプラグインから管理できます。

    お役に立てれば!

  • 言及する価値のあるものをいくつか見つけました。 NopCommernceがV4.0でいくつかの主要な変更を行ったこと、特に.Net Coreに進んだことを受け入れた回答が指摘したように、これは特にビューをオーバーライドするための推奨方法であるCustomViewEnginesに関してかなりの点で変更します。

    .Net Coreで物事が実行されるようになったので、別の方法があります。IViewLocationExpander

    たとえば、最初にレンダリングされる_AdminLayout.cshtmlを上書きするには、ViewLocationExpanderクラスが必要です。

    ViewLocationExpander
    public class ViewLocationExpander : IViewLocationExpander
    {
        public void PopulateValues(ViewLocationExpanderContext context)
        {
        }
        public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
        {
            // Since we are wanting to override the Admin template just look for Admin in the Context, you can also get the controller and view names here.
            if (context.AreaName == AreaNames.Admin)
            {
                //Add the location we want to use instead
                viewLocations = new string[] { $"/Plugins/YourPlugin/Views/Admin/{{1}}/{{0}}.cshtml",
                                              $"/Plugins/YourPlugin/Views/Admin/Shared/{{0}}.cshtml"}.Concat(viewLocations);
            }
            return viewLocations;
        }
    }
    
    

    次に、この新しいViewLocationExpanderを使用するようにNopCommerenceに指示するためのスタートアップファイルが必要です。 NopCommerence Engineは、INopStartupを実装するすべてのクラスを見つけ、起動時に実行します。

    YourPluginStartup.cs
    public class StoreManagerStartup : INopStartup
    {
        public void ConfigureServices(IServiceCollection services, IConfigurationRoot configuration)
        {
            services.Configure<RazorViewEngineOptions>(options =>
            {
                options.ViewLocationExpanders.Add(new ViewLocationExpander());
            });
        }
        public void Configure(IApplicationBuilder application)
        {
        }
        public int Order {
            get { return 0; } //Return 0 to force this to execute first, otherwise set higher i.e. 1001 
        }
    }
    
    

    プラグインとしてこれを行うときに見つけた1つのことは、適切なプロジェクトとともに_AdminLayout.cshtmlテンプレートへの参照を追加する必要があったことです。

    _AdminLayout.cshtml(ヘッダーのみ、コードは省略)
    @inject IWebHelper webHelper
    @inject IWorkContext workContext
    @inject IDateTimeHelper dateTimeHelper
    @inject IPermissionService permissionService
    @inject IEventPublisher eventPublisher
    @inject IHttpContextAccessor httpContextAccessor
    @inject CommonSettings commonSettings
    @inject LocalizationSettings localizationSettings
    @inject StoreInformationSettings storeInformationSettings
    @using System.Globalization;
    @using System.Text.Encodings.Web;
    @using Microsoft.AspNetCore.Http;
    @using Nop.Core.Domain.Customers;
    @using Nop.Web.Framework;
    @using Nop.Web.Framework.Events;
    @using Nop.Web.Framework.UI;
    @using Nop.Core;
    @using Nop.Core.Domain;
    @using Nop.Core.Domain.Common;
    @using Nop.Core.Domain.Localization;
    @using Nop.Services.Common;
    @using Nop.Services.Customers;
    @using Nop.Services.Events;
    @using Nop.Services.Helpers;
    @using Nop.Services.Security;
    
    

    管理メニューに追加するだけの場合は、単にIAdminMenuPlugin そのようなインターフェース:

    public class YourPlugin : BasePlugin, IAdminMenuPlugin
    {
        private readonly ISettingService _settingService;
        private readonly IWebHelper _webHelper;
        /**
         * Constructor
         **/
        public YourPlugin(ISettingService settingService, IWebHelper webHelper)
        {
            this._settingService = settingService;
            this._webHelper = webHelper;
        }
        /**
         * Adds the Admin Menu Item
         **/
        public void ManageSiteMap(SiteMapNode rootNode)
        {
            var menuItem = new SiteMapNode()
            {
                SystemName = "Plugins.YourPlugin",
                Title = "Your Plugin Title",
                ControllerName = "YourPlugin",
                ActionName = "Configure",
                Visible = true,
                RouteValues = new RouteValueDictionary() { { "area", null } },
            };
            // To add to the root Admin menu use
            rootNode.ChildNodes.Insert(1, menuItem); // or rootNode.ChildNodes.Add(menuItem);
            /* uncomment to add to the "Plugins" Menu Item
            var pluginNode = rootNode.ChildNodes.FirstOrDefault(x => x.SystemName == "Third party plugins");
            if (pluginNode != null)
                pluginNode.ChildNodes.Add(menuItem);
            else
                rootNode.ChildNodes.Add(menuItem);
            */
        }
    }
    
    

    インデックスページをオーバーライドする場合は、_ViewStart.cshtmlファイルを追加することを忘れないでください。追加しないと、テンプレートはロードされません。

あなたの答え