Discuz! 论坛如何添加配置选项
author:一佰互联 2019-04-22   click:198
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! 论坛添加了一个选项,论坛当然还有相当的选项,其基本思路都是这样的,可以根据具体情况来进行添加。