土鳖小屋游戏源码社区

 找回密码
 欢迎注册

QQ登录

只需一步,快速开始

cn域名首年29元
com域名首年49元net域名首年75年
广告位
联盟招募 收益最高
免费建网站 服务器特价
网维体微信营销平台
【多线高防】无视一切攻击!织梦模板
站长平台 精确提升SEO
21广告位高权重链接招租
微信抢红包源码云主机
国内/香港主机/试用免费
微信小程序香港免费VPS每月10台
小程序
源码商城棋牌源码
查看: 112|回复: 0

[学习教程] 微擎模块机制分析

[复制链接]
弗罗多 发表于 2018-12-16 09:25 | 显示全部楼层 |阅读模式
一、安装

安装界面,主要是module_get_all_unistalled获取未安装模块

  1. if ($do == 'not_installed') {
  2.         if (empty($_W['isfounder'])) {
  3.                 itoast('非法访问!', referer(), 'info');
  4.         }
  5.         $_W['page']['title'] = '安装模块 - 模块 - 扩展';

  6.         $status = $_GPC['status'] == 'recycle'? 'recycle' : 'uninstalled';
  7.         $letters = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  8.         $title = $_GPC['title'];
  9.         $letter = $_GPC['letter'];
  10.         $pageindex = max($_GPC['page'], 1);
  11.         $pagesize = 20;

  12.         $uninstallModules = module_get_all_unistalled($status, false);
  13.         $total_uninstalled = $uninstallModules['module_count'];
  14.         $uninstallModules = (array)$uninstallModules['modules'];
  15.         if (!empty($uninstallModules)) {
  16.                 foreach($uninstallModules as $name => &$module) {
  17.                         if (!empty($letter) && strlen($letter) == 1) {
  18.                                 $first_char = get_first_pinyin($module['title']);
  19.                                 if ($letter != $first_char) {
  20.                                         unset($uninstallModules[$name]);
  21.                                         continue;
  22.                                 }
  23.                         }
  24.                         if (!empty($title)) {
  25.                                 if (!strexists($module['title'], $title)) {
  26.                                         unset($uninstallModules[$name]);
  27.                                         continue;
  28.                                 }
  29.                         }

  30.                         if (file_exists(IA_ROOT.'/addons/'.$module['name'].'/icon-custom.jpg')) {
  31.                                 $module['logo'] = tomedia(IA_ROOT.'/addons/'.$module['name'].'/icon-custom.jpg');
  32.                         } elseif (file_exists(IA_ROOT.'/addons/'.$module['name'].'/icon.jpg')) {
  33.                                 $module['logo'] = tomedia(IA_ROOT.'/addons/'.$module['name'].'/icon.jpg');
  34.                         } else {
  35.                                 $module['logo'] = tomedia($module['thumb']);
  36.                         }
  37.                         if (!empty($module['main_module'])) {
  38.                                 $main_module_installed = module_fetch($module['main_module']);
  39.                                 if ($main_module_installed) {
  40.                                         $module['main_module_logo'] = $main_module_installed['logo'];
  41.                                 } else {
  42.                                         if ($module['from'] == 'cloud') {
  43.                                                 $module['main_module_logo'] = tomedia($uninstallModules[$module['main_module']]['thumb']);
  44.                                         } else {
  45.                                                 if (file_exists(IA_ROOT.'/addons/'.$module['main_module'].'/icon-custom.jpg')) {
  46.                                                         $module['main_module_logo'] = tomedia(IA_ROOT.'/addons/'.$module['main_module'].'/icon-custom.jpg');
  47.                                                 } elseif (file_exists(IA_ROOT.'/addons/'.$module['main_module'].'/icon.jpg')) {
  48.                                                         $module['main_module_logo'] = tomedia(IA_ROOT.'/addons/'.$module['main_module'].'/icon.jpg');
  49.                                                 }
  50.                                         }
  51.                                 }
  52.                         }
  53.                 }
  54.         }
  55.         $total = count($uninstallModules);
  56.         $uninstallModules = array_slice($uninstallModules, ($pageindex - 1)*$pagesize, $pagesize);
  57.         $pager = pagination($total, $pageindex, $pagesize);
  58. }
