UTF.COM.CN

Discuz! 论坛如何添加配置选项

作者:佚名 | 来源:网络 | 添加时间:2007-12-15 12:34:06 | 人气:358

Discuz! 论坛如何添加配置选项

  Discuz! 论坛在后台有很多配置选项,通过这些配置选项可以实现很多功能。在 Discuz!论坛的二次开发过程中,我们也同样要经常添加一些配置,然后根据配置来进行不同的操作。下面我就来介绍一下如何在 Discuz! 论坛中添加配置选项。

  我们以 Discuz!6.0 为例。首先我们来看一下 Discuz! 论坛后台的配置界面,以管理员身份登录论坛后台,依次选择‘基本设置’ -> ‘基本设置’后会出现以下的界面:

  图1

  这个页面用了框架,我们在右下方的页面中点击右键选择‘属性’,在弹出的窗口中,我们发现这个页面的 URL 是 ''/admincp.php?action=settings&do=basic'' ,这个页面用的程序是admincp.php ,先来分析一下这个文件。

  这个文件的第 172-290 行大致的内容如下:

  代码如下:

  $cpscript = '''';

  if($adminid == 1) {

  if($action == ''home'') {

  $cpscript = ''home'';

  } elseif($action == ''runwizard'' && isfounder()) {

  $cpscript = ''runwizard'';

  } elseif ……

  } elseif($adminid == 2 || $adminid == 3) {

  if($action == ''home'') {

  $cpscript = ''home'';

  } elseif((($allowedituser || $allowbanuser) && ($action == ''editmember'' || $action == ''banmember'')) || ($allowbanip && $action == ''ipban'')) {

  $cpscript = ''members'';

  } elseif……

  }

  if($cpscript) {

  } elseif……

  }

  if($cpscript) {

  require_once DISCUZ_ROOT.''./admin/''.$cpscript.''.inc.php'';

  } ……

  这段程序主要就是根据 $action 变量来给 $cpscript 赋值,然后根据 $cpscript 的值来引入 admin 目录下的程序文件。我们注意一下 179 行左侧的 $action 值的判断,会发现其$cpscript 的值是 ''settings'' ,那就是说 283 行引入的程序文件是 ''admin/settings.inc.php'' 。

  然后打开 settings.inc.php 文件,会发现里面的内容好长呀,不要被这给吓坏了,仔细分析一下就好了。

  第 14 行:

  代码如下:

  $operation = $operation ? $operation : (!empty($do) ? $do : '''');

  这里会根据 GET 过来的 $do 值来给 $operation 赋值,这个例子中其值是 ''basic'' 。

  第 17 行:

  代码如下:

  $query = $db->query("SELECT * FROM {$tablepre}settings");

  while($setting = $db->fetch_array($query)) {

  $settings[$setting[''variable'']] = $setting[''value''];

  }

  这些程序段是从数据库把数据读出来存到数组 $settings 中以便下面调用。

  下面的程序结构如下:

  代码如下:

  if(!submitcheck(''settingsubmit'')) {

  if($operation == ''access'') {

  ……

  } elseif($operation == ''styles'') {

  ……

  } elseif ……

  } else {

  //表单提交后的数据处理

  ……

  }

  程序中的 submitcheck 函数是用检查一个表单是否进行提交,如果表单没有提交,则根据前面处理过的 $operation 来显示表单。在这里 $operation 的值是 basic ,其执行的是下面一段:

  代码如下:

  $operation = ''basic'';

  showtype(''settings_general'', ''top'');

  showsetting(''settings_bbname'', ''settingsnew[bbname]'', $settings[''bbname''], ''text'');

  showsetting(''settings_sitename'', ''settingsnew[sitename]'', $settings[''sitename''], ''text'');

  showsetting(''settings_siteurl'', ''settingsnew[siteurl]'', $settings[''siteurl''], ''text'');

  showsetting(''settings_index_name'', ''settingsnew[indexname]'', $settings[''indexname''], ''text'');

  showsetting(''settings_icp'', ''settingsnew[icp]'', $settings[''icp''], ''text'');

  showsetting(''settings_boardlicensed'', ''settingsnew[boardlicensed]'', $settings[''boardlicensed''], ''radio'');

  showsetting(''settings_bbclosed'', ''settingsnew[bbclosed]'', $settings[''bbclosed''], ''radio'');

  showsetting(''settings_closedreason'', ''settingsnew[closedreason]'', $settings[''closedreason''], ''textarea'');

  在这里用到了一个自定义函数 showsetting ,它的第一个参数是这个配置选项的名字,第二个参数是在 HTML 显示时 input 的 name 值,第三个参数是当前配置选项的值,是上面从数据库查出来的数组 $settings 中的一个值,第四个参数是 input 的类型。我们添加一个自己的配置选项 mytest 。在上面代码的最后面添加如下代码:

  代码如下:

  showsetting(''settings_mytest'', ''settingsnew[mytest]'', $settings[''mytest''], ''radio'');

  保存,刷新页面发现在这个页面最下方多出一个选项:

  settings_mytest 是 否

  但是发现其是英文的,我们修改一下语言包就可以了。在templates/default/admincp.lang.php 文件的第 450 行 ''settings_closedreason_comment'' => '' 论坛关闭时出现的提示信息'' ,下面添加如下代码:

  代码如下:

  ''settings_mytest'' => ''测试选项:'',

  ''settings_mytest_comment'' => ''测试选项的提示信息'',

  保存后再刷新就有中文提示了。

  至此在界面上的显示已经处理完毕,下面来说一下如何处理表单提交后的数据。在/admin/settings.inc.php 文件的 if(!submitcheck(''settingsubmit'')) {} 对应的 else 语句部分。这部分的代码,首先对提交过来的数据进行处理,然后全部放到 $settingsnew 数组中,其实也就是 POST 过来的数据进行一下检查。在这个文件的 1140 行左右有如下代码:

  代码如下:

  foreach($settingsnew AS $key => $val) {

  if(isset($settings[$key]) && $settings[$key] != $val) {

  $$key = $val;

  $updatecache = TRUE;

  if(in_array($key, array(''newbiespan'', ''topicperpage'', ''postperpage'', ''memberperpage'', ''hottopic'',

  ''starthreshold'', ''delayviewcount'', ''visitedforums'', ''maxsigrows'', ''timeoffset'', ''statscachelife'',

  ''pvfrequence'', ''oltimespan'', ''seccodestatus'', ''maxprice'', ''rssttl'', ''rewritestatus'', ''bdaystatus'',

  ''maxonlines'', ''loadctrl'', ''floodctrl'', ''regctrl'', ''regfloodctrl'', ''searchctrl'', ''extcredits1'', ''extcredits2'',

  ''extcredits3'', ''extcredits4'', ''extcredits5'', ''extcredits6'', ''extcredits7'', ''extcredits8'',

  ''transfermincredits'', ''exchangemincredits'', ''maxincperthread'', ''maxchargespan'', ''maxspm'',

  ''maxsearchresults'', ''maxsmilies'', ''threadmaxpages'', ''membermaxpages'', ''maxpostsize'',

  ''minpostsize'', ''maxavatarsize'', ''maxavatarpixel'', ''maxpolloptions'', ''karmaratelimit'', ''losslessdel'',

  ''edittimelimit'', ''smcols'', ''watermarktrans'', ''watermarkquality'', ''jscachelife'', ''waptpp'', ''wapppp'',

  ''wapmps'', ''maxmodworksmonths'', ''frameon'', ''maxonlinelist''))) {

  $val = (float)$val;

  }

  $db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES (''$key'', ''$val'')");

  }

  }

  这段代码的作用就是检查 $settingsnew 数组中是否有对应的选项,如果有并且是数字选项时进行 float 转换,然后全部 REPLACE INTO 到数据表 settings 中, mytest 选项是我们新添加的,数据表中没有这个选项,我需要先在数据库中执行如下 SQL 语句: REPLACE INTO cdb_settings(variable, value) VALUES(''mytest'', ''0'') ,注意修改一下表前缀。这们的 mytest 选项就会存入数据库中。

  在 1160 行左右会执行代码 updatecache(''settings'') 来把 settingsnew 数组里的数据自动进行缓存,具体实现方法有兴趣的朋友可以仔细看一下 /include/cache.func.php 文件是如何实现的。

  数据进行缓存后会在 /forumdata/cache/cache_settings.php 文件中 $_DCACHE[''settings''] 数组中有 mytest 项,然后我们就可以通过这个选项来做一些操作。在 /include/common.inc.php 文件的第 93 行左右有如下代码:

  代码如下:

  $cachelost = (@include DISCUZ_ROOT.''./forumdata/cache/cache_settings.php'') ? '''' : ''settings'';

  @extract($_DCACHE[''settings'']);

  通过上面的代码,直接把 mytest 配置选项的值用 $mytest 变量来存放,我们就可以直接判断 $mytest 来进行操作了。在 index.php 文件的 17 行加入如下代码:

  代码如下:

  if($mytest) {

  echo ''Hello This is Test'';

  }

  运行后,效果如下:

  图2

  至此已经成功的为 Discuz! 论坛添加了一个选项,论坛当然还有相当的选项,其基本思路都是这样的,可以根据具体情况来进行添加。

责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)

姓名:

验证码: 点击刷新