>[danger] 碎片模塊主要實現的功能是在對應的地方執行一個片段的代碼,碎片本質其實就是在對應的地方放一個鉤子,在這個鉤子上動態關聯多個行為的過程,那么鉤子就是碎片的分類,行為就是要實現的碎片代碼。
>[info] 在COWCMS系統中默認放了一些系統的鉤子,比如管理員登錄(admin\_login),管理員退出(admin\_quit)等,了解更多的系統碎片鉤子 [點擊這里](http://doc.cowcms.com/950402)。
> 使用場景:管理員登錄的時候,在 **A** 模塊中要實現-寫入管理員登錄記錄,在 **B** 模塊要實現-記錄管理員登錄次數。
> 因為在管理員登錄的時候,系統默認監聽了管理員登錄鉤子(admin\_login),我們只需要給這個鉤子關聯( **A** 模塊和 **B** 模塊)中實現功能的2碎片代碼就可以,當程序執行到管理員登錄的時候,程序自動會執行他所關聯的行為碎片。
>[danger] 實例如下:
>第一步:創建模塊,在 application 目錄下,創建一個 **A** 模塊 和一個 **B** 模塊。
>第二步:關聯行為, 在 **A B** 模塊下分別創建 exec 目錄,在這個目錄下分別創建 event.php,結構如下:
A/exec/event.php
~~~php
return [
'action_0_0'=>['name'=>'A_record','order_num'=>0,'hook_name'=>'admin_login','install_module'=>'A','describe'=>'寫入管理員登錄記錄','class_name'=>''],
];
~~~
B/exec/event.php
~~~php
return [
'action_0_0'=>['name'=>'B_record','order_num'=>0,'hook_name'=>'admin_login','install_module'=>'B','describe'=>'記錄管理員登錄次數','class_name'=>''],
];
~~~
key為action\_0\_0的值,表示要在某個鉤子上關聯碎片(行為)
* [x] name:行為的名稱,也就是函數的名稱
* [x] order\_num:顯示和執行的順序,如一個鉤子關聯多個行為,先執行那個行為
* [x] describe:行為說明
* [x] install\_module:這個行為屬于那個模塊安裝的
* [x] hook\_name:鉤子的標識,如hook\_name為admin\_login,就表示在管理員登錄的時候執行該碎片(行為)
* [x] class\_name:行為執行的代碼片段的位置
>第三步:編寫行為代碼,第二步關聯了對應的行為,但是這個時候還沒有編寫行為代碼, 上邊關聯的行為代碼的位置為:
A模塊關聯的代碼在 /application/A/event/A.php
B模塊關聯的代碼在 /application/B/event/B.php
代碼如下:
```
namespace app\A\event;
class A
{
/*此處的函數名稱,正是在關聯行為時填寫的 key為name的 值*/
public function A_record($admin)
{
// $admin : 登錄管理員的信息,每個鉤子所對應的參數是不一樣的,具體參數請到到鉤子預覽表中去查看
// 此處編寫需要的代碼
$adminId = $admin['id'];
.............................................
}
//以下的代碼為A模塊關聯的其它鉤子的行為,和本實例沒關系,可以直接刪除
public function actionName()
{
//代碼段
}
}
```
```
namespace app\B\event;
class B
{
//此處的函數名稱,正是在關聯行為時填寫的 key為name的 值
public function B_record()
{
// $admin : 登錄管理員的信息,每個鉤子所對應的參數是不一樣的,具體參數請到到鉤子預覽表中去查看
// 此處編寫需要的代碼
$adminId = $admin['id'];
.............................................
}
}
```
#### 這樣當 A B模塊被安裝后,在有管理員登錄的時候,就會執行對應的 A_record B_record 這2個方法了
>[danger]如果有些模塊在關聯行為的時候,并不是關聯的本模塊種的行為,如在登錄的時候,A模塊關聯了一個行為,這個行為是想讓他執行B模塊中的B_record行為,我們可以做如下關聯,
A/exec/event.php
~~~php
return [
'action_0_0'=>['name'=>'B_record','order_num'=>0,'hook_name'=>'admin_login','install_module'=>'A','describe'=>'寫入管理員登錄記錄','class_name'=>'\\app\\B\\event\\B'],
];
~~~
這樣在管理員登錄的時候,就會執行B模塊下的B_record方法,其實這個原來很簡單。
>[danger] 鉤子行為執行的原理,分為幾個步驟:注意:install_module為安裝模塊名
> 第一步:當程序執行到鉤子處,檢測鉤子是否啟用,如果啟用執行,沒啟用將跳過
> 第二步:去數據表中查找和該鉤子關聯的行為
> 第三步:如果行為中 class_name值為真 , 執行 $hook = new $class_name(); $hook->name();
> 第四步:如果 class_name不為真,執行 $hook = new \\app\\install_module\\event\\install_module(); $hook->name();
所以 class_name 可以為任何可執行的類(注意命名空間)
>[danger] **注意:如果系統預設的鉤子無法滿足時,如何給自己的模塊添加鉤子**
第一步:首先在模塊的exec目錄里創建event.php,在文件中按格式寫入自己的鉤子
~~~php
return [
'hook_0'=>['name'=>'app_init','title'=>'模塊初始化','order_num'=>0,'describe'=>"在模塊中開始執行時執行行為",'class'=>1,'install_module'=>'A'],
];
~~~
第二步:在模塊開始運行的代碼處放入如下代碼
```
//代碼段
$param = [$moduleName]
eventAdd("app_init",$param)
```
>[info]eventAdd第一個參數為鉤子的標識(name),第二個參數為數組,是鉤子調用行為時傳遞的參數,比如為$moduleName為模塊名稱,那么在行為的中第一個參數就可以獲得$moduleName變量值。這樣當有人安裝了這個模塊后,就可以在任何模塊中針對app_init鉤子編寫行為了
key為hook\_0的值,表示要添加的碎片的分組(鉤子),這個主要作用是當系統預設的鉤子無法滿足需求時,在模塊中要添加自己的鉤子時,可以這樣寫
* [x] title:鉤子的名稱,如管理登錄,管理員退出,只是方便管理,在程序中無作用
* [x] name:鉤子標識,監聽鉤子時用到的標識,如果管理員登錄時為(admin\_login)
* [x] order\_num:鉤子顯示的排序,只使用于后臺顯示,方便關聯
* [x] describe:鉤子說明
* [x] class:必填為1,區分時鉤子還是行為
* [x] install\_module:這個鉤子屬于那個模塊安裝的
- 序言
- 基礎
- 源碼包
- 核心包
- 完整包
- 系統模塊
- 安裝模塊
- 后臺模塊
- 插件模塊
- 插件開發
- 開發基礎
- 權限開發
- 菜單開發
- 開發調試
- 碎片開發
- 碎片鉤子預設表
- 插件說明
- 字段插件
- 插件介紹
- 字段使用
- 單行文本
- 多行文本
- 選項-下拉
- 選項-復選
- 選項-單選
- 選項-滑塊
- 顏色選擇器
- 星級評分
- 日期時間
- 文件上傳
- 編輯器
- API接口
- 微信插件
- 微信配置
- 公眾號配置
- 支付配置
- 微信支付使用
- API類庫
- 紅包發放
- 付款到零錢
- 碎片
- 公眾號碎片
- 紅包碎片
- 付款到零錢碎片
- API微信接口
- 支付寶插件
- 支付寶配置
- 支付寶支付使用
- api接口
- api接口后端開發
- api接口前端使用
- API參數接口
- 會員插件
- 登錄使用
- 會員碎片
- API會員接口
- API注冊接口
- 積分插件
- 積分設置
- 積分碎片
- API積分接口
- API提現接口
- API兌換接口
- API充值接口
- 訂單
- 訂單碎片
- API訂單接口
- 商城
- 商城鉤子
- API商城接口
- API商城會員接口
- 簽到
- 簽到設置
- 簽到碎片
- API簽到接口
- 上傳
- 上傳設置
- 上傳JS接口
- 推廣插件
- 海報設置
- API海報接口
- 文章插件
- 文章設置
- 文章鉤子
- API文章接口
- API文章會員接口
- 管理員
- 管理員碎片
- 站內信
- API站內信接口
- 雜項
- 菜單
- 菜單設置
- API菜單接口
- 錯誤碼
- 支付碎片
- 支付
- 充值
- 購買會員組
- 購買產品