# 開發插件

開發標準

插件不得篡改、替換、cms系統文件,只允許在不影響原有功能的情況添加配置參數,如【後臺菜單配置、播放組配置】。如果每個開發者都不遵守該規則,那麽應用市場面臨各種相互不兼容問題,嚴重的還會影響cms本身功能以及安全問題,請廣大開發者們務必遵守。

# 創建插件

創建的插件可以在view視圖中使用,也可以在php業務中使用 安裝完成後訪問系統時會在項目根目錄生成名為addons的目錄,在該目錄中創建需要的插件。 下面寫一個例子:

  • 創建mydemo插件
  • addons目錄中創建mydemo目錄
  • 創建鉤子實現類
  • mydemo目錄中創建Mydemo.php類文件。註意:類文件首字母需大寫
<?php
namespace addons\mydemo;	// 註意命名空間規範
use thinkAddons;
/**
 * 插件測試
 * @author byron sampson
 */
class Mydemo extends Addons	// 需繼承thinkaddonsAddons類
{
	// 該插件的基礎信息
    public $info = [
        'name' => 'mydemo',	// 插件標識
        'title' => '插件測試',	// 插件名稱
        'description' => 'thinkph5插件測試',	// 插件簡介
        'status' => 0,	// 狀態
        'author' => 'byron sampson',
        'version' => '0.1'
    ];

    /**
     * 插件安裝方法
     * @return bool
     */
    public function install()
    {
        return true;
    }

    /**
     * 插件卸載方法
     * @return bool
     */
    public function uninstall()
    {
        return true;
    }

