获得系统文件的内容函数GetSystemFile()
函数名: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。