织梦列出风格目录函数ListSkin()
有时候有些功能比较小,如果通过系统的核心功能来实现的话,那么,浪费资源可能还会比较复杂,但是我们可以通过一个函数来实现就非常简单了,特别是织梦系统非常灵活,织梦系统有很多这样的例子,其中一个就是空格模板的更换,按按照会员的需要自己选择自己喜欢的模板功能,这一功能就是通过一个函数listskin()来实现的,织梦会员空间模板如下图所示。
本教程就是对这个功能进行分析讲解。
函数所在文件:/member/spaceskin.php
在分析代码前,我们先大体上了解一下这些模板是如何加载显示在会员中心的,把这个弄明白了,那么,下面我们分析代码就简单了。
我们打开织梦空间模板目录/member/space/如下图所示。
这个就是会员空间模板存放目录,以后,我们如果制作空间模板的话,也要放在这里面。这里面有文件夹文件和一个skinlist.inc文件。
织梦会员空间模板是通过skinlist.inc文件把空间模板演示放在“风格选择”这个选项卡里面显示出来的。如果我们打开这个文件看看,如下所示:
//文件夹排序(如果本文件没配置,系统以文件目录排序 [linux是乱排的]) //个人模板 person lxvista lxblog lxbrown pwlake pwblue pwglight pwpink flower coffee gray //企业模板 company
这个文件列举出来的全正好是文件夹的名字,也就是每套模板的名字。程序通过这个就把每个模板显示出来,当然,每个模板的演示图片,还是要到对应的文件夹里面去搜索,提取出来显示在会员中心“风格选择”里面。
这是一种方法,如果我把这个文件skinlist.inc去掉的话,那么,一点也不影响,这就说明,织梦程序也就是这个函数还通过另一种方式就是遍历space这个文件夹里面的文件夹也就是每套模板文件,然后,跟上面一样把模板显示出来。
这样程序就会通过二种方法中的一种,若文件skinlist.inc不存在,则用另一种方法遍历模板文件夹,否则就遍历这个文件,遍历这个文件效率肯定比遍历文件夹快,所以,咱们尽量不要把这个文件删除了。
代码分析开始:
1.首先,定义一个路径$dir='space'; 这样的好处是方便快速的用$dir来代替,至少这个变量与'space'相比要少写好几个符号,一般如果一个字符串比较长,我们都通过这种方式来定义一个变量,来代替这个字符串。
2.判断文件skinlist.inc是否存在,若存在则把文件里面的内容一行一行通过函数file($dir.'/skinlist.inc')读出来,放到$ds里面,这时$ds里面存的就是每一行作为一个数组单元,构成的的数组了。我们最终目的是把skinlist.inc这个文件内容的模板名读出来,而这个文件里面又有几行说明文字,所以,得把这些过滤掉。
通过foreach($ds as $d) 遍历数组$ds 把遍历出来的值,去掉前后空格,然后,判断$d是不是为空或者第一个第二个是不是'//',若成立直接continue 重新下一行遍历,也就是跳过空行和有'//'的行,进行下一次行的遍历。但是这样还不够,因为,一套模板肯定至少在存放在一个文件里面,所以,这里在判断一下space/$d 是不是一个文件夹,若是才可以向下遍历,否则直接跳出循环,进行下一行遍历,除了这三种情况外,说明取出的一行就模板文件名了。
然后,把取出的模板文件名,例如person 存入数组$dirs里面,等把$ds遍历完后,$dirs里面存放的就是全部的空间模板名了。这是skinlist.inc 文件存在的情况,若这个文件不存在怎么办?
3.若文件skinlist.inc 不存在,也没有关系,程序就遍历space这个目录就是了。
要遍历这个目录,首先,得打开这个目录,通过函数opendir($dir)打开这个space目录句柄,然后通过readdir($fp)来读取每个目录名,放入到$dirs数组里面,当读完后,这个数组存放的是包括二个特殊符号".","..",也就是说在这个数组里面,有二个单元分别是这二个符号。
然后,关闭目录句柄closedir($fp),请注意,织梦这里写错了,他写成了closedir($dh)了。
4.现在已经把space里面的模板文件都读取到$dirs数组里面了,因为有二个特殊的符号,所以,现在去处理这二个符号,也就是把他们去掉就可以了。
获得模板摘要信息:
通过foreach($dirs as $sysname)来遍历这个数组,若$sysname的值是点'.'或'..'或者值是'cvs'或是在对应的模板文件里面不存在info.txt文件,则跳回到foreach遍历下一数组单元。其中,info.txt在模板中存在的是模板信息,也就是如下图所示的信息。
也就是相应的模板简单,例如,作者,模板名称等。
5.若上面几个条件都不成立,则接着执行下面的代码,通过函数showdemopic()把对应的模反的演示图片提取出来,放入变量$demopic ,这里的演示图片指的是我们在“风格选择”里面的模板封面图片。然后,把模板的修改时间提取出来放到$date变量里面。
定义一个数组
$listdb = array( 'sign' => $sysname, 'demo' => $demopic, 'name' => '', 'author' => 'Unkown', 'date' => '' );
其中sign的值是模板名,例如person,demo值是演示图片,author是模板作者,这几个要用到。
然后,把模板中文件info.txt里面的内容,读取出来放到数组$infodatas里面,通过代码:$infodatas = file("$dir/$sysname/info.txt");
文件夹info.txt里面存放的类似如下内容:
name:织梦基地 author:www.xxx.com type:个人 date:2009年7月
现在数组$infodatas里面存放的就是每一行作为一个单无了的数组,为了方便调用,程序会把这个数组重新做成,冒号前面的为数组的键,冒号后面的为这个键的值。这个是通过下面的代码来实现的:
foreach($infodatas as $d) { $d = trim($d); if(empty($d)) continue; $ds = explode(':', $d); $listdb[trim($ds[0])] = trim($ds[1]); }
这样$listdb存放的就是如下图所示,一个一个的数组,这里我只截取一部分来说明一下。要注意$listdb只存了一个数组,因为,它仍然在大的foreach里面。
因为,织梦系统中分为个人会员和企业会员二种,所以,当用户登录后台程序会判断,登录会员中心的会员是什么类型的会员,若是个人则把个人类型会员模板列出来,若是企业则把企业模板列出来显示出来,供这个会员选择使用哪套模板,这个是通过下面的代码实现的:
if($listdb['type'] != 'default' && $listdb['type'] != $cfg_ml->M_MbType) { continue; }
其中,$cfg_ml->M_MbType指的是登录的会员类型是个人还是企业,这个是在配置文件/member/config.php里面,实例化后后,$cfg_ml就是实例化对象,如果追踪一下的话,这个要追踪到arc.memberlogin.class.php里面,就可以知道M_MbType是会员的类型。
然后把所有的和登录会员的会员类型一致的模板构成的数组全部放入到$allskins里面,这里面存放的是一个二维数组,里面每个数组都包含模板的信息,如下所示:
Array ( [0] => Array ( [sign] => person [demo] => space/person/demo.jpg [name] => 织梦基地 [author] => www.dedebase.com [date] => 2009年7月 [type] => 个人 ) [1] => Array ( [sign] => lxvista [demo] => space/lxvista/demo.png [name] => lxblog默认Vista [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [2] => Array ( [sign] => lxblog [demo] => space/lxblog/demo.png [name] => lxblog默认深蓝 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [3] => Array ( [sign] => lxbrown [demo] => space/lxbrown/demo.png [name] => lxblog默认褐色 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [4] => Array ( [sign] => pwlake [demo] => space/pwlake/demo.png [name] => 湖蓝 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [5] => Array ( [sign] => pwblue [demo] => space/pwblue/demo.png [name] => 蔚蓝风格 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [6] => Array ( [sign] => pwglight [demo] => space/pwglight/demo.png [name] => 芳草丛明调 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [7] => Array ( [sign] => pwpink [demo] => space/pwpink/demo.png [name] => 织梦基地 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [8] => Array ( [sign] => flower [demo] => space/flower/demo.png [name] => 花 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [9] => Array ( [sign] => coffee [demo] => space/coffee/demo.png [name] => 咖啡风格 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) [10] => Array ( [sign] => gray [demo] => space/gray/demo.png [name] => 默认雅灰黑 [author] => ylj798 PW修改版 [date] => 2009年7月 [type] => 个人 ) )
这11个数组正好就是“风格选择”里面的11套模板。
现在把模板所有可能遇到的问题,都处理好了,接下来就是把这个数组通过遍历,然后,显示到“风格选择”里面了。