AddonModel.class.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. namespace Admin\Model;
  3. use Common\Model\ModelModel;
  4. /**
  5. * 插件模型
  6. * 该类参考了OneThink的部分实现
  7. *
  8. */
  9. class AddonModel extends ModelModel
  10. {
  11. /**
  12. * 数据库表名
  13. *
  14. */
  15. protected $tableName = 'admin_addon';
  16. /**
  17. * 自动验证规则
  18. *
  19. */
  20. protected $_validate = array(
  21. array('name', 'require', '插件名称不能为空', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
  22. array('name', '1,32', '插件名称长度为1-32个字符', self::EXISTS_VALIDATE, 'length', self::MODEL_BOTH),
  23. array('name', '', '插件名称已经存在', self::VALUE_VALIDATE, 'unique', self::MODEL_BOTH),
  24. array('description', 'require', '钩子描述必须!', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
  25. );
  26. /**
  27. * 自动完成规则
  28. *
  29. */
  30. protected $_auto = array(
  31. array('create_time', 'time', self::MODEL_INSERT, 'function'),
  32. array('update_time', 'time', self::MODEL_BOTH, 'function'),
  33. array('sort', '0', self::MODEL_INSERT),
  34. array('status', '1', self::MODEL_INSERT),
  35. );
  36. /**
  37. * 插件类型
  38. *
  39. */
  40. public function addon_type($id)
  41. {
  42. $list[0] = '系统插件';
  43. return $id ? $list[$id] : $list;
  44. }
  45. /**
  46. * 获取插件列表
  47. * @param string $addon_dir
  48. *
  49. */
  50. public function getAllAddon()
  51. {
  52. $addon_dir = C('ADDON_PATH');
  53. $dirs = array_map('basename', glob($addon_dir . '*', GLOB_ONLYDIR));
  54. if ($dirs == false || !file_exists($addon_dir)) {
  55. $this->error = '插件目录不可读或者不存在';
  56. return false;
  57. }
  58. $addons = array();
  59. $map['name'] = array('in', $dirs);
  60. $list = $this->where($map)
  61. ->field(true)
  62. ->order('sort asc,id desc')
  63. ->select();
  64. foreach ($list as $addon) {
  65. $addons[$addon['name']] = $addon;
  66. }
  67. foreach ($dirs as $value) {
  68. if (!isset($addons[$value])) {
  69. $class = get_addon_class($value);
  70. if (!class_exists($class)) { // 实例化插件失败忽略执行
  71. \Think\Log::record('插件' . $value . '的入口文件不存在!');
  72. continue;
  73. }
  74. $obj = new $class;
  75. $addons[$value] = $obj->info;
  76. if ($addons[$value]) {
  77. $addons[$value]['status'] = -1; // 未安装
  78. }
  79. }
  80. }
  81. foreach ($addons as &$val) {
  82. switch ($val['status']) {
  83. case '-1': // 未安装
  84. $val['status'] = '<i class="fa fa-trash" style="color:red"></i>';
  85. $val['right_button']['install']['title'] = '安装';
  86. $val['right_button']['install']['attribute'] = 'class="label label-success ajax-get" href="' . U('install', array('addon_name' => $val['name'])) . '"';
  87. break;
  88. case '0': // 禁用
  89. $val['status'] = '<i class="fa fa-ban" style="color:red"></i>';
  90. $val['right_button']['config']['title'] = '设置';
  91. $val['right_button']['config']['attribute'] = 'class="label label-info" href="' . U('config', array('id' => $val['id'])) . '"';
  92. $val['right_button']['forbid']['title'] = '启用';
  93. $val['right_button']['forbid']['attribute'] = 'class="label label-success ajax-get" href="' . U('setStatus', array('status' => 'resume', 'ids' => $val['id'])) . '"';
  94. $val['right_button']['uninstall']['title'] = '卸载';
  95. $val['right_button']['uninstall']['attribute'] = 'class="label label-danger ajax-get" href="' . U('uninstall', array('id' => $val['id'])) . '"';
  96. if ($val['adminlist']) {
  97. $val['right_button']['adminlist']['title'] = '数据管理';
  98. $val['right_button']['adminlist']['attribute'] = 'class="label label-success" href="' . U('adminlist', array('name' => $val['name'])) . '"';
  99. }
  100. break;
  101. case '1': // 正常
  102. $val['status'] = '<i class="fa fa-check" style="color:green"></i>';
  103. $val['right_button']['config']['title'] = '设置';
  104. $val['right_button']['config']['attribute'] = 'class="label label-info" href="' . U('config', array('id' => $val['id'])) . '"';
  105. $val['right_button']['forbid']['title'] = '禁用';
  106. $val['right_button']['forbid']['attribute'] = 'class="label label-warning ajax-get" href="' . U('setStatus', array('status' => 'forbid', 'ids' => $val['id'])) . '"';
  107. $val['right_button']['uninstall']['title'] = '卸载';
  108. $val['right_button']['uninstall']['attribute'] = 'class="label label-danger ajax-get" href="' . U('uninstall', array('id' => $val['id'])) . '"';
  109. if ($val['adminlist']) {
  110. $val['right_button']['adminlist']['title'] = '数据管理';
  111. $val['right_button']['adminlist']['attribute'] = 'class="label label-success" href="' . U('adminlist', array('name' => $val['name'])) . '"';
  112. }
  113. break;
  114. }
  115. }
  116. return $addons;
  117. }
  118. /**
  119. * 插件显示内容里生成访问插件的url
  120. * @param string $url url
  121. * @param array $param 参数
  122. *
  123. */
  124. public function getAddonUrl($url, $param = array())
  125. {
  126. $url = parse_url($url);
  127. $case = C('URL_CASE_INSENSITIVE');
  128. $addons = $case ? parse_name($url['scheme']) : $url['scheme'];
  129. $controller = $case ? parse_name($url['host']) : $url['host'];
  130. $action = trim($case ? strtolower($url['path']) : $url['path'], '/');
  131. // 解析URL带的参数
  132. if (isset($url['query'])) {
  133. parse_str($url['query'], $query);
  134. $param = array_merge($query, $param);
  135. }
  136. // 基础参数
  137. $params = array(
  138. '_addons' => $addons,
  139. '_controller' => $controller,
  140. '_action' => $action,
  141. );
  142. $params = array_merge($params, $param); //添加额外参数
  143. return U(MODULE_MARK . '/Addon/execute', $params, true, true);
  144. }
  145. }