复制代码

module_get_all_unistalled 函数源码,可以看到先判断是否有缓存(微擎的缓存实现机制还是很清晰易懂的,数据库、文件、memcache、Redis),没有再取,关键是cache_build_uninstalled_module;可以看到有云模块的请求,当然这部分你可以干掉,我还是坚持用正版哈
  1. function module_get_all_unistalled($status, $cache = true)  {
  2.         global $_GPC;
  3.         load()->func('communication');
  4.         load()->model('cloud');
  5.         load()->classs('cloudapi');
  6.         $status = $status == 'recycle' ? 'recycle' : 'uninstalled';
  7.    

  8.    
  9.         $uninstallModules =  cache_load(cache_system_key('module:all_uninstall'));
  10.   
  11.         if (!$cache && $status == 'uninstalled') {
  12.                 $cloud_api = new CloudApi();
  13.                 $get_cloud_m_count = $cloud_api->get('site', 'stat', array('module_quantity' => 1), 'json');
  14.                 $cloud_m_count = $get_cloud_m_count['module_quantity'];
  15.         } else {
  16.            
  17.                 if(is_array($uninstallModules)){
  18.                         $cloud_m_count = $uninstallModules['cloud_m_count'];
  19.                 }
  20.         }
  21.         if (empty($uninstallModules['modules']) || intval($uninstallModules['cloud_m_count']) !== intval($cloud_m_count) || is_error($get_cloud_m_count)) {

  22.         $uninstallModules = cache_build_uninstalled_module();
  23.         }
  24.         if (ACCOUNT_TYPE == ACCOUNT_TYPE_APP_NORMAL) {
  25.                 $uninstallModules['modules'] = (array)$uninstallModules['modules'][$status]['wxapp'];
  26.                 $uninstallModules['module_count'] = $uninstallModules['wxapp_count'];
  27.                 return $uninstallModules;
  28.         } elseif (ACCOUNT_TYPE == ACCOUNT_TYPE_OFFCIAL_NORMAL) {
  29.                 $uninstallModules['modules'] = (array)$uninstallModules['modules'][$status]['app'];
  30.                 $uninstallModules['module_count'] = $uninstallModules['app_count'];
  31.                 return $uninstallModules;
  32.         } else {
  33.                 return $uninstallModules;
  34.         }
  35. }
复制代码

