// +---------------------------------------------------------------------- namespace app\model; /** * 扩展模型 */ class Addons extends \think\Model { protected $auto = ['status', 'isinstall', 'update_time']; protected $insert = ['create_time']; protected $type = [ 'hooks' => 'json' ]; protected function setStatusAttr($value) { return $value ? $value : 0; } protected function setNameAttr($value){ return $value ? strtolower($value) : ''; } protected function setIsinstallAttr($value) { return $value ? $value : 0; } protected function getStatusTextAttr($value, $data) { return $data['status'] ? "启用" : "禁用"; } protected function getUninstallAttr($value, $data) { return 0; } /** * 更新插件列表 * @param string $addon_dir */ public static function refreshAddons($addon_dir = '') { if (!$addon_dir) { $addon_dir = SENT_ADDON_PATH; } $dirs = array_map('basename', glob($addon_dir . '*', GLOB_ONLYDIR)); if ($dirs === FALSE || !file_exists($addon_dir)) { return FALSE; } $where[] = ['name', 'in', $dirs]; $addons = self::where($where)->column('*', 'name'); $save = []; foreach ($dirs as $value) { $value = strtolower($value); $class = "\\addons\\" . $value . "\\Plugin"; if (!class_exists($class)) { continue; } $item = get_addons_info($value); if (isset($addons[$value])) { $item['id'] = $addons[$value]['id']; unset($item['status']); } $save[] = $item; } $class = new self(); return $class->saveAll($save); } /** * 获取插件的后台列表 */ public function getAdminList() { $admin = []; $map[] = ['status', '=', 1]; $map[] = ['has_adminlist', '=', 1]; $db_addons = self::where($map)->field('title,name')->select(); if ($db_addons) { foreach ($db_addons as $value) { $admin[] = array('title' => $value['title'], 'url' => "Addons/adminList?name={$value['name']}"); } } return $admin; } public function install($data) { if ($data) { $info = $this->where('name', $data['name'])->value('id'); if ($info) { $result = $this->save(array('isinstall'=>1, 'status'=>1), array('id'=>$info)); }else{ $result = false; } if (false !== $result) { return model('Hooks')->addHooks($data['name']); }else{ return false; } } else { return false; } } public function uninstall($id) { $info = $this->get($id); if (!$info) { $this->error = "无此插件!"; return false; } $class = get_addon_class($info['name']); if (class_exists($class)) { //插件卸载方法 $addons = new $class; if (!method_exists($addons, 'uninstall')) { $this->error = "插件卸载方法!"; return false; } $result = $addons->uninstall(); if ($result) { //卸载挂载点中的插件 $result = model('Hooks')->removeHooks($info['name']); //删除插件表中数据 $this->where(array('id' => $id))->delete(); return true; } else { $this->error = "无法卸载插件!"; return false; } } } public function build() { } }