在计算领域,插件( plug-in or plugin)是将特定的功能增加到大型软件中的软件组件。
nopCommerce插件用来扩展nopCommerce的功能。nopCommerce 有几种插件。例如,支付插件 ( PayPal),税收, 货运( UPS, USP, FedEx), 小应用程序widgets ( 'live chat' block), 等等。 nopCommerce 已带有大量插件。你可以在nopCommerce 官方网站搜索其他人创建的满足你需要的插件。如果没有找到,本文将告诉你如何自己创建组件。
组件结构、要求的文件和文件存放的位置
首先,你必须在解决方案中创建新的类库项目文件。组件文件最好存放在解决方案根目录的Plugins目录下(不要与Nop.WebPlugins搞混,Nop.WebPlugins存放的是已经部署的插件)。
1. 插件项目文件名形如 "Nop.Plugin.{Group}.{Name}", {Group} 是插件组名 (例如,支付)。 {Name}是插件名(例如, "AuthorizeNet")。例如, Authorize.NET 支付插件的名称是:Nop.Plugin.Payments.AuthorizeNet。
2. 插件项目文件建立后,需要更新项目生成的输出路径。 输出路径设置为 "....PresentationNop.WebPlugins{Group}.{Name}"。例如,Authorize.NET 支付插件的输出路径是: "....PresentationNop.WebPluginsPayments.AuthorizeNet"。生成的插件DLL文件将存放在目录 PresentationNop.WebPlugins 下, nopCommerce核心搜索这个目录以便找到有效的插件。
a. 在项目菜单上,点击属性。
b. 点击生成页
c. 点击输出路径右边浏览按钮,选择适当的路径。
3. 创建每个插件都必须的文件Description.txt。这个文件包含了描述插件的元信息。可以复制现有插件的文件Description.txt,修改这个文件满足新插件的需要。例如, Authorize.NET 支付插件的文件 Description.txt如下:
Group: Payment methods
FriendlyName: Credit Card
SystemName: Payments.AuthorizeNet
Version: 1.00
SupportedVersions: 2.30
Author: nopCommerce team
DisplayOrder: 1
FileName: Nop.Plugin.Payments.AuthorizeNet.dll
4. 文件的内容一目了然,但有几点需要注意。SystemName必须唯一。Version 是插件的版本;其值可以随意设置。SupportedVersions 是支持的nopCommerce 版本,用逗号分隔(确保当前的nopCommerce版本包含其中,否则插件就不能加载)。 FileName 的格式是Nop.Plugin.{Group}.{Name}.dll。确保文件Description.txt的属性“复制到输出目录”设置为“如果较新则复制”。
5. 最后一步就是创建一个类实现IPlugin接口(Nop.Core.Plugins 名称空间)。 nopCommerce 有一个BasePlugin 类,该类已经实现了一些IPlugin方法,使得我们可以避免代码重复。nopCommerce还提供了一些从IPlugin导出的接口。例如,接口 "IPaymentMethod" 用于创建新的支付方法插件。该接口还包含一些支付方式方法,例如, ProcessPayment() 或 GetAdditionalHandlingFee()。目前nopCommerce有下面特定的插件接口:
a. IExternalAuthenticationMethod. 用于创建外部授权方法,例如Facebook, Twitter, OpenID, 等等。
b. IWidgetPlugin. 允许创建小应用程序。小应用程序呈现在网页的某个部分。例如, "Live chat" 呈现在网页的左侧。
c. IExchangeRateProvider. 用于获得汇率。
d. IDiscountRequirementRule. 允许创建新的折扣规则,例如"Billing country of a customer should be…"
e. ISMSProvider. SMS 提供者允许你发送SMS事件通知。
f. IPaymentMethod. 用于支付处理。
g. IPromotionFeed. These plugins are used for feed generations such as Froogle or PriceGrabber
h. IShippingRateComputationMethod. 用于提取可接受的发货方式和运费。例如, UPS, UPS, FedEx, 等等。
i. ITaxProvider. 用于获得税率。
如果上面的接口不是你的插件需要的,你可以用"IMiscPlugin" 接口。
处理请求。Controllers, models and views.
现在你可以在Admin area > Configuration > Plugins看到插件了。但是新插件还什么也没有做。甚至还没有用于设置的用户界面。我们现在就来创建一个设置页面。我们需要做的是创建controller, model, 和view。
1. MVC 控制器负责响应对ASP.NET MVC 网站的请求。每一个浏览器请求都映射到一个控制器。
2. 视图包含了发送到浏览器的HTML 标记和内容。
3. MVC 模型包含了应用逻辑。
让我们开始吧:
1. 创建model. 在新建的插件目录下增加Models目录,在Models目录下新建model 类。
2. 创建view. 在新建的插件目录下增加Views目录。然后新建{Name}目录 ( {Name} 是插件名称),新建文件Configure.cshtml。 注意:文件属性“生成操作”应设置为“嵌入的资源”。
3. 创建controller. 在新建的插件目录下增加Controllers目录。然后新建一个controller 类。最好用类文件名{Group}{Name}Controller.cs。例如PaymentAuthorizeNetController.cs。创建适当的action 方法。并命名为 "Configure"。编写model 类并传递给相应的视图: "Nop.Plugin.{Group}.{Name}.Views. {Group}{Name}.Configure"
Tip 1: 可以复制现有插件的文件web.config 到新建的插件项目文件下。这个文件使得你可以使用智能感知。
Tip 2: 最容易的方法是复制现有插件的文件,然后修改成新的插件。
Tip 3: 如果限制只有管理员可以访问控制器的action方法,只需将方法标记为[AdminAuthorize] 属性。
Tip 4: Going forward make sure "Copy local" properties of all third-party assembly references are set to "False" (do not copy). This will reduce the deployed package size.
例如,Authorize.NET 插件项目结构如下图所示:
路由
我们需要注册插件路由。ASP.NET 路由负责映射浏览器请求到MVC控制器action,步骤如下:
1. 新建文件RouteProvider.cs。该文件将插件路由通知给nopCommerce 系统。例如,下面的RouteProvider类增加了一个新路由,使得在浏览器打开URL, http://www.yourStore.com/Plugins/PaymentAuthorizeNet/Configure/ 可以访问
public partial class RouteProvider : IRouteProvider
{
public void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("Plugin.Payments.AuthorizeNet.Configure",
"Plugins/PaymentAuthorizeNet/Configure",
new { controller = "PaymentAuthorizeNet", action = "Configure" },
new[] { "Nop.Plugin.Payments.AuthorizeNet.Controllers" }
);
}
public int Priority
{
get
{
return 0;
}
}
}
2. 有些插件接口和"IMiscPlugin" 接口有方法: "GetConfigurationRoute"。 该方法应当返回一个路由给控制器action,用于插件配置。实现你的插件接口的方法"GetConfigurationRoute"。该方法通知nopCommerce 什么路由用于插件配置。如果你的插件没有配置页, "GetConfigurationRoute" 应返回null。如下所示:
public void GetConfigurationRoute(out string actionName,
out string controllerName,
out RouteValueDictionary routeValues)
{
actionName = "Configure";
controllerName = "PaymentAuthorizeNet";
routeValues = new RouteValueDictionary()
{
{ "Namespaces", "Nop.Plugin.Payments.AuthorizeNet.Controllers" },
{ "area", null }
};
}
一旦你安装了插件,增加了configuration 方法,你就可以在Admin > Configuration > Plugins 下找到配置插件的链接。
处理"Install" and "Uninstall" 方法
这一步是可选的。一些插件在安装时要求一些其他的逻辑,例如,插入新的本地资源。打开IPlugin 实现 (大多数情况下它是从BasePlugin类导出的),覆写下面的方法:
1. Install. 安装插件时调用这个方法。你可以在这个方法中初始化任何设置值,插入新的本地资源,或者是创建新的数据库表(如果必要)。
2. Uninstall. 卸载插件时调用这个方法。
注意: 如果覆写这两个方法之一,不要隐藏方法的基实现。例如,覆写"Install" 方法应该包含方法调用:base.Install()。 Authorize.NET 插件的"Install"方法如下:
public override void Install()
{
var settings = new AuthorizeNetPaymentSettings()
{
UseSandbox = true,
TransactMode = TransactMode.Authorize,
TransactionKey = "123",
LoginId = "456"
};
_settingService.SaveSetting(settings);
base.Install();
}
Tip: App_DataInstalledPlugins.txt是已安装的插件列表。
升级nopCommerce 对插件的影响
一些插件可能已过时,在新版的nopCommerce中不再能用。如果你遇到这样的问题,删除插件,在官方nopCommerce网站上看看插件是否有新版本。许多插件的作者也会升级插件以适应新版本的nopCommerce。然而,也有插件没有升级,随着nopCommerce的改进变得过时了。但是,你总是可以打开文件Description.txt file 更新SupportedVersions 。