插件开发
Masterlab插件可以让我们在不修改 Masterlab 核心的前提下,为 Masterlab 添加很多我们需要的功能。
Masterlab插件开发可以很简单,也可以很复杂,这取决于我们的需求是什么。最简单的插件是一个 PHP 文件。
比如输出“ Hello Word “,这个插件只包含了 插件头, 一些 PHP 函数, 和一些用来把插件函数添加到 Masterlab 中的钩子(Hooks)。
注:插件和Api功能在3.0版本中还处于测试阶段,部分功能可能存在bug和不足,敬请谅解
Masterlab插件有三大组件:
核心: Masterlab 根的app/ 和 public/ 目录下的所有文件。
插件: 位于根目录plugin 目录下,用来增强或改变Masterlab 的功能。
其他资源: 如根目录下的test,lib,storage,这些也是运行Masterlab的重要组成
要求
Masterlab插件目前只支持使用PHP和Javascript语言进行开发,待Api接口完善后可以使用任意web编程语言进行开发
配置开发环境
首先下载最新的masterlab代码,并进行安装 安装 Masterlab 参考文档:"私有部署"章节
Masterlab及插件目录结构说明
项目目录
masterlab
|-- vendor 为composer的第三方类库
|-- lib 为非vendor的第三方类库
|-- app 测试相关目录
|-- public 为网站访问到目录,入口文件在此,可存放静态文件
|-- storage 为存储目录,可存放临时文件 上传文件 日志等
|-- test 测试相关目录
|-- plugin 为插件目录,每个插件拥有一个目录
|-- document 插件实例 :文档管理
|-- webhook 插件实例 :webhook
|-- activity 插件实例 :活动日志
|-- ... 其他插件目录
|-- ... 其他插件目录
活动日志activity插件目录和文件说明
activity
|-- ctrl 插件的控制器代码
|---- ...
|---- ...
|-- event 插件的事件监听处理代码
|-- IssueSubscriber.php 接收事项的事件
|-- ProjectSubscriber.php 接收项目的事件
|-- OrgSubscriber.php 接收组织的事件
|-- ... 接收其他事件
|-- ...
|-- view 活动日志的视图文件
|-- ...
|-- ...
|-- log 插件日志存放目录
|-- index.php 插件的入口文件,当运行插件时首先执行到这里
|-- install.sql 插件安装时执行的sql语句
|-- plugin.json 插件的配置文件
|-- PluginSubscriber.php 可接收插件安装或卸载的事件
插件创建
要创建一个新的 Masterlab 插件,请按照以下步骤进行。
-
以管理员身份登录,在"管理"/"插件管理"页面
-
输入插件信息,提交后服务器会在plugin目录下创建初始插件文件
-
在插件列表页面,点击安装插件
-
进入到刚才创建的插件目录,基于此目录进行开发
根据不同的插件类型,插件的入口方式不同,这里选择的类型是"应用模块",那么在项目列表的到顶部模块导航会出现 一项"example"的插件入口链接,同时项目模板中的初始化系统中的也会多出"example"选项。
- 使用php进行开发时,可以参考系统已经自带的插件实例进行开发,如可直接访问数据库,事件处理等
操作数据库例子,在 index.php的pageIndex方法中直接实例化一个model,该model绑定一个数据库实例的db属性,
该db属性是 \Doctrine\DBAL 的实例,详细用户用法可参见 https://www.doctrine-project.org/projects/doctrine-dbal/en/2.12/index.html
下面是example插件首页的数据库使用示例,请查看 pageIndex 方法:
<?php
namespace main\plugin\example;
use main\app\classes\UserAuth;
use main\app\model\PluginModel;
use main\app\model\user\UserModel;
use main\app\model\issue\IssueModel;
use main\plugin\BasePluginCtrl;
/**
*
* 插件的入口类
* @package main\plugin\example
*/
class Index extends BasePluginCtrl
{
public $pluginInfo = [];
public $dirName = '';
public $pluginMethod = 'pageIndex';
public function __construct()
{
parent::__construct();
// 当前插件目录名
$this->dirName = basename(pathinfo(__FILE__)['dirname']);
// 当前插件的配置信息
$pluginModel = new PluginModel();
$this->pluginInfo = $pluginModel->getByName($this->dirName);
$pluginMethod = isset($_GET['_target'][3])? $_GET['_target'][3] :'';
if($pluginMethod=="/" || $pluginMethod=="\\" || $pluginMethod==''){
$pluginMethod = "pageIndex";
}
if(method_exists($this,$pluginMethod)){
$this->pluginMethod = $pluginMethod;
$this->$pluginMethod();
}
}
/**
* 插件首页方法
* @throws \Exception
*/
public function pageIndex()
{
$data = [];
$data['title'] = '插件首页';
$data['nav_links_active'] = 'plugin';
$data['current_user'] = UserModel::getInstance()->getByUid(UserAuth::getId());
$issueModel = new IssueModel();
$sql = "select * from issue_main limit 10";
$issueArr = $issueModel->db->fetchAll($sql);
print_r($issueArr);
$this->phpRender('index.php', $data);
}
}
前端开发
插件首页的pageIndex引入了一个view/index.php视图,在这个视图中可以任意添加你的前端代码,比如是跳转到其他的系统iframe
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插件的首页</title>
</head>
<body>
<?php
//print_r($current_user);
$iframe_url = 'https://www.masterlab.vip/product/agile';
?>
<div class="content" id="content-body">
<iframe width="100%" frameborder=no height="900px" src="<?=iframe_url?>"></iframe>
</div>
</body>
</html>