    /**
     * 實現的mydemohook鉤子方法
     * @return mixed
     */
    public function mydemohook($param)
    {
		// 調用鉤子時候的參數信息
        print_r($param);
		// 當前插件的配置信息,配置信息存在當前目錄的config.php文件中,見下方
        print_r($this->getConfig());
		// 可以返回模板,模板文件默認讀取的為插件目錄中的文件。模板名不能為空!
        return $this->fetch('info');
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

# 創建插件配置文件

mydemo目錄中創建config.php類文件,插件配置文件可以自定義一些參數,然後在程序任何位置使用 get_addon_config(mydemo) 來獲取定義的參數,後臺打開配置視圖為插件按鈕的配置入口。

完整的config.php示例

<?php
return array (
   0 => array (
       'name' => 'rewrite', # 偽靜態,在蘋果cms開啟路由模式後可在rewrite數組下的 value 添加路由規則
       'title' => '偽靜態',
       'type' => 'array', # 數組類型
       'content' => array (),
       'value' => array (
          'index' => '/mydemo$',
          'api/index' => '/api$'
       ),
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   1 => array (
       'name' => 'open',
       'title' => '多選框',
       'type' => 'radio', # radio 多選框類型
       'content' => array (
          'on' => '啟用',
          'off' => '關閉',
       ),
       'value' => 'off',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   2 => array (
       'name' => 'open',
       'title' => '復選框',
       'type' => 'checkbox', # 復選框 類型
       'content' => array (
          'on' => '啟用',
          'off' => '關閉',
       ),
       'value' => 'off',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   3 => array (
       'name' => 'menu',
       'title' => '輸入框',
       'type' => 'string', # 字符串 輸入框類型
       'content' => array (),
       'value' => '1,2,3,4',
       'rule' => 'required',
       'msg' => '',
       'tip' => '備註文字',
       'ok' => '',
       'extend' => '', #string 類型支持 extend參數,如:style="line-height: 1.8;"
   ),
   4 => array (
       'name' => 'hot_banner',
       'title' => '下拉菜單',
       'type' => 'selects', # 下拉菜單類型
       'content' => array (
          0 => '小圖風格',
          1 => '巨幕風格',
       ),
       'value' => '1',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   5 => array (
       'name' => 'tiptext',
       'title' => '文本框',
       'type' => 'text', # textarea 文本框類型
       'content' => array (),
       'value' => '大家好我是老王,建站就用蘋果cms',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => 'style="height: 150px;"', # text 類型支持 extend參數,如:style="line-height: 1.8;"
   ),
   6 => array (
       'name' => 'go_time',
       'title' => '日期選擇',
       'type' => 'datetime', # 日期選擇器 類型
       'content' => array (),
       'value' => '1629560562',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '',
   ),
   7 => array (
       'name' => 'go_pic',
       'title' => '上傳圖片',
       'type' => 'images', # 上傳圖片表單類型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
   8 => array (
       'name' => 'go_file',
       'title' => '上傳文件',
       'type' => 'files', # 上傳文件表單類型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
   9 => array (
       'name' => 'go_bool',
       'title' => '雙選表單',
       'type' => 'bool', # 雙選表單類型
       'content' => array (),
       'value' => '',
       'rule' => 'required',
       'msg' => '',
       'tip' => '',
       'ok' => '',
       'extend' => '', 
   ),
 );
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136

# 創建鉤子模板文件

mydemo目錄中創建info.html模板文件,鉤子在使用fetch方法時對應的模板文件。

<h1>hello tpl</h1>
1
  • 如果插件中需要有鏈接或提交數據的業務,可以在插件中創建controller業務文件,
  • 要訪問插件中的controller時使用addon_url生成url鏈接。
  • 如下:
<a href="{:addon_url('mydemo://Action/link')}">link mydemo</a>
1
  • 格式為:
  • mydemo為插件名,Actioncontroller中的類名,linkcontroller中的方法
  • 創建插件的controller文件
  • mydemo目錄中創建controller目錄,在controller目錄中創建Action.php文件 controller類的用法與tp5中的controller一致
<?php
namespace addons\mydemo\Controller;

class Action
{
    public function link()
    {
        echo 'hello link';
    }
}
1
2
3
4
5
6
7
8
9
10

如果需要使用view模板則需要繼承thinkaddonsController類 模板文件所在位置為插件目錄的view中,規則與模塊中的view規則一致

<?php
namespace addons\mydemo\Controller;

use think\addons\Controller;

class Action extends Controller
{
    public function link()
    {
        return $this->fetch();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 行為事件【鉤子】

Mydemo.php 自定義 mydemohook 事件後,就可以在正常業務中使用該插件中的鉤子了 使用鉤子的時候第二個參數可以省略。蘋果cms中的行為支持ThinkPHP5的所有行為,以下是所有所支持的行為事件。

標簽位 描述 類型說明
app_init 應用初始化標簽位 系統
app_begin 應用開始標簽位 系統
module_init 模塊初始化標簽位 系統
action_begin 控製器開始標簽位 系統
view_filter 視圖輸出過濾標簽位 系統
app_end 應用結束標簽位 系統
log_write 日誌write方法標簽位 系統
log_write_done 日誌寫入完成標簽位 系統
response_end 輸出結束標簽位 系統
response_send 響應發送標簽位 系統

TIP

使用行為時在Mydemo.php中添加上對應的方法,插件在安裝時、禁用、啟用即可自動註冊行為。但一定請註意在Mydemo.php中編寫行為方法是使用的是駝峰式規則,例如view_filter,方法名則為viewFilter,如果方法名使用view_filter則不會註冊成功

示例代碼

  • 比如我要寫一個功能希望它 在 視圖輸出 時自動執行,那麽只需要在 Mydemo.php 創建 viewFilter 方法即可,當插件啟用時自動註冊到view_filter 中,並且全局運行,不需要你在前臺控製器或者模板中手動調用。
 public function viewFilter(&$request)
    {
      if(ENTRANCE == "index"){ # 使用 ENTRANCE 判斷是否為前臺
         $isMobile = 0;
         $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
         $uachar = "/(nokia|sony|ericsson|mot|samsung|sgh|lg|philips|panasonic|alcatel|lenovo|meizu|cldc|midp|iphone|wap|mobile|android)/i";
         if((preg_match($uachar, $ua))) {
            $isMobile = 1;
            echo '手機端';
         }else{
            echo '電腦端';   
         }
      } 
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

模板中調用自定義行為

<div>{:hook('mydemohook', ['id'=>1])}</div>
1

php中調用自定義行為 只要是thinkphp5正常流程中的任意位置均可以使用

hook('mydemohook', ['id'=>1])
1

最終生成的目錄結構為

maccms
 └─ addons
 │   └─mydemo
 │      └─controller
 │      │   └─Action.php
 │      │─view
 │      │   └─action
 │      │       └─link.html
 |      │─config.php
 |      │─info.ini
 |      │─Mydemo.php
 │─application
 │─thinkphp
 │─extend
 │─vendor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

溫馨提示

以上技術資料由 大圖模板 (opens new window) 獨家整理提供,轉載進標明出處,感謝您的配合!