cache_build_uninstalled_module源码,现在知道为什么模块要放在addons下了,最后还把模块信息写入缓存,以便下次直接使用
  1. function cache_build_uninstalled_module() {
  2.         load()->model('cloud');
  3.         load()->classs('cloudapi');
  4.         load()->model('extension');
  5.         load()->func('file');
  6.         $cloud_api = new CloudApi();
  7.    
  8.         $cloud_m_count = $cloud_api->get('site', 'stat', array('module_quantity' => 1), 'json');
  9.    
  10.    
  11.    
  12.         $installed_module = pdo_getall('modules', array(), array(), 'name');

  13.         $uninstallModules = array('recycle' => array(), 'uninstalled' => array());
  14.         $recycle_modules = pdo_getall('modules_recycle', array(), array(), 'modulename');
  15.         $recycle_modules = array_keys($recycle_modules);
  16.         $cloud_module = cloud_m_query();

  17.         if (!empty($cloud_module) && !is_error($cloud_module)) {
  18.                 foreach ($cloud_module as $module) {
  19.                         $upgrade_support_module = false;
  20.                         $wxapp_support = !empty($module['site_branch']['wxapp_support']) && is_array($module['site_branch']['bought']) && in_array('wxapp', $module['site_branch']['bought']) ? $module['site_branch']['wxapp_support'] : 1;
  21.                         $app_support = !empty($module['site_branch']['app_support']) && is_array($module['site_branch']['bought']) && in_array('app', $module['site_branch']['bought']) ? $module['site_branch']['app_support'] : 1;
  22.                         if ($wxapp_support ==  1 && $app_support == 1) {
  23.                                 $app_support = 2;
  24.                         }
  25.                         if (!empty($installed_module[$module['name']]) && ($installed_module[$module['name']]['app_support'] != $app_support || $installed_module[$module['name']]['wxapp_support'] != $wxapp_support)) {
  26.                                 $upgrade_support_module = true;
  27.                         }
  28.                         if (!in_array($module['name'], array_keys($installed_module)) || $upgrade_support_module) {
  29.                                 $status = in_array($module['name'], $recycle_modules) ? 'recycle' : 'uninstalled';
  30.                                 if (!empty($module['id'])) {
  31.                                         $cloud_module_info = array (
  32.                                                 'from' => 'cloud',
  33.                                                 'name' => $module['name'],
  34.                                                 'version' => $module['version'],
  35.                                                 'title' => $module['title'],
  36.                                                 'thumb' => $module['thumb'],
  37.                                                 'wxapp_support' => $wxapp_support,
  38.                                                 'app_support' => $app_support,
  39.                                                 'main_module' => empty($module['main_module']) ? '' : $module['main_module'],
  40.                                                 'upgrade_support' => $upgrade_support_module
  41.                                         );
  42.                                         if ($upgrade_support_module) {
  43.                                                 if ($wxapp_support == 2 && $installed_module[$module['name']]['wxapp_support'] != 2) {
  44.                                                         $uninstallModules[$status]['wxapp'][$module['name']] = $cloud_module_info;
  45.                                                 }
  46.                                                 if ($app_support == 2 && $installed_module[$module['name']]['app_support'] != 2) {
  47.                                                         $uninstallModules[$status]['app'][$module['name']] = $cloud_module_info;
  48.                                                 }
  49.                                         } else {
  50.                                                 if ($wxapp_support == 2) {
  51.                                                         $uninstallModules[$status]['wxapp'][$module['name']] = $cloud_module_info;
  52.                                                 }
  53.                                                 if ($app_support == 2) {
  54.                                                         $uninstallModules[$status]['app'][$module['name']] = $cloud_module_info;
  55.                                                 }
  56.                                         }
  57.                                 }
  58.                         }
  59.                 }
  60.         }
  61.         $path = IA_ROOT . '/addons/';
  62.         mkdirs($path);

  63.         $module_file = glob($path . '*');
  64.         if (is_array($module_file) && !empty($module_file)) {
  65.                 foreach ($module_file as $modulepath) {
  66.                         $upgrade_support_module = false;
  67.                         $modulepath = str_replace($path, '', $modulepath);
  68.                         $manifest = ext_module_manifest($modulepath);
  69.                         if (!is_array($manifest) || empty($manifest) || empty($manifest['application']['identifie'])) {
  70.                                 continue;
  71.                         }
  72.                         $main_module = empty($manifest['platform']['main_module']) ? '' : $manifest['platform']['main_module'];
  73.                         $manifest = ext_module_convert($manifest);
  74.          
  75.                         if (!empty($installed_module[$modulepath]) && ($manifest['app_support'] != $installed_module[$modulepath]['app_support'] || $manifest['wxapp_support'] != $installed_module[$modulepath]['wxapp_support'])) {
  76.                                 $upgrade_support_module = true;
  77.                         }
  78.                         if (!in_array($manifest['name'], array_keys($installed_module)) || $upgrade_support_module) {
  79.                                 $module[$manifest['name']] = $manifest;
  80.                                 $module_info = array(
  81.                                         'from' => 'local',
  82.                                         'name' => $manifest['name'],
  83.                                         'version' => $manifest['version'],
  84.                                         'title' => $manifest['title'],
  85.                                         'app_support' => $manifest['app_support'],
  86.                                         'wxapp_support' => $manifest['wxapp_support'],
  87.                                         'main_module' => $main_module,
  88.                                         'upgrade_support' => $upgrade_support_module
  89.                                 );
  90.                                 $module_type = in_array($manifest['name'], $recycle_modules) ? 'recycle' : 'uninstalled';
  91.                                 if ($upgrade_support_module) {
  92.                                         if ($module_info['app_support'] == 2 && $installed_module[$module_info['name']]['app_support'] != 2) {
  93.                                                 $uninstallModules['uninstalled']['app'][$manifest['name']] = $module_info;
  94.                                         }
  95.                                         if ($module_info['wxapp_support'] == 2 && $installed_module[$module_info['name']]['wxapp_support'] != 2) {
  96.                                                 $uninstallModules['uninstalled']['wxapp'][$manifest['name']] = $module_info;
  97.                                         }
  98.                                 } else {
  99.                                         if ($module_info['app_support'] == 2) {
  100.                                                 $uninstallModules[$module_type]['app'][$manifest['name']] = $module_info;
  101.                                         }
  102.                                         if ($module_info['wxapp_support'] == 2) {
  103.                                                 $uninstallModules[$module_type]['wxapp'][$manifest['name']] = $module_info;
  104.                                         }
  105.                                 }
  106.                         }
  107.                 }
  108.         }
  109.         $cache = array(
  110.                 'cloud_m_count' => $cloud_m_count['module_quantity'],
  111.                 'modules' => $uninstallModules,
  112.                 'app_count' => count($uninstallModules['uninstalled']['app']),
  113.                 'wxapp_count' => count($uninstallModules['uninstalled']['wxapp'])
  114.         );
  115.    
  116.    
  117.         cache_write('we7:module:all_uninstall', $cache, CACHE_EXPIRE_LONG);
  118.         return $cache;
  119. }
