184 lines
4.4 KiB
PHP
Executable File
184 lines
4.4 KiB
PHP
Executable File
<?php
|
||
class pluginModel{
|
||
var $in;
|
||
var $config;
|
||
function __construct(){
|
||
global $config, $in;
|
||
//parent::__construct();
|
||
$this -> in = &$in;
|
||
$this -> config = &$config;
|
||
}
|
||
public function loadData(){
|
||
if(!isset($this->config['settingSystem']['pluginList'])){
|
||
$this->config['settingSystem']['pluginList'] = array();
|
||
$this->initDefaultPlugin();//首次,加载并开启默认插件
|
||
}
|
||
return $this->config['settingSystem']['pluginList'];
|
||
}
|
||
public function saveData(){
|
||
$settingFile = USER_SYSTEM.'system_setting.php';
|
||
FileCache::save($settingFile,$this->config['settingSystem']);
|
||
}
|
||
private function initDefaultPlugin(){
|
||
$this->pluginScan();
|
||
$list = $this->loadData();
|
||
foreach ($list as $app => $val) {
|
||
$this->changeStatus($app,1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 加载所有插件hook;
|
||
*/
|
||
public function init(){
|
||
$pluginList = $this->loadData();
|
||
foreach ($pluginList as $key=>$item) {
|
||
if(!is_array($item) && isset($item['id'])){
|
||
continue;
|
||
}
|
||
$file = PLUGIN_DIR.$item['id'].'/app.php';
|
||
if( !$item['status'] || !is_file($file)) {
|
||
continue;
|
||
}
|
||
if(!$this->checkAuth($item['id'])){
|
||
continue;
|
||
}
|
||
foreach ($item['regiest'] as $tag => $action) {
|
||
Hook::bind($tag,$action);
|
||
}
|
||
}
|
||
//执行全局插件绑定
|
||
Hook::trigger("globalRequest");
|
||
Hook::trigger(ST.'.'.ACT);
|
||
}
|
||
|
||
public function checkAuth($app){
|
||
$pluginList = $this->loadData();
|
||
if( !isset($pluginList[$app]) || !$pluginList[$app]['status']){
|
||
show_tips("Not exist or disabled!");
|
||
}
|
||
$auth = $pluginList[$app]['config']['pluginAuth'];
|
||
if(plugin_check_auth($app,$auth)){
|
||
return true;
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public function add($app){
|
||
if( !file_exists(PLUGIN_DIR.$app.'/package.json') ||
|
||
!file_exists(PLUGIN_DIR.$app.'/app.php')){
|
||
return;
|
||
}
|
||
Hook::apply($app.'Plugin.regiest');
|
||
$this->saveData();
|
||
}
|
||
public function remove($app){
|
||
$pluginList = &$this->config['settingSystem']['pluginList'];
|
||
unset($pluginList[$app]);
|
||
|
||
if( file_exists(PLUGIN_DIR.$app)){
|
||
Hook::apply($app.'Plugin.unInstall');
|
||
}
|
||
$this->saveData();
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 切换插件启用关闭状态
|
||
* @param [type] $app 插件名
|
||
* @param [type] $open 开关状态 0-禁用;1-启用
|
||
* @return
|
||
*/
|
||
public function changeStatus($app,$open){
|
||
$pluginList = &$this->config['settingSystem']['pluginList'];
|
||
if(is_array($pluginList[$app])){
|
||
if($open){
|
||
Hook::apply($app.'Plugin.regiest');
|
||
$config = $this->getConfig($app,true);
|
||
$this->setConfig($app,$config);
|
||
}
|
||
$pluginList[$app]['status'] = $open;
|
||
}
|
||
$this->saveData();
|
||
}
|
||
|
||
|
||
public function getConfigDefault($app){
|
||
$result = array();
|
||
$json = $this->getPackageJson($app);
|
||
if(!$json && is_array($json['configItem'])){
|
||
return $result;
|
||
}
|
||
foreach($json['configItem'] as $key=>$item) {
|
||
if(!isset($item['value']) ||
|
||
isset($result[$key]) ){
|
||
continue;
|
||
}
|
||
$result[$key] = $item['value'];
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
|
||
public function getPackageJson($app){
|
||
return Hook::apply($app.'Plugin.appPackage');
|
||
}
|
||
public function getConfig($app,$force = false){
|
||
$result = array();
|
||
$pluginList = &$this->config['settingSystem']['pluginList'];
|
||
if( isset($pluginList[$app]) &&
|
||
is_array($pluginList[$app]['config']) ){
|
||
$result = $pluginList[$app]['config'];
|
||
}
|
||
if(!$result || $force){
|
||
$result = $this->getConfigDefault($app);
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
public function setConfig($app,$value){
|
||
$pluginList = &$this->config['settingSystem']['pluginList'];
|
||
if(isset($pluginList[$app])){
|
||
foreach ($value as $key => $val) {
|
||
$pluginList[$app]['config'][$key] = $val;
|
||
}
|
||
}
|
||
$this->saveData();
|
||
}
|
||
|
||
/**
|
||
* 遍历查检目录;自动加载插件;
|
||
* @return [type] [description]
|
||
*/
|
||
public function pluginScan(){
|
||
$pluginList = &$this->config['settingSystem']['pluginList'];
|
||
recursion_dir(PLUGIN_DIR,$dirs,$files,0);
|
||
foreach ($dirs as $path) {
|
||
$app = get_path_this($path);
|
||
if(isset($pluginList[$app])){
|
||
continue;
|
||
}
|
||
if( !file_exists($path.'/package.json') ||
|
||
!file_exists($path.'/app.php')){
|
||
continue;
|
||
}
|
||
Hook::apply($app.'Plugin.regiest');
|
||
}
|
||
$this->saveData();
|
||
}
|
||
public function viewList(){
|
||
$this->pluginScan();
|
||
$list = $this->loadData();
|
||
$result = array();
|
||
foreach ($list as $key => $item) {
|
||
unset($item['regiest']);
|
||
$package = Hook::apply($item['id'].'Plugin.appPackage');
|
||
if(is_array($package)){
|
||
$result[$key] = array_merge($item,$package);
|
||
}
|
||
}
|
||
return $result;
|
||
}
|
||
}
|