获得系统文件的内容函数GetSystemFile()

admin2019-12-28839

函数名:GetSystemFile($hashcode, $ntype, $enCode=TRUE)

参数说明:$hashcode为hash码,类似606c658db048ea7328ffe1c7ae2a732f这样一串加密的数据;$ntype  文件类型;$enCode  是否加密

功能:获取系统文件的内容包括:安装、删除、协议文件、后台文件菜单、安装用的文件。

要理解这些东西,我们先把一个.xml为后缀的模块文件的结构弄明白了,就知道这个函数获取的系统文件指的是什么了。

织梦的一个模块文件的结构:

<module>

<baseinfo>
 这里是模块基本信息
</baseinfo>


<systemfile>

<menustring>
这里是后台菜单,一般的没有这个内容
</menustring>

<readme>
这里是模块说明书内容
</readme>

<setupsql40>
这里是模块安装sql语句
</setupsql40>

<delsql>
这里是模块删除(卸载)sql语句
</delsql>

<setup>
安装
</setup>
<uninstall>
卸载
</uninstall>

<oldfilelist>
模块用到的php文件列表
</oldfilelist>

</systemfile>


<modulefiles>
模块具体文件以及该文件加密的内容,类似:
<file type='file' name='www.dedebase.com/include/helpers/changyan.helper.php'>
PD9waHANCi8qKg0KICogvsC07bncwO0NCiAqDQogKiBAdmVyc2lvbiAgICAgICAgJElkOiBlcnJhZGRzYXZlLnBocCAxIDE5OjA5IDIwMTDE6jfUwjEyyNVaIHRpYW55YSAkDQogKiBAcGFja2FnZSAgICAgICAgRGVkZUNNUy5BZG1pbmlzdHJhdG9yDQogKiBAY29weXJpZ2h

0ICAgICAgQ29weXJpZ2h0IC
</file>
....
</modulefiles>

</module>

上面的是xml文件结构,以<module></module>作为一个整体在最外层,里面又分为三大块:

模块基本信息:<baseinfo></baseinfo>

模块系统文件:<systemfile></systemfile>

模块具体文件:<modulefiles></modulefiles>

每块下面又分为多个小块,我们把上面的模块xml文件结构与后台对应模块结构(这里以畅言为例子)的内容一一对比如下。

基本信息<baseinfo></baseinfo>

后台菜单<menustring></menustring>

使用说明文件<readme></readme>

模块安装的sql内容<setupsql40></setupsql40>

sql删除模块<delsql></delsql>

模块文件列表<oldfilelist></oldfilelist>

知道了模块的文件的基本结构,现在我们对函数分析一下。

函数代码:

function GetSystemFile($hashcode, $ntype, $enCode=TRUE)
    {
        $this->GetModuleInfo($hashcode,$ntype);
        $start = FALSE;
        $filename = $this->modulesPath.'/'.$this->GetHashFile($hashcode);
        $fp = fopen($filename,'r') or die("文件 {$filename} 不存在或不可读!");
        $okdata = '';
        while(!feof($fp))
        {
            $line = fgets($fp,1024);
            if(!$start)
            {
                //  2011-6-7 修复模块打包程序中上传安装程序生成为空白文件(by:华强)
                if(preg_match("#<{$ntype}>#i", $line)) $start = TRUE;
            }
            else
            {
                if(preg_match("#<\/{$ntype}#i", $line)) break;
                $okdata .= $line;
                unset($line);
            }
        }
        fclose($fp);
        $okdata = trim($okdata);
        if(!empty($okdata) && $enCode) $okdata = base64_decode($okdata);
        $okdata = $this->AppCode($okdata);
        return $okdata;
    }

第一行代码是获得模块基本信息函数,关于函数GetModuleInfo()的具体教程这里我们就不用多解释了,我们在另一个文件里面已经详细分析了,请看相关的教程。

定义一个$start=FALSE,这是一个小小的技巧,经常使用到。

获得.xml模块文件:$filename,我们要获得模块系统文件,首先得有这个模块文件,如果没有这个系统文件,就没法获取了。

打开这个文件,只有打开了,才能从这个文件里获取系统文件内容。

接下来的代码是while(!feof($fp))遍历这个文件,我们遍历一个文件一般通过函数feof()来作判断,这个函数的功能是判断是不是文件指针已经指向了最后,也就是文件结束了,经常用到的文件判断指针函数。

代码$line = fgets($fp,1024),获取文件里面的一行数据函数,每行获取1023个字节的内容,并把字符串存放到变量$line里面。

若if(!$start)成立,也就是$start=flase,则说明这是第一次遍历,若找到类型文件,例如,找到<menustring>这个标签,则把$start设置为1,注意这里的$start的使用,这样,当第二次遍历的时候,就不会再进入if(!$start)里面了,直接进入到else里面,也就是说因为<menustring>开始标签在文件.xml里面只有一个,而且,只有一个开始,所以,这个条件只会做一次判断。

若程序找到</menustring>这个说明已经结束,退出这个while()遍历,否则,把从文件.xml取出的一行作对接到$okdata这个变量里面,这时$okdata存在的就是<menustring></menustring>之间的内容,如下所示:

<m:top name='畅言评论' display='block'>
<m:item name='畅言模块' link='changyan_main.php' rank='sys_Feedback' target='main'/>
<m:item name='评论管理' link='changyan_main.php?dopost=manage' rank='sys_Feedback' target='main'/>
<m:item name='数据统计' link='changyan_main.php?dopost=stat' rank='sys_Feedback' target='main'/>
<m:item name='导入导出' link='changyan_main.php?dopost=import' rank='sys_Feedback' target='main'/>
<m:item name='畅言设置' link='changyan_main.php?dopost=setting' rank='sys_Feedback' target='main'/>
</m:top>

此时,程序接着向下执行代码,若在调用这个函数时,有第三个参数,则通过函数 base64_decode($okdata)进行加密。

通过$this->AppCode($okdata)进行编码转换。

返回这个字符串$okdata。


网友评论