远程获取织梦系统所有模块的基本信息函数GetModuleUrlList()

admin2023-01-18951

函数名:($moduletype='',$url='')

函数功能:从远程获取织梦系统所有模块的基本信息,无论安装与滞都将获得。

函数对数:$moduletype   模块类型;模块所在文件路径

返回值:返回值为一个数组

所在位置:/include/dedemodule.class.php

这个函数与函数GetModuleList()相比,不仅返回的是已经安装的模块,没有安装的模块也会获取。也就是我们登录后台后看到的,如下图所示的所有的模块。

这个函数与GetModuleList()函数相比除了上面的差别外,还有代码也有很大的差别,按理来说,如果二个相类似的函数,特别是只是数量上的差别,这样的二个函数一般几乎是一样的,但是,这二个函数确相差很大,这是因为,它们获取的模块信息来源完全不一样的结果。

GetModuleList()函数完全是对一个目录里面的文件进行筛选,然后,直接写对模块缓存文件里面,但是,这个函数则完全不一样,它是从文件/data/module/目录里面的moduleurllist.txt这个文件里面,调用模块资料的,而这个文件里面全是json格式的字符串,所以,这就决定了我们在后台安装时的代码跟GetModuleList()函数几乎完全不一样的结果。

但是,这二个函数有共同点,毕竟都是为获取模块信息,它们的共同点是:当我们安装一个插后,都要对缓存文件modulescache.php重新覆盖式写入操作。

函数代码:

   function GetModuleUrlList($moduletype='',$url='')
    {
        $dh = dir($this->modulesPath) or die("没找到模块目录:({$this->modulesPath})!");
        $fp = @fopen($this->modulesPath.'/modulescache.php','w') or die('读取文件权限出错,目录文件'.$this->modulesPath.'/modulescache.php不可写!');
        $cachefile = DEDEDATA.'/module/moduleurllist.txt';
        $remotelist = '';
        if(file_exists($cachefile) && (filemtime($cachefile) + 60 * 30) > time())
        {
            // 30分钟本地缓存一次
            $remotelist = file_get_contents($cachefile);
        } else {
            $del = new DedeHttpDown();
            $del->OpenUrl($url);
            $remotelist = $del->GetHtml();
            PutFile($cachefile, $remotelist);
        }
        if(empty($remotelist)) return false;
        
        $modules = unserialize($remotelist);
        if(empty($moduletype)){
            return $modules;
        }
        $return = array();
        foreach($modules as $arrow=>$data) {
            if($data['moduletype']==$moduletype)
                $return[] =  $data;
        }
        return $return;
    }

这个函数前面的代码就是打开文件modulescache.php,然后,定义文件$remotelist。因为,我的服务器是在本地电脑上面,所以,从远程获取实际是从我的电脑上获取的,这跟我们到空间商买的空间是一个道理。

接着代码,判断一下$cachefile文件是否存在,若存在且这个文件建立的时间比此时早,那么就把$cachefile文件内容,直接copay到$remotelist里面。

若这二个条件中任何一个不成立,则,执行下面的代码。

实例化织梦HTTP下载类:

$del = new DedeHttpDown();

然后,打开文件:

$del->OpenUrl($url);

注意这里的$url是远程的,例如从织梦官方服务器上面打开的模块内容url。

获取远程html内容:

$remotelist = $del->GetHtml();

然后,把$remotlist内容写到本地文件$cachefile里面。

PutFile($cachefile, $remotelist);

此时,已经从织梦官方获取了模块数据,放到文件/data/module/modulelist.txt文件里面,并把,相应的模块信息放到了变量$remotelist里面,这个跟函数GetModuleList()就有点类似了,函数GetModuleList()是当安装时,把安装信息重新放到缓存文件modulecache.php里面,但是,只是从本地同一个文件夹里面,写到了缓存文件里面,而本教程里面的函数则是从远程织梦服务器上面,下载下来模块信息安装我们网站,例如www.dedebase.com所在的服务器里面的文件/data/module/modulelist.txt里面,形式上有点类似。

因为这个文件modulelist.txt里面是json格式的数据,也就是串行化后的,所以,这里我们要反串行化(序列化),返串行化的代码为:unserialize($remotelist),反串行化后,就得到了一个二维数组,这个二维数组键是hash,值是每个hash对应的.xml文件里面的基本信息。

按理说这时,应当就已经完事了,但是,这样还不行,我们还要判断一下,调用这个函数时,给的类型是不是与模块的类型相同,如果要调用的模块类型与从文里获取的类型不一样,那么,这样就会出错。

所以,我们必须再遍历一次这个二维数组,然后,看看类型是不是相符,若相符合,再重新组装数组。

然后,我们只要把每一个的基本信息都遍历出来,放在在$return数组里面,这样就得到了一个符合指定类型的模块列表二维数组。


网友评论