复制代码

还有个地方值得学习,模块的信息定义在manifest.xml中,有点java的感觉,具体信息读取都在extension.mod.php中,代码如下
  1. function ext_module_manifest_parse($xml) {
  2.         if (!strexists($xml, '<manifest')) {
  3.                 $xml = base64_decode($xml);
  4.         }
  5.         if (empty($xml)) {
  6.                 return array();
  7.         }
  8.         $dom = new DOMDocument();
  9.         $dom->loadXML($xml);
  10.                 $root = $dom->getElementsByTagName('manifest')->item(0);
  11.         if (empty($root)) {
  12.                 return array();
  13.         }
  14.         $vcode = explode(',', $root->getAttribute('versionCode'));
  15.         $manifest['versions'] = array();
  16.         if (is_array($vcode)) {
  17.                 foreach ($vcode as $v) {
  18.                         $v = trim($v);
  19.                         if (!empty($v)) {
  20.                                 $manifest['versions'][] = $v;
  21.                         }
  22.                 }
  23.                 $manifest['versions'][] = '0.52';
  24.                 $manifest['versions'][] = '0.6';
  25.                 $manifest['versions'] = array_unique($manifest['versions']);
  26.         }
  27.         $manifest['install'] = $root->getElementsByTagName('install')->item(0)->textContent;
  28.         $manifest['uninstall'] = $root->getElementsByTagName('uninstall')->item(0)->textContent;
  29.         $manifest['upgrade'] = $root->getElementsByTagName('upgrade')->item(0)->textContent;
  30.         $application = $root->getElementsByTagName('application')->item(0);
  31.         if (empty($application)) {
  32.                 return array();
  33.         }
  34.         $manifest['application'] = array(
  35.                 'name' => trim($application->getElementsByTagName('name')->item(0)->textContent),
  36.                 'identifie' => trim($application->getElementsByTagName('identifie')->item(0)->textContent),
  37.                 'version' => trim($application->getElementsByTagName('version')->item(0)->textContent),
  38.                 'type' => trim($application->getElementsByTagName('type')->item(0)->textContent),
  39.                 'ability' => trim($application->getElementsByTagName('ability')->item(0)->textContent),
  40.                 'description' => trim($application->getElementsByTagName('description')->item(0)->textContent),
  41.                 'author' => trim($application->getElementsByTagName('author')->item(0)->textContent),
  42.                 'url' => trim($application->getElementsByTagName('url')->item(0)->textContent),
  43.                 'setting' => trim($application->getAttribute('setting')) == 'true',
  44.         );
  45.         $platform = $root->getElementsByTagName('platform')->item(0);
  46.         if (!empty($platform)) {
  47.                 $manifest['platform'] = array(
  48.                         'subscribes' => array(),
  49.                         'handles' => array(),
  50.                         'isrulefields' => false,
  51.                         'iscard' => false,
  52.                         'supports' => array(),
  53.                 );
  54.                                 $subscribes = $platform->getElementsByTagName('subscribes')->item(0);
  55.                 if (!empty($subscribes)) {
  56.                         $messages = $subscribes->getElementsByTagName('message');
  57.                         for ($i = 0; $i < $messages->length; $i++) {
  58.                                 $t = $messages->item($i)->getAttribute('type');
  59.                                 if (!empty($t)) {
  60.                                         $manifest['platform']['subscribes'][] = $t;
  61.                                 }
  62.                         }
  63.                 }
  64.                                 $handles = $platform->getElementsByTagName('handles')->item(0);
  65.                 if (!empty($handles)) {
  66.                         $messages = $handles->getElementsByTagName('message');
  67.                         for ($i = 0; $i < $messages->length; $i++) {
  68.                                 $t = $messages->item($i)->getAttribute('type');
  69.                                 if (!empty($t)) {
  70.                                         $manifest['platform']['handles'][] = $t;
  71.                                 }
  72.                         }
  73.                 }
  74.                                 $rule = $platform->getElementsByTagName('rule')->item(0);
  75.                 if (!empty($rule) && $rule->getAttribute('embed') == 'true') {
  76.                         $manifest['platform']['isrulefields'] = true;
  77.                 }
  78.                                 $card = $platform->getElementsByTagName('card')->item(0);
  79.                 if (!empty($card) && $card->getAttribute('embed') == 'true') {
  80.                         $manifest['platform']['iscard'] = true;
  81.                 }
  82.                 $supports = $platform->getElementsByTagName('supports')->item(0);
  83.                 if (!empty($supports)) {
  84.                         $support_type = $supports->getElementsByTagName('item');
  85.                         for ($i = 0; $i < $support_type->length; $i++) {
  86.                                 $t = $support_type->item($i)->getAttribute('type');
  87.                                 if (!empty($t)) {
  88.                                         $manifest['platform']['supports'][] = $t;
  89.                                 }
  90.                         }
  91.                 }
  92.                                 $plugins = $platform->getElementsByTagName('plugins')->item(0);
  93.                 if (!empty($plugins)) {
  94.                         $plugin_list = $plugins->getElementsByTagName('item');
  95.                         for ($i = 0; $i < $plugin_list->length; $i++) {
  96.                                 $plugin = $plugin_list->item($i)->getAttribute('name');
  97.                                 if (!empty($plugin)) {
  98.                                         $manifest['platform']['plugin_list'][] = $plugin;
  99.                                 }
  100.                         }
  101.                 }
  102.                 $plugin_main = $platform->getElementsByTagName('plugin-main')->item(0);
  103.                 if (!empty($plugin_main)) {
  104.                         $plugin_main = $plugin_main->getAttribute('name');
  105.                         if (!empty($plugin_main)) {
  106.                                 $manifest['platform']['main_module'] = $plugin_main;
  107.                         }
  108.                 }
  109.         }
  110.                 $bindings = $root->getElementsByTagName('bindings')->item(0);
  111.         if (!empty($bindings)) {
  112.                 global $points;
  113.                 if (!empty($points)) {
  114.                         $ps = array_keys($points);
  115.                         $manifest['bindings'] = array();
  116.                         foreach ($ps as $p) {
  117.                                 $define = $bindings->getElementsByTagName($p)->item(0);
  118.                                 $manifest['bindings'][$p] = _ext_module_manifest_entries($define);
  119.                         }
  120.                 }
  121.         }
  122.                 $permissions = $root->getElementsByTagName('permissions')->item(0);
  123.         if (!empty($permissions)) {
  124.                 $manifest['permissions'] = array();
  125.                 $items = $permissions->getElementsByTagName('entry');
  126.                 for ($i = 0; $i < $items->length; $i++) {
  127.                         $item = $items->item($i);
  128.                         $row = array(
  129.                                 'title' => $item->getAttribute('title'),
  130.                                 'permission' => $item->getAttribute('do'),
  131.                         );
  132.                         if (!empty($row['title']) && !empty($row['permission'])) {
  133.                                 $manifest['permissions'][] = $row;
  134.                         }
  135.                 }
  136.         }
  137.         return $manifest;
  138. }


  139. function ext_module_manifest($modulename) {
  140.         $filename = IA_ROOT . '/addons/' . $modulename . '/manifest.xml';
  141.         if (!file_exists($filename)) {
  142.                 return array();
  143.         }
  144.         $xml = file_get_contents($filename);
  145.         return ext_module_manifest_parse($xml);
  146. }
