DedeCMS系统配置参数功能和运行分析

  本教程主要分析讲解dedecms系统基本参数功能是如何实现的,如何存在到数据,程序是如何执行,具体某个配置这里不讲,因为比较简单,在其它教程里讲解。简言之,这个教程以分析DedeCMS系统配置参数功能的php程序、模板运用等内容。

  进入到Dedecms系统配置参数界面,如下图所示,这个图只截取基本一部分。


  这个界面所对应的php程序文件是http://www.zuola.net/dede/sys_info.php,即sys_info.php,这个php文件,对应的模板文件是sys_info.htm,以后我们分析某一功能首先要找出,那一功能对应原php程序和模板。今天就分析织梦系统配置参数下面每个功能的实现和运行,这样说有可能不是清梦,我们一个功能一个功能的分析。

  首先,我们目标是实现在“添加新变量”前面加上一个对应的栏目选项,即如下图所示位置。


  要实现这个功能,首先就要找到这个栏目,我们打开文件sys_info.htm,在这个模板文件中好像没有明显的这一行信息,我们仔细找一下,找到如下一段php代码。

  <tr>
   <td height="24" bgcolor="#ffffff" align="center">
    <?php
$ds = file(DEDEADMIN.'/inc/configgroup.txt');//每行作为一个单元存放在数组中。
$totalGroup = count($ds);//统计数组个数。
$i = 0;
foreach($ds as $dl)
{
    $dl = trim($dl);
    if(empty($dl)) continue;
    $dls = explode(',',$dl);//用逗号分隔字符串,分隔后存放在数组$dls里面。
    $i++;
    if($i>1) echo " | <a href='javascript:ShowConfig($i,$totalGroup)'>{$dls[1]}</a> ";
    else{
        echo " <a href='javascript:ShowConfig($i,$totalGroup)'>{$dls[1]}</a> ";
    }
}
?>
    | <a href="#" onClick="ShowHide('addvar')">添加新变量</a></td>
  </tr>

  这好像与我们平时看到的织梦前台模板有点矛盾,一般的前台模板(路径是templets/default)文件不一样,不一样在在前台模板文件里面,看不到php程序,只有标签,没有错,实际上在前台模板里面可以应用php文件,但不是直接应用,而是用织梦标签开始与结束,例如下面这个代码。

[field:global runphp='yes' name=autoindex]
if (@me < 9) @me = '0'.@me;
else @me = @me;
[/field:global]

  但是像在模板sys_info.htm中这样直接应用php程序没有,织梦也不允许,那为什么在sys_info.htm模板文件能用呢?因为,这个模板文件被包含引用在了sys_info.php文件,这是php程序中的规定,只要在php程序中包括有其它文件如模板,那么,在它所包括的文件中就可以直接使用php程序与htm嵌套使用,这是一个重要的知识点,如果不理解这一点,就会给我们带来困惑。

  回过头来我们再分析一下上面<tr>与</tr>之间的这段php代码。现在我们详细分析一下这段代码,如何添加一个栏目,例如我们添加“织梦基地”这样一个栏目。这一小段代码用到比较多的知识,我们详细分析一下。这段代码用到了四个php函数,分别是file(),count(),trim(),explode(),一个数组遍历语句foreach,还用到了一个js函数ShowConfig()这个函数就是一个选择卡功能。

  函数file()的作用是把每行作为一个单元存放在数组中,我们直接打印出$ds = file(DEDEADMIN.'/inc/configgroup.txt'),显示的结果是:Array ( [0] => 1,站点设置 [1] => 2,核心设置 [2] => 3,附件设置 [3] => 4,会员设置[4] => 5,互动设置 [5] => 6,性能选项 [6] => 7,其它选项 [7] => 8,模块设置 ) 。很明显这个结果是一个数组,我们打开文件confinggroup.txt文件发现,每一行对应数组中的一个单元,这正是这个file()函数的强大之处。
 
  我们再看一下count()函数,函数是用来计算数组中的单元数目或对象中的属性个数,我们打印一下count($ds),结果是8,说明文件上面的$ds数组有8个单元。数组$ds是一个一组数组,如果是多维,函数会一直向下执行,这是一个计算

多维数组的好方法工具。在数据库语言中也有这个名称完全相同的函数,经常用来计算查询出来的记录条数或字段数,等讲到数据库知识我们详细讲解,注意区别。

  函数trim()是去除字符串首尾处的空白字符(或者其他字符),删除左边、右边空白字符(或其他字符)的函数分别是ltrim(),rtrim(),就是在函数trim()前面加上左右英文第一个字母即可。去除的字符包括如下五大类:

  " " (ASCII 32 (0x20)),普通空格符。
  "\t" (ASCII 9 (0x09)),制表符。
  "\n" (ASCII 10 (0x0A)),换行符。
  "\r" (ASCII 13 (0x0D)),回车符。
  "\0" (ASCII 0 (0x00)),空字节符。
  "\x0B" (ASCII 11 (0x0B)),垂直制表符。

  这里为什么要去除空白字符呢,如果不这样,那么,当程序执行到if(empty($ds)) continue;时,程序下面的代码就执行不了了,那么,文件configgroup.txt内容就循环不出来了。

  第四个函数explode()这个函数非常重要,它的作用就是一个字符串分割另一个字符串,返回一个字符串组成的数组。在这段代码中$dls = explode(',',$dl),explode把字符串$dl分割成一个数组,例如当循环到第一个即“1,站点设置”,这个函数会把这个字符串他割成[0]=1;[1]="站点设置"这样的数组。与它相反的一个函数implode()是把数组连接成一个字符串。

  在循环里面的if($i>1)这个判断是作什么用的呢?他是用来处理每个栏目选项的“竖线”当第一个的时候,是没有竖线的,这也为我们提供了一种思路,例如,我们网站导航有很多站都有竖线,当然,导航用的是css或js知识。

  最后,有一个js函数ShowConfig($i,$totalGroup),这个函数是用来实现栏目选项卡功能的,这里暂时不作多解释,以后,会有专题详细讲解选项卡功能。

  为了方便大家对这段程序的理解,制作这段程序的运行流程图如下所示。
