www.legu.cc/application/Admin/Controller/PluginController.class.php
2021-09-06 11:50:33 +08:00

205 lines
5.3 KiB
PHP

<?php
namespace Admin\Controller;
use Common\Controller\AdminbaseController;
class PluginController extends AdminbaseController{
protected $plugins_model;
public function _initialize() {
parent::_initialize();
$this->plugins_model = D("Common/Plugins");
}
// 后台插件列表
public function index(){
$plugins=$this->plugins_model->getList();
$this->assign("plugins",$plugins);
$this->display();
}
// 插件启用/禁用
public function toggle(){
if(isset($_GET['id'])){
if($_GET["enable"]){
$id = I('get.id',0,'intval');
if ($this->plugins_model->where(array('id'=>$id))->save(array('status'=>1))!==false) {
S('hooks',null);
$this->success("启用成功!");
} else {
$this->error("启用失败!");
}
}
if($_GET["disable"]){
$id = I('get.id',0,'intval');
if ($this->plugins_model->where(array('id'=>$id))->save(array('status'=>0))!==false) {
S('hooks',null);
$this->success("禁用成功!");
} else {
$this->error("禁用失败!");
}
}
}
}
// 插件设置
public function setting(){
$id = I('get.id',0,'intval');
$plugin = $this->plugins_model->find($id);
if(!$plugin)
$this->error('插件未安装');
$plugin_class = sp_get_plugin_class($plugin['name']);
if(!class_exists($plugin_class)){
trace("插件{$plugin['name']}无法实例化,",'PLUGINS','ERR');
}
$data = new $plugin_class;
$plugin['plugin_path'] = $data->plugin_path;
$plugin['custom_config'] = $data->custom_config;
$db_config = $plugin['config'];
$plugin['config'] = include $data->config_file;
if($db_config){
$db_config = json_decode($db_config, true);
foreach ($plugin['config'] as $key => $value) {
if($value['type'] != 'group'){
$plugin['config'][$key]['value'] = $db_config[$key];
}else{
foreach ($value['options'] as $gourp => $options) {
foreach ($options['options'] as $gkey => $value) {
$plugin['config'][$key]['options'][$gourp]['options'][$gkey]['value'] = $db_config[$gkey];
}
}
}
}
}
$this->assign('data',$plugin);
if($plugin['custom_config']){
$this->assign('custom_config', $this->fetch($plugin['plugin_path'].$plugin['custom_config']));
}
$this->display();
}
// 插件设置提交
public function setting_post(){
if(IS_POST){
$id = I('post.id',0,'intval');
$config = I('post.config/a');
$result = $this->plugins_model->where(array('id'=>$id))->setField('config',json_encode($config));
if($result !== false){
$this->success('保存成功');
}else{
$this->error('保存失败');
}
}
}
// 插件安装
public function install(){
$plugin_name = trim(I('name'));
$class = sp_get_plugin_class($plugin_name);
if(!class_exists($class))
$this->error('插件不存在!');
$plugin = new $class;
$info = $plugin->info;
if(!$info || !$plugin->checkInfo())//检测信息的正确性
$this->error('插件信息缺失!');
$install_success = $plugin->install();
if(!$install_success){
$this->error('插件预安装失败!');
}
$methods=get_class_methods($plugin);
$system_hooks=sp_get_hooks(true);
$plugin_hooks=array_intersect($system_hooks, $methods);
$info['hooks']=implode(",", $plugin_hooks);
if(!empty($plugin->has_admin)){
$info['has_admin'] = 1;
}else{
$info['has_admin'] = 0;
}
$info['config']=json_encode($plugin->getConfig());
$data = $this->plugins_model->create($info);
if(!$data){
$this->error($this->plugins_model->getError());
}
if($this->plugins_model->add($data)){
S('hooks', null);
$this->success('安装成功!');
}else{
$this->error('写入插件数据失败!');
}
}
// 插件更新
public function update(){
$plugin_name = trim(I('name'));
$class = sp_get_plugin_class($plugin_name);
if(!class_exists($class))
$this->error('插件不存在!');
$plugin = new $class;
$info = $plugin->info;
if(!$info || !$plugin->checkInfo())//检测信息的正确性
$this->error('插件信息缺失!');
$methods=get_class_methods($plugin);
$system_hooks=sp_get_hooks(true);
$plugin_hooks=array_intersect($system_hooks, $methods);
$info['hooks']=implode(",", $plugin_hooks);
if(!empty($plugin->has_admin)){
$info['has_admin'] = 1;
}else{
$info['has_admin'] = 0;
}
$config=$plugin->getConfig();
$info['config']=$config?json_encode($config):"";
$data = $this->plugins_model->create($info);
if(!$data){
$this->error($this->plugins_model->getError());
}
if($this->plugins_model->where(array("name"=>$plugin_name))->save($data)!==false){
$this->success('更新成功!');
}else{
$this->error('写入插件数据失败!');
}
}
// 卸载插件
public function uninstall(){
$id = I('get.id',0,'intval');
$find_plugin = $this->plugins_model->find($id);
$class = sp_get_plugin_class($find_plugin['name']);
$plugins = new $class;
$uninstall_success = $plugins->uninstall();
if(!$uninstall_success)
$this->error('插件预卸载失败');
S('hooks', null);
$delete = $this->plugins_model->where(array("name"=>$find_plugin['name']))->delete();
if($delete === false){
$this->error('卸载失败');
}else{
$this->success('卸载成功');
}
}
}