开发插件

开发标准

插件不得篡改、替换、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
php

创建插件配置文件

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
php

创建钩子模板文件

mydemo目录中创建info.html模板文件,钩子在使用fetch方法时对应的模板文件。

<h1>hello tpl</h1>
1
html
  • 如果插件中需要有链接或提交数据的业务,可以在插件中创建controller业务文件,
  • 要访问插件中的controller时使用addon_url生成url链接。
  • 如下:
<a href="{:addon_url('mydemo://Action/link')}">link mydemo</a>
1
html
  • 格式为:
  • 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
php

如果需要使用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
php

行为事件【钩子】

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<img width="200/" className="medium-zoom-image"/>响应发送标签位 <img width="200/" className="medium-zoom-image"/>系统<img width="200/" className="medium-zoom-image"/>

TIP

Mydemo.php 自定义 mydemohook 事件后,就可以在正常业务中使用该插件中的钩子了 使用钩子的时候第二个参数可以省略。苹果CMS中的行为支持ThinkPHP5的所有行为,以下是所有所支持的行为事件。

示例代码

  • 比如我要写一个功能希望它 在 视图输出 时自动执行,那么只需要在 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
php

模板中调用自定义行为

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

php中调用自定义行为 只要是thinkphp5正常流程中的任意位置均可以使用

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

最终生成的目录结构为

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
Scroll Top