コード例 #1
0
 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();
コード例 #2
0
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();
}