在計算領域,插件( plug-in or plugin)是將特定的功能增長到大型軟件中的軟件組件。html
nopCommerce插件用來擴展nopCommerce的功能。nopCommerce 有幾種插件。例如,支付插件 ( PayPal),稅收, 貨運( UPS, USP, FedEx), 小應用程序widgets ( 'live chat' block), 等等。 nopCommerce 已帶有大量插件。你能夠在nopCommerce 官方網站搜索其餘人建立的知足你須要的插件。若是沒有找到,本文將告訴你如何本身建立組件。web
組件結構、要求的文件和文件存放的位置數據庫
首先,你必須在解決方案中建立新的類庫項目文件。組件文件最好存放在解決方案根目錄的\Plugins目錄下(不要與\Nop.Web\Plugins搞混,\Nop.Web\Plugins存放的是已經部署的插件)。瀏覽器
1. 插件項目文件名形如 "Nop.Plugin.{Group}.{Name}", {Group} 是插件組名 (例如,支付)。 {Name}是插件名(例如, "AuthorizeNet")。例如, Authorize.NET 支付插件的名稱是:Nop.Plugin.Payments.AuthorizeNet。ide
2. 插件項目文件創建後,須要更新項目生成的輸出路徑。 輸出路徑設置爲 "..\..\Presentation\Nop.Web\Plugins\{Group}.{Name}\"。例如,Authorize.NET 支付插件的輸出路徑是: "..\..\Presentation\Nop.Web\Plugins\Payments.AuthorizeNet\"。生成的插件DLL文件將存放在目錄 \Presentation\Nop.Web\Plugins\ 下, nopCommerce核心搜索這個目錄以便找到有效的插件。網站
a. 在項目菜單上,點擊屬性。ui
b. 點擊生成頁spa
c. 點擊輸出路徑右邊瀏覽按鈕,選擇適當的路徑。插件
3. 建立每一個插件都必須的文件Description.txt。這個文件包含了描述插件的元信息。能夠複製現有插件的文件Description.txt,修改這個文件知足新插件的須要。例如, Authorize.NET 支付插件的文件 Description.txt以下:htm
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_Data\InstalledPlugins.txt是已安裝的插件列表。
升級nopCommerce 對插件的影響
一些插件可能已過期,在新版的nopCommerce中再也不能用。若是你遇到這樣的問題,刪除插件,在官方nopCommerce網站上看看插件是否有新版本。許多插件的做者也會升級插件以適應新版本的nopCommerce。然而,也有插件沒有升級,隨着nopCommerce的改進變得過期了。可是,你老是能夠打開文件Description.txt file 更新SupportedVersions 。