• 微擎模块机制分析2


     

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq43599939/article/details/78275713

    利用微擎开发些微信公众号还是非常方便的;模块机制分析主要从其安装、卸载、使用角度,

    一、安装

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

    1.  
      if ($do == 'not_installed') {
    2.  
      if (empty($_W['isfounder'])) {
    3.  
      itoast('非法访问!', referer(), 'info');
    4.  
      }
    5.  
      $_W['page']['title'] = '安装模块 - 模块 - 扩展';
    6.  
       
    7.  
      $status = $_GPC['status'] == 'recycle'? 'recycle' : 'uninstalled';
    8.  
      $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');
    9.  
      $title = $_GPC['title'];
    10.  
      $letter = $_GPC['letter'];
    11.  
      $pageindex = max($_GPC['page'], 1);
    12.  
      $pagesize = 20;
    13.  
       
    14.  
      $uninstallModules = module_get_all_unistalled($status, false);
    15.  
      $total_uninstalled = $uninstallModules['module_count'];
    16.  
      $uninstallModules = (array)$uninstallModules['modules'];
    17.  
      if (!empty($uninstallModules)) {
    18.  
      foreach($uninstallModules as $name => &$module) {
    19.  
      if (!empty($letter) && strlen($letter) == 1) {
    20.  
      $first_char = get_first_pinyin($module['title']);
    21.  
      if ($letter != $first_char) {
    22.  
      unset($uninstallModules[$name]);
    23.  
      continue;
    24.  
      }
    25.  
      }
    26.  
      if (!empty($title)) {
    27.  
      if (!strexists($module['title'], $title)) {
    28.  
      unset($uninstallModules[$name]);
    29.  
      continue;
    30.  
      }
    31.  
      }
    32.  
       
    33.  
      if (file_exists(IA_ROOT.'/addons/'.$module['name'].'/icon-custom.jpg')) {
    34.  
      $module['logo'] = tomedia(IA_ROOT.'/addons/'.$module['name'].'/icon-custom.jpg');
    35.  
      } elseif (file_exists(IA_ROOT.'/addons/'.$module['name'].'/icon.jpg')) {
    36.  
      $module['logo'] = tomedia(IA_ROOT.'/addons/'.$module['name'].'/icon.jpg');
    37.  
      } else {
    38.  
      $module['logo'] = tomedia($module['thumb']);
    39.  
      }
    40.  
      if (!empty($module['main_module'])) {
    41.  
      $main_module_installed = module_fetch($module['main_module']);
    42.  
      if ($main_module_installed) {
    43.  
      $module['main_module_logo'] = $main_module_installed['logo'];
    44.  
      } else {
    45.  
      if ($module['from'] == 'cloud') {
    46.  
      $module['main_module_logo'] = tomedia($uninstallModules[$module['main_module']]['thumb']);
    47.  
      } else {
    48.  
      if (file_exists(IA_ROOT.'/addons/'.$module['main_module'].'/icon-custom.jpg')) {
    49.  
      $module['main_module_logo'] = tomedia(IA_ROOT.'/addons/'.$module['main_module'].'/icon-custom.jpg');
    50.  
      } elseif (file_exists(IA_ROOT.'/addons/'.$module['main_module'].'/icon.jpg')) {
    51.  
      $module['main_module_logo'] = tomedia(IA_ROOT.'/addons/'.$module['main_module'].'/icon.jpg');
    52.  
      }
    53.  
      }
    54.  
      }
    55.  
      }
    56.  
      }
    57.  
      }
    58.  
      $total = count($uninstallModules);
    59.  
      $uninstallModules = array_slice($uninstallModules, ($pageindex - 1)*$pagesize, $pagesize);
    60.  
      $pager = pagination($total, $pageindex, $pagesize);
    61.  
      }

    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.  
       
    10.  
      $uninstallModules = cache_load(cache_system_key('module:all_uninstall'));
    11.  
       
    12.  
      if (!$cache && $status == 'uninstalled') {
    13.  
      $cloud_api = new CloudApi();
    14.  
      $get_cloud_m_count = $cloud_api->get('site', 'stat', array('module_quantity' => 1), 'json');
    15.  
      $cloud_m_count = $get_cloud_m_count['module_quantity'];
    16.  
      } else {
    17.  
       
    18.  
      if(is_array($uninstallModules)){
    19.  
      $cloud_m_count = $uninstallModules['cloud_m_count'];
    20.  
      }
    21.  
      }
    22.  
      if (empty($uninstallModules['modules']) || intval($uninstallModules['cloud_m_count']) !== intval($cloud_m_count) || is_error($get_cloud_m_count)) {
    23.  
       
    24.  
      $uninstallModules = cache_build_uninstalled_module();
    25.  
      }
    26.  
      if (ACCOUNT_TYPE == ACCOUNT_TYPE_APP_NORMAL) {
    27.  
      $uninstallModules['modules'] = (array)$uninstallModules['modules'][$status]['wxapp'];
    28.  
      $uninstallModules['module_count'] = $uninstallModules['wxapp_count'];
    29.  
      return $uninstallModules;
    30.  
      } elseif (ACCOUNT_TYPE == ACCOUNT_TYPE_OFFCIAL_NORMAL) {
    31.  
      $uninstallModules['modules'] = (array)$uninstallModules['modules'][$status]['app'];
    32.  
      $uninstallModules['module_count'] = $uninstallModules['app_count'];
    33.  
      return $uninstallModules;
    34.  
      } else {
    35.  
      return $uninstallModules;
    36.  
      }
    37.  
      }

    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.  
       
    14.  
      $uninstallModules = array('recycle' => array(), 'uninstalled' => array());
    15.  
      $recycle_modules = pdo_getall('modules_recycle', array(), array(), 'modulename');
    16.  
      $recycle_modules = array_keys($recycle_modules);
    17.  
      $cloud_module = cloud_m_query();
    18.  
       
    19.  
      if (!empty($cloud_module) && !is_error($cloud_module)) {
    20.  
      foreach ($cloud_module as $module) {
    21.  
      $upgrade_support_module = false;
    22.  
      $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;
    23.  
      $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;
    24.  
      if ($wxapp_support == 1 && $app_support == 1) {
    25.  
      $app_support = 2;
    26.  
      }
    27.  
      if (!empty($installed_module[$module['name']]) && ($installed_module[$module['name']]['app_support'] != $app_support || $installed_module[$module['name']]['wxapp_support'] != $wxapp_support)) {
    28.  
      $upgrade_support_module = true;
    29.  
      }
    30.  
      if (!in_array($module['name'], array_keys($installed_module)) || $upgrade_support_module) {
    31.  
      $status = in_array($module['name'], $recycle_modules) ? 'recycle' : 'uninstalled';
    32.  
      if (!empty($module['id'])) {
    33.  
      $cloud_module_info = array (
    34.  
      'from' => 'cloud',
    35.  
      'name' => $module['name'],
    36.  
      'version' => $module['version'],
    37.  
      'title' => $module['title'],
    38.  
      'thumb' => $module['thumb'],
    39.  
      'wxapp_support' => $wxapp_support,
    40.  
      'app_support' => $app_support,
    41.  
      'main_module' => empty($module['main_module']) ? '' : $module['main_module'],
    42.  
      'upgrade_support' => $upgrade_support_module
    43.  
      );
    44.  
      if ($upgrade_support_module) {
    45.  
      if ($wxapp_support == 2 && $installed_module[$module['name']]['wxapp_support'] != 2) {
    46.  
      $uninstallModules[$status]['wxapp'][$module['name']] = $cloud_module_info;
    47.  
      }
    48.  
      if ($app_support == 2 && $installed_module[$module['name']]['app_support'] != 2) {
    49.  
      $uninstallModules[$status]['app'][$module['name']] = $cloud_module_info;
    50.  
      }
    51.  
      } else {
    52.  
      if ($wxapp_support == 2) {
    53.  
      $uninstallModules[$status]['wxapp'][$module['name']] = $cloud_module_info;
    54.  
      }
    55.  
      if ($app_support == 2) {
    56.  
      $uninstallModules[$status]['app'][$module['name']] = $cloud_module_info;
    57.  
      }
    58.  
      }
    59.  
      }
    60.  
      }
    61.  
      }
    62.  
      }
    63.  
      $path = IA_ROOT . '/addons/';
    64.  
      mkdirs($path);
    65.  
       
    66.  
      $module_file = glob($path . '*');
    67.  
      if (is_array($module_file) && !empty($module_file)) {
    68.  
      foreach ($module_file as $modulepath) {
    69.  
      $upgrade_support_module = false;
    70.  
      $modulepath = str_replace($path, '', $modulepath);
    71.  
      $manifest = ext_module_manifest($modulepath);
    72.  
      if (!is_array($manifest) || empty($manifest) || empty($manifest['application']['identifie'])) {
    73.  
      continue;
    74.  
      }
    75.  
      $main_module = empty($manifest['platform']['main_module']) ? '' : $manifest['platform']['main_module'];
    76.  
      $manifest = ext_module_convert($manifest);
    77.  
       
    78.  
      if (!empty($installed_module[$modulepath]) && ($manifest['app_support'] != $installed_module[$modulepath]['app_support'] || $manifest['wxapp_support'] != $installed_module[$modulepath]['wxapp_support'])) {
    79.  
      $upgrade_support_module = true;
    80.  
      }
    81.  
      if (!in_array($manifest['name'], array_keys($installed_module)) || $upgrade_support_module) {
    82.  
      $module[$manifest['name']] = $manifest;
    83.  
      $module_info = array(
    84.  
      'from' => 'local',
    85.  
      'name' => $manifest['name'],
    86.  
      'version' => $manifest['version'],
    87.  
      'title' => $manifest['title'],
    88.  
      'app_support' => $manifest['app_support'],
    89.  
      'wxapp_support' => $manifest['wxapp_support'],
    90.  
      'main_module' => $main_module,
    91.  
      'upgrade_support' => $upgrade_support_module
    92.  
      );
    93.  
      $module_type = in_array($manifest['name'], $recycle_modules) ? 'recycle' : 'uninstalled';
    94.  
      if ($upgrade_support_module) {
    95.  
      if ($module_info['app_support'] == 2 && $installed_module[$module_info['name']]['app_support'] != 2) {
    96.  
      $uninstallModules['uninstalled']['app'][$manifest['name']] = $module_info;
    97.  
      }
    98.  
      if ($module_info['wxapp_support'] == 2 && $installed_module[$module_info['name']]['wxapp_support'] != 2) {
    99.  
      $uninstallModules['uninstalled']['wxapp'][$manifest['name']] = $module_info;
    100.  
      }
    101.  
      } else {
    102.  
      if ($module_info['app_support'] == 2) {
    103.  
      $uninstallModules[$module_type]['app'][$manifest['name']] = $module_info;
    104.  
      }
    105.  
      if ($module_info['wxapp_support'] == 2) {
    106.  
      $uninstallModules[$module_type]['wxapp'][$manifest['name']] = $module_info;
    107.  
      }
    108.  
      }
    109.  
      }
    110.  
      }
    111.  
      }
    112.  
      $cache = array(
    113.  
      'cloud_m_count' => $cloud_m_count['module_quantity'],
    114.  
      'modules' => $uninstallModules,
    115.  
      'app_count' => count($uninstallModules['uninstalled']['app']),
    116.  
      'wxapp_count' => count($uninstallModules['uninstalled']['wxapp'])
    117.  
      );
    118.  
       
    119.  
       
    120.  
      cache_write('we7:module:all_uninstall', $cache, CACHE_EXPIRE_LONG);
    121.  
      return $cache;
    122.  
      }

    还有个地方值得学习,模块的信息定义在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.  
       
    140.  
       
    141.  
      function ext_module_manifest($modulename) {
    142.  
      $filename = IA_ROOT . '/addons/' . $modulename . '/manifest.xml';
    143.  
      if (!file_exists($filename)) {
    144.  
      return array();
    145.  
      }
    146.  
      $xml = file_get_contents($filename);
    147.  
      return ext_module_manifest_parse($xml);
    148.  
      }

    好了,现在该分析安装了,先把安装代码贴上;这部分主要做业务判断,模块信息插入数据库,主要表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.  
       
    116.  
      if (defined('ONLINE_MODULE')) {
    117.  
      ext_module_script_clean($module['name'], $manifest);
    118.  
      }
    119.  
      if ($_GPC['flag'] && !empty($post_groups) && $module['name']) {
    120.  
      foreach ($post_groups as $groupid) {
    121.  
      $group_info = pdo_get('uni_group', array('id' => intval($groupid)), array('id', 'name', 'modules'));
    122.  
      if (empty($group_info)) {
    123.  
      continue;
    124.  
      }
    125.  
      $group_info['modules'] = iunserializer($group_info['modules']);
    126.  
      if (in_array($module['name'], $group_info['modules'])) {
    127.  
      continue;
    128.  
      }
    129.  
      $group_info['modules'][] = $module['name'];
    130.  
      $group_info['modules'] = iserializer($group_info['modules']);
    131.  
      pdo_update('uni_group', $group_info, array('id' => $groupid));
    132.  
      }
    133.  
      }
    134.  
       
    135.  
      if (!empty($is_recycle_module)) {
    136.  
      pdo_delete('modules_recycle', array('modulename' => $module_name));
    137.  
      }
    138.  
      cache_build_module_subscribe_type();
    139.  
      cache_build_account_modules();
    140.  
      cache_build_uninstalled_module();
    141.  
      cache_build_module_info($module_name);
    142.  
       
    143.  
      if (empty($module_subscribe_success)) {
    144.  
      itoast('模块安装成功!模块订阅消息有错误,系统已禁用该模块的订阅消息,详细信息请查看', url('module/manage-system/module_detail', array('name' => $module['name'])), 'tips');
    145.  
      } else {
    146.  
      itoast('模块安装成功!', url('module/manage-system', array('account_type' => ACCOUNT_TYPE)), 'success');
    147.  
      }
    148.  
      } else {
    149.  
      itoast('模块安装失败, 请联系模块开发者!');
    150.  
      }
    151.  
      }

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

    先说卸载,卸载只是将之前的入库的数据删了,本质上没有删文件

    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="80px;" href="' . url('module/manage-system/uninstall', array('name' => $name, 'confirm' => 1)) . '">是</a>   <a class="btn btn-default" style="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.  
      }
  • 相关阅读:
    C# 压缩组件介绍与入门
    《Effective C#》快速笔记(六)-
    原生JS实现简单富文本编辑器
    oracle 给表字段把VARCHAR2 换成 CLOB
    java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
    Idea中Module is not specified解决办法
    JS用正则替换特殊字符
    对List<Map>里的map的某个属性重复的值进行处理的方法
    ……
    使用原生js 实现点击消失效果
  • 原文地址:https://www.cnblogs.com/guiyishanren/p/9960104.html
Copyright © 2020-2023  润新知