复制代码

好了,现在该分析安装了,先把安装代码贴上;这部分主要做业务判断,模块信息插入数据库,主要表modules_bindings ,modules,要修改模块的信息、或者增加显示功能列表修改表就行了
  1. if ($do =='install') {
  2.         $points = ext_module_bindings();
  3.         $module_name = trim($_GPC['module_name']);
  4.         $is_recycle_module = pdo_get('modules_recycle', array('modulename' => $module_name));
  5.         if (empty($_W['isfounder'])) {
  6.                 itoast('您没有安装模块的权限', '', 'error');
  7.         }
  8.         $module_info = module_fetch($module_name);
  9.         if (!empty($module_info)) {
  10.                 itoast('模块已经安装或是唯一标识已存在!', '', 'error');
  11.         }
  12.         $manifest = ext_module_manifest($module_name);
  13.         if (!empty($manifest)) {
  14.                 $result = cloud_m_prepare($module_name);
  15.                 if (is_error($result)) {
  16.                         itoast($result['message'], url('module/manage-system/not_installed', array('account_type' => ACCOUNT_TYPE)), 'error');
  17.                 }
  18.         } else {
  19.                 $result = cloud_prepare();
  20.                 if (is_error($result)) {
  21.                         itoast($result['message'], url('cloud/profile'), 'error');
  22.                 }
  23.                 $module_info = cloud_m_info($module_name);
  24.                 if (!is_error($module_info)) {
  25.                         if (empty($_GPC['flag'])) {
  26.                                 header('location: ' . url('cloud/process', array('account_type' => ACCOUNT_TYPE, 'm' => $module_name)));
  27.                                 exit;
  28.                         } else {
  29.                                 define('ONLINE_MODULE', true);
  30.                                 $packet = cloud_m_build($module_name);
  31.                                 $manifest = ext_module_manifest_parse($packet['manifest']);
  32.                         }
  33.                 } else {
  34.                         itoast($module_info['message'], '', 'error');
  35.                 }
  36.         }
  37.         if (empty($manifest)) {
  38.                 itoast('模块安装配置文件不存在或是格式不正确,请刷新重试!', url('module/manage-system/not_installed', array('account_type' => ACCOUNT_TYPE)), 'error');
  39.         }
  40.         if (!empty($manifest['platform']['main_module'])) {
  41.                 $plugin_exist = pdo_get('modules_plugin', array('main_module' => $manifest['platform']['main_module'], 'name' => $manifest['application']['identifie']));
  42.                 if (empty($plugin_exist)) {
  43.                         itoast('请先更新主模块后再安装插件', url('module/manage-system/installed'), 'error');
  44.                 }
  45.         }
  46.         $check_manifest_result = manifest_check($module_name, $manifest);
  47.         if (is_error($check_manifest_result)) {
  48.                 itoast($check_manifest_result['message'], '', 'error');
  49.         }
  50.         $module_path = IA_ROOT . '/addons/' . $module_name . '/';
  51.         if (!file_exists($module_path . 'processor.php') && !file_exists($module_path . 'module.php') && !file_exists($module_path . 'receiver.php') && !file_exists($module_path . 'site.php')) {
  52.                 itoast('模块缺失文件,请检查模块文件中site.php, processor.php, module.php, receiver.php 文件是否存在!', '', 'error');
  53.         }
  54.         $module = ext_module_convert($manifest);
  55.         $module_group = uni_groups();
  56.         if (!$_W['ispost'] || empty($_GPC['flag'])) {
  57.                 template('system/select-module-group');
  58.                 exit;
  59.         }
  60.         if (!empty($manifest['platform']['plugin_list'])) {
  61.                 foreach ($manifest['platform']['plugin_list'] as $plugin) {
  62.                         pdo_insert('modules_plugin', array('main_module' => $manifest['application']['identifie'], 'name' => $plugin));
  63.                 }
  64.         }
  65.         $post_groups = $_GPC['group'];
  66.         ext_module_clean($module_name);
  67.         $bindings = array_elements(array_keys($points), $module, false);
  68.         if (!empty($points)) {
  69.                 foreach ($points as $name => $point) {
  70.                         unset($module[$name]);
  71.                         if (is_array($bindings[$name]) && !empty($bindings[$name])) {
  72.                                 foreach ($bindings[$name] as $entry) {
  73.                                         $entry['module'] = $manifest['application']['identifie'];
  74.                                         $entry['entry'] = $name;
  75.                                         if ($name == 'page' && !empty($wxapp_support)) {
  76.                                                 $entry['url'] = $entry['do'];
  77.                                                 $entry['do'] = '';
  78.                                         }
  79.                                         pdo_insert('modules_bindings', $entry);
  80.                                 }
  81.                         }
  82.                 }
  83.         }
  84.         $module['permissions'] = iserializer($module['permissions']);
  85.         $module_subscribe_success = true;
  86.         if (!empty($module['subscribes'])) {
  87.                 $subscribes = iunserializer($module['subscribes']);
  88.                 if (!empty($subscribes)) {
  89.                         $module_subscribe_success = ext_check_module_subscribe($module['name']);
  90.                 }
  91.         }
  92.         if (!empty($module_info['version']['cloud_setting'])) {
  93.                 $module['settings'] = 2;
  94.         }
  95.         $module['title_initial'] = get_first_pinyin($module['title']);
  96.         if (strexists($manifest['install'], '.php')) {
  97.                 if (file_exists($module_path . $manifest['install'])) {
  98.                         include_once $module_path . $manifest['install'];
  99.                         if (ONLINE_MODULE) {
  100.                                 unlink ($module_path . $manifest['install']);
  101.                         }
  102.                 }
  103.         } else {
  104.                 pdo_run($manifest['install']);
  105.         }
  106.         if (pdo_insert('modules', $module)) {
  107.                 if (ONLINE_MODULE) {
  108.                         if (strexists($manifest['upgrade'], '.php') && file_exists($module_path . $manifest['upgrade'])) {
  109.                                 unlink($module_path . $manifest['upgrade']);
  110.                         }
  111.                         if (strexists($manifest['uninstall'], '.php') && file_exists($module_path . $manifest['uninstall'])) {
  112.                                 unlink($module_path . $manifest['uninstall']);
  113.                         }
  114.                 }

  115.                                 if (defined('ONLINE_MODULE')) {
  116.                         ext_module_script_clean($module['name'], $manifest);
  117.                 }
  118.                 if ($_GPC['flag'] && !empty($post_groups) && $module['name']) {
  119.                         foreach ($post_groups as $groupid) {
  120.                                 $group_info = pdo_get('uni_group', array('id' => intval($groupid)), array('id', 'name', 'modules'));
  121.                                 if (empty($group_info)) {
  122.                                         continue;
  123.                                 }
  124.                                 $group_info['modules'] = iunserializer($group_info['modules']);
  125.                                 if (in_array($module['name'], $group_info['modules'])) {
  126.                                         continue;
  127.                                 }
  128.                                 $group_info['modules'][] = $module['name'];
  129.                                 $group_info['modules'] = iserializer($group_info['modules']);
  130.                                 pdo_update('uni_group', $group_info, array('id' => $groupid));
  131.                         }
  132.                 }

  133.                 if (!empty($is_recycle_module)) {
  134.                         pdo_delete('modules_recycle', array('modulename' => $module_name));
  135.                 }
  136.                 cache_build_module_subscribe_type();
  137.                 cache_build_account_modules();
  138.                 cache_build_uninstalled_module();
  139.                 cache_build_module_info($module_name);

  140.                 if (empty($module_subscribe_success)) {
  141.                         itoast('模块安装成功!模块订阅消息有错误,系统已禁用该模块的订阅消息,详细信息请查看', url('module/manage-system/module_detail', array('name' => $module['name'])), 'tips');
  142.                 } else {
  143.                         itoast('模块安装成功!', url('module/manage-system', array('account_type' => ACCOUNT_TYPE)), 'success');
  144.                 }
  145.         } else {
  146.                 itoast('模块安装失败, 请联系模块开发者!');
  147.         }
  148. }
