// +---------------------------------------------------------------------- namespace app\common\model; use think\Model; /** * 插件模型 */ class Addon extends Model { protected $autoWriteTimestamp = true; public function setConfigAttr($value) { return $value?json_encode($value):''; } public function setAdminActionsAttr($value) { return $value?json_encode($value):''; } /** * 获取所有插件信息 * @return array|bool */ public function getAll() { $result = cache('addon_all'); if (!$result) { // 获取插件目录下的所有插件目录 $dirs = array_map('basename', glob(ADDON_PATH.'*', GLOB_ONLYDIR)); if ($dirs === false || !file_exists(ADDON_PATH)) { $this->error = '插件目录不可读或者不存在'; return false; } $dirs=array_map('ucfirst',$dirs); // 读取数据库插件表 $addons = self::order('sort asc,id desc')->column('*', 'name'); // 读取未安装的插件 foreach ($dirs as $addon) { if (!isset($addons[$addon])) { $addons[$addon]['name'] = $addon; // 获取插件类名 $class = get_addon_class($addon); // 插件类不存在则跳过实例化 if (!class_exists($class)) { $addons[$addon]['status'] = '-2'; continue; } // 实例化插件 $obj = new $class; // 插件插件信息缺失 if (!isset($obj->info) || empty($obj->info) || !$this->checkInfo($obj->info)) { // 插件信息缺失! $addons[$addon]['status'] = '-2'; continue; } // 插件未安装 $addons[$addon] = $obj->info; $addons[$addon]['status'] = '-1'; } } // 处理插件按钮 foreach ($addons as &$addon) { switch ($addon['status']) { case '-2': $addon['actions'] = ''; break; case '-1': // 未安装 $addon['actions'] = '安装'; break; case '0': // 禁用 $addon['admin_actions']=json_decode($addon['admin_actions'],true); $addon['actions'] = '启用 '; $addon['actions'] .= '卸载 '; if (isset($addon['config']) && $addon['config'] != '' && $addon['admin_actions']['config']) { if(count($addon['admin_actions']['config'])==2){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['config'][0],$addon['name'].'://'.$addon['admin_actions']['config'][1]); }elseif(count($addon['admin_actions']['config'])==1){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['config'][0]); }else{ $url=''; } if($url){ $addon['actions'] .= '设置 '; } } if ($addon['admin'] != '0' && $addon['admin_actions']['index']) { if(count($addon['admin_actions']['index'])==2){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['index'][0],$addon['name'].'://'.$addon['admin_actions']['index'][1]); }elseif(count($addon['admin_actions']['index'])==1){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['index'][0]); }else{ $url=''; } $addon['actions'] .= '管理 '; } break; case '1': // 启用 $addon['admin_actions']=json_decode($addon['admin_actions'],true); $addon['actions'] = '禁用 '; $addon['actions'] .= '卸载 '; if (isset($addon['config']) && $addon['config'] != '' && $addon['admin_actions']['config']) { if(count($addon['admin_actions']['config'])==2){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['config'][0],$addon['name'].'://'.$addon['admin_actions']['config'][1]); }elseif(count($addon['admin_actions']['config'])==1){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['config'][0]); }else{ $url=''; } if($url){ $addon['actions'] .= '设置 '; } } if ($addon['admin'] != '0' && $addon['admin_actions']['index']) { if(count($addon['admin_actions']['index'])==2){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['index'][0],$addon['name'].'://'.$addon['admin_actions']['index'][1]); }elseif(count($addon['admin_actions']['index'])==1){ $url=addon_url($addon['name'].'://'.$addon['admin_actions']['index'][0]); }else{ $url=''; } $addon['actions'] .= '管理 '; } break; default: // 未知 $addon['actions'] = ''; break; } } $result=$addons; cache('addon_all', $result); } return $result; } /** * 检查插件插件信息是否完整 * @param array $info 插件插件信息 * @return bool */ private function checkInfo($info = []) { $default_item = ['name','title','author','version']; foreach ($default_item as $item) { if (!isset($info[$item]) || $info[$item] == '') { return false; } } return true; } /** * 获取插件配置 * @param string $addon_name 插件名称 * @param string $item 指定返回的插件配置项,多个配置项,隔开 * @return array|mixed */ public function getConfig($addon_name = '', $item = '') { $config = cache('addon_config_'.$addon_name); if (!$config) { $config = self::where('name', $addon_name)->value('config'); if (!$config) { return []; } $config = json_decode($config, true); cache('addon_config_'.$addon_name, $config); } if ($item) { $items = explode(',', $item); if (count($items) == 1) { return isset($config[$item]) ? $config[$item] : ''; } $result = []; foreach ($items as $item) { $result[$item] = isset($config[$item]) ? $config[$item] : ''; } return $result; } return $config; } /** * 设置插件配置 * @param string $addon_name 插件名.配置名 * @param string $value 配置值 * @return bool */ public static function setConfig($addon_name = '', $value = '') { $item = ''; if (strpos($addon_name, '.')) { list($addon_name, $item) = explode('.', $addon_name); } $config = cache('addon_config_'.$addon_name); if (!$config) { $config = self::where('name', $addon_name)->value('config'); if (!$config) { return false; } $config = json_decode($config, true); } if ($item === '') { // 批量更新 if (!is_array($value) || empty($value)) { // 值的格式错误,必须为数组 return false; } $config = array_merge($config, $value); } else { // 更新单个值 $config[$item] = $value; } if (false === self::where('name', $addon_name)->setField('config', json_encode($config))) { return false; } //更新缓存 cache('addon_config_'.$addon_name, $config); return true; } }