if (empty($module)) { message('模块已经被卸载或是不存在!', '', 'error'); } $modulepath = IA_ROOT . '/source/modules/' . $id . '/'; $manifest = ext_module_manifest($module['name']); if (empty($manifest)) { message('模块安装配置文件不存在或是格式不正确!', '', 'error'); } manifest_check($id, $manifest); if (version_compare($module['version'], $manifest['application']['version']) != -1) { message('已安装的模块版本不低于要更新的版本, 操作无效.'); } if (!file_exists($modulepath . 'processor.php') && !file_exists($modulepath . 'module.php') && !file_exists($modulepath . 'receiver.php') && !file_exists($modulepath . 'site.php')) { message('模块缺少处理文件!', '', 'error'); } $module = ext_module_convert($manifest); unset($module['name']); unset($module['id']); $bindings = array_elements(array_keys($points), $module, false); foreach ($points as $p => $row) { unset($module[$p]); if (is_array($bindings[$p]) && !empty($bindings[$p])) { foreach ($bindings[$p] as $entry) { $entry['module'] = $manifest['application']['identifie']; $entry['entry'] = $p; if ($entry['title'] && $entry['do']) { //保存xml里面包含的do和title,最后删除数据库中废弃的do和title $delete_do[] = $entry['do']; $delete_title[] = $entry['title']; $sql = 'SELECT * FROM ' . tablename('modules_bindings') . ' WHERE `module`=:module AND `entry`=:entry AND `title`=:title AND `do`=:do'; $pars = array();
function ext_module_manifest_compat($modulename) { $manifest = array(); $filename = IA_ROOT . '/source/modules/' . $modulename . '/manifest.xml'; if (!file_exists($filename)) { return array(); } $xml = str_replace(array('&'), array('&'), file_get_contents($filename)); $xml = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); if (empty($xml)) { return array(); } $dom = new DOMDocument(); @$dom->load($filename); if (@$dom->schemaValidateSource(ext_module_manifest_validate_050())) { $attributes = $xml->attributes(); $manifest['versions'] = explode(',', strval($attributes['versionCode'])); if (is_array($manifest['versions'])) { foreach ($manifest['versions'] as &$v) { $v = trim($v); if (empty($v)) { unset($v); } } } $manifest['version'] = '0.5'; $manifest['install'] = strval($xml->install); $manifest['uninstall'] = strval($xml->uninstall); $manifest['upgrade'] = strval($xml->upgrade); $attributes = $xml->application->attributes(); $manifest['application'] = array('name' => trim(strval($xml->application->name)), 'identifie' => trim(strval($xml->application->identifie)), 'version' => trim(strval($xml->application->version)), 'ability' => trim(strval($xml->application->ability)), 'description' => trim(strval($xml->application->description)), 'author' => trim(strval($xml->application->author)), 'url' => trim(strval($xml->application->url)), 'setting' => trim(strval($attributes['setting'])) == 'true'); $rAttrs = array(); if ($xml->platform && $xml->platform->rule) { $rAttrs = $xml->platform->rule->attributes(); } $mAttrs = array(); if ($xml->platform && $xml->platform->menus) { $mAttrs = $xml->platform->menus->attributes(); } $manifest['platform'] = array('subscribes' => array(), 'handles' => array(), 'isrulefields' => trim(strval($rAttrs['embed'])) == 'true', 'options' => array(), 'ismenus' => trim(strval($mAttrs['embed'])) == 'true', 'menus' => array()); if ($xml->platform->subscribes->message) { foreach ($xml->platform->subscribes->message as $msg) { $attrs = $msg->attributes(); $manifest['platform']['subscribes'][] = trim(strval($attrs['type'])); } } if ($xml->platform->handles->message) { foreach ($xml->platform->handles->message as $msg) { $attrs = $msg->attributes(); $manifest['platform']['handles'][] = trim(strval($attrs['type'])); } } if ($manifest['platform']['isrulefields'] && $xml->platform->rule->option) { foreach ($xml->platform->rule->option as $msg) { $attrs = $msg->attributes(); $manifest['platform']['options'][] = array('title' => trim(strval($attrs['title'])), 'do' => trim(strval($attrs['do'])), 'state' => trim(strval($attrs['state']))); } } if ($manifest['platform']['ismenus'] && $xml->platform->menus->menu) { foreach ($xml->platform->menus->menu as $msg) { $attrs = $msg->attributes(); $manifest['platform']['menus'][] = array('title' => trim(strval($attrs['title'])), 'do' => trim(strval($attrs['do']))); } } $hAttrs = array(); if ($xml->site && $xml->site->home) { $hAttrs = $xml->site->home->attributes(); } $pAttrs = array(); if ($xml->site && $xml->site->profile) { $pAttrs = $xml->site->profile->attributes(); } $mAttrs = array(); if ($xml->site && $xml->site->menus) { $mAttrs = $xml->site->menus->attributes(); } $manifest['site'] = array('home' => trim(strval($hAttrs['embed'])) == 'true', 'profile' => trim(strval($pAttrs['embed'])) == 'true', 'ismenus' => trim(strval($mAttrs['embed'])) == 'true', 'menus' => array()); if ($manifest['site']['ismenus'] && $xml->site->menus->menu) { foreach ($xml->site->menus->menu as $msg) { $attrs = $msg->attributes(); $manifest['site']['menus'][] = array('title' => trim(strval($attrs['title'])), 'do' => trim(strval($attrs['do']))); } } } else { $attributes = $xml->attributes(); $manifest['version'] = strval($attributes['versionCode']); $manifest['install'] = strval($xml->install); $manifest['uninstall'] = strval($xml->uninstall); $manifest['upgrade'] = strval($xml->upgrade); $attributes = $xml->application->attributes(); $manifest['application'] = array('name' => strval($xml->application->name), 'identifie' => strval($xml->application->identifie), 'version' => strval($xml->application->version), 'ability' => strval($xml->application->ability), 'description' => strval($xml->application->description), 'author' => strval($xml->application->author), 'setting' => strval($attributes['setting']) == 'true'); $hooks = @(array) $xml->hooks->children(); if (!empty($hooks['hook'])) { foreach ((array) $hooks['hook'] as $hook) { $manifest['hooks'][strval($hook['name'])] = strval($hook['name']); } } $menus = @(array) $xml->menus->children(); if (!empty($menus['menu'])) { foreach ((array) $menus['menu'] as $menu) { $manifest['menus'][] = array(strval($menu['name']), strval($menu['value'])); } } } $ret = array(); $ret['meta'] = $manifest; $ret['meta']['compact'] = $manifest['version']; global $points; if ($ret['meta']['compact'] == '0.41' || $ret['meta']['compact'] == '0.4') { //Compact 0.41 $ret['convert'] = ext_module_convert($manifest); $ret['convert']['compact'] = $manifest['version']; $ret['convert']['type'] = 'other'; foreach ($points as $p => $row) { $ret['convert'][$p] = array(); } $handles = iunserializer($ret['convert']['handles']); if ($ret['meta']['hooks'] && $ret['meta']['hooks']['rule']) { $handles[] = 'text'; $ret['convert']['isrulefields'] = true; } $ret['convert']['handles'] = iserializer($handles); if (is_array($ret['meta']['menus'])) { foreach ($ret['meta']['menus'] as $row) { $opt = array(); $opt['title'] = $row[0]; $urls = parse_url($row[1]); parse_str($urls['query'], $vars); $opt['do'] = $vars['do']; $opt['state'] = $vars['state']; if (!empty($opt['title']) && !empty($opt['do'])) { $ret['convert']['rule'][] = $opt; } } } $m = $ret['convert']; $m['install'] = $manifest['install']; $m['uninstall'] = $manifest['uninstall']; $m['upgrade'] = $manifest['upgrade']; $m['handles'] = iunserializer($m['handles']); $versions = IMS_VERSION; $setting = $m['settings'] ? 'true' : 'false'; $handles = ''; foreach ($m['handles'] as $h) { $handles .= "\r\n\t\t\t<message type=\"{$h}\" />"; } $rule = $m['isrulefields'] ? 'true' : 'false'; $bindings = ''; foreach ($points as $p => $row) { if (is_array($m[$p]) && !empty($m[$p])) { $piece = "\r\n\t\t<{$p}{$calls[$p]}>"; foreach ($m[$p] as $entry) { if (!empty($entry['title']) && !empty($entry['do'])) { $direct = $entry['direct'] ? 'true' : 'false'; $piece .= "\r\n\t\t\t<entry title=\"{$entry['title']}\" do=\"{$entry['do']}\" state=\"{$entry['state']}\" direct=\"{$direct}\" />"; } } $piece .= "\r\n\t\t</{$p}>"; $bindings .= $piece; } } $tpl = <<<TPL <?xml version="1.0" encoding="utf-8"?> <manifest xmlns="http://www.we7.cc" versionCode="{$versions}"> \t<application setting="{$setting}"> \t\t<name><![CDATA[{$m['title']}]]></name> \t\t<identifie><![CDATA[{$m['name']}]]></identifie> \t\t<version><![CDATA[{$m['version']}]]></version> \t\t<type><![CDATA[{$manifest['application']['type']}]]></type> \t\t<ability><![CDATA[{$m['ability']}]]></ability> \t\t<description><![CDATA[{$m['description']}]]></description> \t\t<author><![CDATA[{$m['author']}]]></author> \t\t<url><![CDATA[{$m['url']}]]></url> \t</application> \t<platform> \t\t<handles>{$handles} \t\t</handles> \t\t<rule embed="{$rule}" /> \t</platform> \t<bindings>{$bindings} \t</bindings> \t<install><![CDATA[{$m['install']}]]></install> \t<uninstall><![CDATA[{$m['uninstall']}]]></uninstall> \t<upgrade><![CDATA[{$m['upgrade']}]]></upgrade> </manifest> TPL; $ret['manifest'] = ltrim($tpl); return $ret; } if ($ret['meta']['compact'] == '0.5') { // Compact 0.5 $ret['convert'] = ext_module_convert($manifest); $ret['convert']['compact'] = $manifest['version']; $ret['convert']['type'] = 'other'; foreach ($points as $p => $row) { $ret['convert'][$p] = array(); } if (is_array($manifest['platform']['options'])) { foreach ($manifest['platform']['options'] as $opt) { $entry = array(); $entry['title'] = $opt['title']; $entry['do'] = $opt['do']; $entry['state'] = $opt['state']; if (!empty($entry['title']) && !empty($entry['do'])) { $ret['convert']['rule'][] = $entry; } } } if (is_array($manifest['platform']['menus'])) { foreach ($manifest['platform']['menus'] as $opt) { $entry = array(); $entry['title'] = $opt['title']; $entry['do'] = $opt['do']; $entry['state'] = $opt['state']; if (!empty($entry['title']) && !empty($entry['do'])) { $ret['convert']['menu'][] = $entry; } } } if (is_array($manifest['site']['menus'])) { foreach ($manifest['site']['menus'] as $opt) { $entry = array(); $entry['title'] = $opt['title']; $entry['do'] = $opt['do']; $entry['state'] = $opt['state']; if (!empty($entry['title']) && !empty($entry['do'])) { $ret['convert']['menu'][] = $entry; } } } $calls = array(); if (!empty($manifest['site']['home'])) { $calls['home'] = ' call="getHomeTiles"'; $ret['convert']['home'][] = array('call' => 'getHomeTiles'); } if (!empty($manifest['site']['profile'])) { $calls['profile'] = ' call="getProfileTiles"'; $ret['convert']['profile'][] = array('call' => 'getProfileTiles'); } $m = $ret['convert']; $versions = IMS_VERSION; $setting = $m['settings'] ? 'true' : 'false'; $subscribes = ''; foreach ($manifest['platform']['subscribes'] as $s) { $subscribes .= "\r\n\t\t\t<message type=\"{$s}\" />"; } $handles = ''; foreach ($manifest['platform']['handles'] as $h) { $handles .= "\r\n\t\t\t<message type=\"{$h}\" />"; } $rule = $m['isrulefields'] ? 'true' : 'false'; $bindings = ''; foreach ($points as $p => $row) { if (is_array($m[$p]) && !empty($m[$p])) { $piece = "\r\n\t\t<{$p}{$calls[$p]}>"; foreach ($m[$p] as $entry) { if (!empty($entry['title']) && !empty($entry['do'])) { $direct = $entry['direct'] ? 'true' : 'false'; $piece .= "\r\n\t\t\t<entry title=\"{$entry['title']}\" do=\"{$entry['do']}\" state=\"{$entry['state']}\" direct=\"{$direct}\" />"; } } $piece .= "\r\n\t\t</{$p}>"; $bindings .= $piece; } } $tpl = <<<TPL <?xml version="1.0" encoding="utf-8"?> <manifest xmlns="http://www.we7.cc" versionCode="{$versions}"> \t<application setting="{$setting}"> \t\t<name><![CDATA[{$m['title']}]]></name> \t\t<identifie><![CDATA[{$m['name']}]]></identifie> \t\t<version><![CDATA[{$m['version']}]]></version> \t\t<type><![CDATA[{$manifest['application']['type']}]]></type> \t\t<ability><![CDATA[{$m['ability']}]]></ability> \t\t<description><![CDATA[{$m['description']}]]></description> \t\t<author><![CDATA[{$m['author']}]]></author> \t\t<url><![CDATA[{$m['url']}]]></url> \t</application> \t<platform> \t\t<subscribes>{$subscribes} \t\t</subscribes> \t\t<handles>{$handles} \t\t</handles> \t\t<rule embed="{$rule}" /> \t</platform> \t<bindings>{$bindings} \t</bindings> \t<install><![CDATA[{$m['install']}]]></install> \t<uninstall><![CDATA[{$m['uninstall']}]]></uninstall> \t<upgrade><![CDATA[{$m['upgrade']}]]></upgrade> </manifest> TPL; $ret['manifest'] = ltrim($tpl); return $ret; } return array(); }