复制代码

安装完成后,模块就可以开始使用了,模块的使用稍后分析


先说卸载,卸载只是将之前的入库的数据删了,本质上没有删文件
  1. if ($do == 'uninstall') {
  2.         $name = trim($_GPC['name']);
  3.         $message = '';
  4.         $module = module_fetch($name);
  5.         if (!empty($module['plugin'])) {
  6.                 $plugin_list = module_get_plugin_list($module['name']);
  7.                 if (!empty($plugin_list) && is_array($plugin_list)) {
  8.                         $message .= '删除' . $module['title'] . '并删除' . $module['title'] .  '包含插件<ul>';
  9.                         foreach ($plugin_list as $plugin) {
  10.                                 $message .= "<li>{$plugin['title']}</li>";
  11.                         }
  12.                         unset($plugin);
  13.                         $message .= '</ul>';
  14.                 }
  15.         }
  16.         if (!isset($_GPC['confirm'])) {
  17.                 if ($module['isrulefields']) {
  18.                         $message .= '是否删除相关规则和统计分析数据<div><a class="btn btn-primary" style="width:80px;" href="' . url('module/manage-system/uninstall', array('name' => $name, 'confirm' => 1)) . '">是</a> &#160;&#160;<a class="btn btn-default" style="width:80px;" href="' . url('module/manage-system/uninstall', array('account_type' => ACCOUNT_TYPE, 'name' => $name, 'confirm' => 0)) . '">否</a></div>';
  19.                 } elseif (!empty($plugin_list)) {
  20.                         $message .= "<a href=" . url('module/manage-system/uninstall', array('name' => $name,'confirm' => 0)) . " class='btn btn-info'>继续删除</a>";
  21.                 }
  22.                 if (!empty($message)) {
  23.                         itoast($message, '', 'tips');
  24.                 }
  25.         }
  26.         if (!empty($plugin_list) && is_array($plugin_list)) {
  27.                 foreach ($plugin_list as $plugin) {
  28.                         module_uninstall($plugin['name']);
  29.                 }
  30.         }
  31.         $uninstall_result = module_uninstall($module['name'], $_GPC['confirm'] == 1);
  32.         if (is_error($uninstall_result)) {
  33.                 itoast($uninstall_result['message'], url('module/manage-system'), 'error');
  34.         }
  35.         itoast('模块已放入回收站!', url('module/manage-system', array('account_type' => ACCOUNT_TYPE)), 'success');
  36. }
复制代码
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

QQ|小黑屋|手机版|土鳖小屋游戏源码社区 ( 豫ICP备14000521号-2 )

GMT+8, 2019-6-25 07:29

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

豫公网安备 41088202000172号

快速回复 返回顶部 返回列表