首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NopCommerce定制

NopCommerce定制
EN

Stack Overflow用户
提问于 2018-05-25 09:26:34
回答 2查看 2.5K关注 0票数 8

我正在启动一个eCommerce网站,并决定从NopCommerce V4.00开始。我已经开发了其他网站使用WordPress和其他CMS系统,以及C#,.NET,MVC等,但我不熟悉NopCommerce,我正在寻找一些建议,以解决定制是最好的方式。

这个网站将需要一些广泛的定制,其中一个我关心的是有关可维护性和更新。我需要确保,当升级到一个新版本的NopCommernce时,我不会对自己开枪,让事情变得很困难。很久以前,我就学会了,只要有可能,总是尝试在这些系统的基础上添加,而不使用系统代码。

我在重写视图方面找到了这个问题,如果我正确地假设视图在主题下存在(遵循相同的结构),那么该视图将被使用,否则默认视图将从根视图文件夹中使用?

我似乎找不到多少关于自定义管理方面的网站和不确定如何定制它而不触及源代码。基本上,我需要完成的是提供一个精简版本的管理区域,一个“虚拟证明”版本,如果你愿意的话。使用Access Control和可能的自定义客户角色来隐藏我需要为其提供自定义接口的任何区域,比如输入新产品或属性并提供插件,并将其添加到Admin菜单中,会更明智吗?还是在公共端作为一个完全独立的插件来做这件事会更好,而把管理端完全排除在外吗?我还没有足够的经验,这个系统,我想避免任何许可问题和/或打开任何漏洞的安全,因为它是在一个单独的地区。

我也会感谢你的任何提示,我应该知道的NopCommerce在一般情况下。我发现了不少网站,但这些网站似乎都引用了V2或V3,我不确定自那以后是否有任何重大变化。

谢谢!

更新

如果有其他人正在寻找同样的信息,除了答案之外,我还能找到一些其他人可能认为有用的链接来解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-26 07:47:33

首先,你不应该一次加一个以上的问题,你可以问你想问的问题,但单独问!

可维护性和更新。

正如我在nopCommerce中所做的那样,维护和升级项目很容易。然而,这取决于您将遵循哪些实践。有几种常见的方法可以在默认代码的基础上创建自定义代码。最好的方法是为您的需求开发一个插件,这将使升级过程无缝。

但是,当nopCommerce转向较新的技术时,更新您现有的站点会遇到麻烦,即nopCommerce 3.90到4.0升级时发生的事情,迁移到ASP.NET核心是一个巨大的变化。但是,有了适当的技术知识,你就可以轻松地做到这一点。

很久以前,我就学会了,只要有可能,总是尝试在这些系统的基础上添加系统代码,而不使用系统代码。

是的,这是开发人员最喜欢的,不要触及默认代码,在系统之上运行您的代码,这就是plugable体系结构的用途。

如果视图位于主题下(遵循相同的结构),那么该视图将被使用,否则默认视图将从根视图文件夹中使用?

是的,首先它呈现主题文件夹下的视图页,然后是根视图页。两者都可以通过插件覆盖。

如何在不触及源的情况下自定义

用您想要的功能创建您的插件,并将其注入系统代码。

是否更明智的做法是使用Access Control和可能的自定义客户角色来隐藏我需要为其提供自定义接口的任何区域,例如输入新产品或属性并提供插件,并将其添加到Admin菜单中。

您可以创建新角色并处理ACL(Access Control List)。

还是在公共端作为一个完全独立的插件来做这件事会更好,而把管理端完全排除在外吗?

这取决于您的需求,如果您想在管理端或前端进行更改,这两件事都可以从插件管理。

希望这能有所帮助!

票数 10
EN

Stack Overflow用户

发布于 2018-05-29 09:35:54

我发现了一些值得一提的东西。正如公认的答案指出的那样,NopCommernce在V4.0中进行了一些重大的更改--最显著的是转到.Net核心,这就改变了很多事情,特别是在CustomViewEngines方面,这是重写视图的首选方法。

现在,在.Net核心上运行的是另一种方法,IViewLocationExpander。

例如,要覆盖首先呈现的_AdminLayout.cshtml,需要一个ViewLocationExpander类:

ViewLocationExpander

代码语言:javascript
运行
复制
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;
    }
}

然后需要一个启动文件来告诉NopCommerence使用这个新的ViewLocationExpander。NopCommerence引擎找到实现INopStartup的所有类,并在启动时执行它们。

YourPluginStartup.cs

代码语言:javascript
运行
复制
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 
    }

}

在作为插件执行此操作时,我发现的一件事是,我必须添加一些对_AdminLayout.cshtml模板的引用以及相应的项目。

_AdminLayout.cshtml (仅标头,代码完整)

代码语言:javascript
运行
复制
@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;

如果您只想添加到Admin菜单中,只需从IAdminMenuPlugin接口继承,如下所示:

代码语言:javascript
运行
复制
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文件,否则模板将不会被加载。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50525834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档