dedecms系统配置分析图

  通过上面的分析,我们得知,只要我们在文件configgroup.txt最后一行,加上“9,织梦基地”,就可以了,我们加上试一下。截取图如下,


  看到没有,我们已经加上“织梦基地”这个栏目选项了,我们每点击一个栏目选项,就有一个表单对就设置,现在我们点击“织梦基地”下面还是空的,什么也没有。

  现在我们再在“织梦基地”下面加上一些配置参数,怎么加配置参数呢?要解决这个问题,首先们要分析一下其它的配置选项是如何加上并达到配置作用的。我们回到模板sys_info.htm,接着上面的代码继续向下看,接下来的代码是“添加新变量”也就是后台中如下图4所示(截取部分图片)

                                                                         图4
  这个图片与模板sys_info.htm对应的代码是第70行到127行代码,即这段代码是一个form表单,再向下找还有一个form表单,本来DedeCMS系统配置参数直接用一个表单就可以解决,为什么要用二个呢?因为,“添加新变量”对应的表单是一个向数据库里面添加数据的,即insert into,而另一个表单收集到的数据是更新即update,二个对数据库不同的操作,所以,分成二个表单。从这个例子我们可以看出,一个模板可以有多个表单,他们相互不影响,虽然他们都提交同一个php程序来处理数据,这二个表单最重要的一点就是第一个有一行是<input type='hidden' name='dopost' value='add'>;第二个表单有一行是<input type="hidden" name="dopost" value="save">,如果没有这二个,那么,这个表单就会出错,这二行是用来处理数据的条件。这二行分别对应sys_info.php程序文件里面的二个条件if($dopost=="add"),if($dopost=="save")。这一点我们在“织梦后台添加顶级栏目详解”这个教程里讲过,这里再提一下,重点知识。

  在约114行,又有一段程序,这段程序是用来循环显示下拉选项内容的,对应下图5所示“所属组”。

                                                                图5

  再向下看,就是一段搜索代码,跳过,另一个教程我们详细分析搜索功能。

  接着看代码,到了第二个表单form了,这个就是除“添加新变量”栏目选项外的其它所有栏目,循环代码。先看第二个表单第一段代码如下图6所示,

                                                           图6

这段代码的作用是当用户(或管理员)进入系统基本参数后,默认显示第一个的功能,这段代码就起到了这个作用,无非就是把css设置成style="display:none"或空的问题,这一段就不用解释了,跟上面那段代码一样是个循环我们已经分析过了。

  接下来这一大段php代码就是除“添加新变量”外所有栏目选项的循环代码。

  前二行代码
  $dsql->SetQuery("Select * From `dede_sysconfig` where groupid='{$dls[0]}' order by aid asc");
  $dsql->Execute();

  这二行代码是重点,他们的作用是,从数据库表dede_sysconfig里面,把变量类型ID等于{$dls[0]}值的所有字段都查询出来,$dls这个数组在图6中已经循环查询出来了。只要把这个表中所有字段查出来下面就方便使用了。为了方便大家把数据库表dede_sysconfig截取了一张图7如下所示。


                                                                             图7
  用这个while循环,实现了隔行变色的功能,这个功能类似于我们用js或css实现隔行换色,而且比css要简单的多了,如果我们用jquery的话,也非常容易,对于隔行变色,我们以后总结。还有一点在这个while循环中,有一个$dsql->GetArray()函数,这个作用返回当前的一条记录并把游标移向下一记录,其实,当我们执行上面二行代码后,我们虽然把数据从数据查询出来了,但是他仍然在一张表中,通过$sql->GetArray()我们可以从表中找取出一条记录来,我们在这里看到这个简单的代码,其实它的底层函数是mysql_fetch_array(),只是织梦帮我们封装好了,要查询看这个$dsql->GetArray()函数,请在目录/include/dedesql.class.php这个数据库类里面大约383行就能找到。

  接下来,程序通过type类型,来决断显示你的表单信息,虽然,这里只是一句话带过,但是这段代码相当多的,因为简单这里不用分析了。我们重点看其中一句。

  if ($row['varname']=='cfg_cookie_encode') {
      $addstr=' <a href="javascript:resetCookieEncode();" style="color:blue">[重新生成]</a>';
   }

  这段代码是对应后台系统配置参数里面的“核心设置”cookie加密码后面有个重新生成功能,如下图8所示。

                                                        图8

  这个[重新生成]cookie加密码,通过一个javascript的函数resetCookieEncode()(这个函数在模板sys_info.htm最上能找到),通过ajax技术,进入到php程序文件sys_info.php,在这个文件中最后一段代码,计算随机cookie加密码来获取生成密码。关于cookie,seetion我们有一个专题,这里不作过讲,在讲织梦会员系统,会员注册时会详细讲到。

  现在我们分析完了,现在我们在织梦后添加新变量到“织梦基地”那个选项栏目里面:

  变量名称:cfg_zmpath
  变更值:http://www.zuola.net
  变量类型:文本
  参数说明:织梦基地网址
  所属组:织梦基地

  填写完这些后,点击“保存变量”,点击“织梦基地”,如下图所示成功了。