PluginModel.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2013-present http://www.thinkcmf.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 老猫 <thinkcmf@126.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\admin\model;
  12. use think\Model;
  13. class PluginModel extends Model
  14. {
  15. /**
  16. * 模型名称
  17. * @var string
  18. */
  19. protected $name = 'plugin';
  20. /**
  21. * 获取插件列表
  22. */
  23. public function getList()
  24. {
  25. $dirs = array_map('basename', glob(WEB_ROOT . 'plugins/*', GLOB_ONLYDIR));
  26. if ($dirs === false) {
  27. $this->error = '插件目录不可读';
  28. return false;
  29. }
  30. $plugins = [];
  31. if (empty($dirs)) return $plugins;
  32. $list = $this->select();
  33. foreach ($list as $plugin) {
  34. $plugins[$plugin['name']] = $plugin;
  35. }
  36. foreach ($dirs as $pluginDir) {
  37. $pluginDir = cmf_parse_name($pluginDir, 1);
  38. if (!isset($plugins[$pluginDir])) {
  39. $class = cmf_get_plugin_class($pluginDir);
  40. if (!class_exists($class)) { // 实例化插件失败忽略
  41. //TODO 加入到日志中
  42. continue;
  43. }
  44. $obj = new $class;
  45. $plugins[$pluginDir] = $obj->info;
  46. if (!isset($obj->info['type']) || $obj->info['type'] == 1) {//只获取普通插件
  47. if ($plugins[$pluginDir]) {
  48. $plugins[$pluginDir]['status'] = 3;//未安装
  49. }
  50. } else {
  51. unset($plugins[$pluginDir]);
  52. }
  53. }
  54. }
  55. return $plugins;
  56. }
  57. /**
  58. * @TODO
  59. * 获取所有钩子,包括系统,应用,模板
  60. * @param bool $refresh 是否刷新缓存
  61. * @return array
  62. */
  63. public function getHooks($refresh = false)
  64. {
  65. if (!$refresh) {
  66. // TODO 加入缓存
  67. }
  68. $returnHooks = [];
  69. $systemHooks = [
  70. //系统钩子
  71. "app_init", "app_begin", "module_init", "action_begin", "view_filter",
  72. "app_end", "log_write", "log_write_done", "response_end",
  73. "admin_init",
  74. "home_init",
  75. "send_mobile_verification_code",
  76. //系统钩子结束
  77. //前台登录钩子
  78. "user_login_start",
  79. //模板钩子
  80. "body_start", "before_head_end", "before_footer", "footer_start", "before_footer_end", "before_body_end",
  81. "left_sidebar_start",
  82. "before_left_sidebar_end",
  83. "right_sidebar_start",
  84. "before_right_sidebar_end",
  85. "comment",
  86. "guestbook",
  87. ];
  88. $dbHooks = HookModel::column('hook');
  89. $returnHooks = array_unique(array_merge($systemHooks, $dbHooks));
  90. return $returnHooks;
  91. }
  92. public function uninstall($id)
  93. {
  94. $findPlugin = $this->find($id);
  95. if (empty($findPlugin)) {
  96. return -1; //插件不存在;
  97. }
  98. $class = cmf_get_plugin_class($findPlugin['name']);
  99. HookPluginModel::startTrans();
  100. try {
  101. $this->where('name', $findPlugin['name'])->delete();
  102. HookPluginModel::where('plugin', $findPlugin['name'])->delete();
  103. if (class_exists($class)) {
  104. $plugin = new $class;
  105. $uninstallSuccess = $plugin->uninstall();
  106. if (!$uninstallSuccess) {
  107. HookPluginModel::rollback();
  108. return -2;
  109. }
  110. }
  111. // 删除后台菜单
  112. AdminMenuModel::where([
  113. 'app' => "plugin/{$findPlugin['name']}",
  114. ])->delete();
  115. // 删除权限规则
  116. AuthRuleModel::where('app', "plugin/{$findPlugin['name']}")->delete();
  117. HookPluginModel::commit();
  118. } catch (\Exception $e) {
  119. HookPluginModel::rollback();
  120. return false;
  121. }
  122. return true;
  123. }
  124. }