开发插件
开发标准
插件不得篡改、替换、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');
}
}
创建插件配置文件
在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' => '',
),
);
创建钩子模板文件
在mydemo
目录中创建info.html
模板文件,钩子在使用fetch
方法时对应的模板文件。
<h1>hello tpl</h1>
- 如果插件中需要有链接或提交数据的业务,可以在插件中创建controller业务文件,
- 要访问插件中的controller时使用addon_url生成url链接。
- 如下:
<a href="{:addon_url('mydemo://Action/link')}">link mydemo</a>
- 格式为:
mydemo
为插件名,Action
为controller
中的类名,link
为controller
中的方法- 创建插件的
controller
文件 - 在
mydemo
目录中创建controller
目录,在controller
目录中创建Action.php
文件controller
类的用法与tp5
中的controller
一致
<?php
namespace addons\mydemo\Controller;
class Action
{
public function link()
{
echo 'hello link';
}
}
如果需要使用view模板则需要继承thinkaddonsController类 模板文件所在位置为插件目录的view中,规则与模块中的view规则一致
<?php
namespace addons\mydemo\Controller;
use think\addons\Controller;
class Action extends Controller
{
public function link()
{
return $this->fetch();
}
}
行为事件【钩子】
在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 '电脑端';
}
}
}
模板中调用自定义行为
<div>{:hook('mydemohook', ['id'=>1])}</div>
php中调用自定义行为 只要是thinkphp5正常流程中的任意位置均可以使用
hook('mydemohook', ['id'=>1])
最终生成的目录结构为
maccms
└─ addons
│ └─mydemo
│ └─controller
│ │ └─Action.php
│ │─view
│ │ └─action
│ │ └─link.html
| │─config.php
| │─info.ini
| │─Mydemo.php
│─application
│─thinkphp
│─extend
│─vendor