机箱厂家
免费服务热线

Free service

hotline

010-00000000
机箱厂家
热门搜索:
技术资讯
当前位置:首页 > 技术资讯

Discuz! 教程:论坛如何添加配置选项_新闻资讯_中关村在线种植

发布时间:2020-04-19 18:35:06 阅读: 来源:机箱厂家

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! 论坛添加了一个选项,论坛当然还有相当的选项,其基本思路都是这样的,可以根据具体情况来进行添加。

摇滚美女图片

绳虐美女

毒蛇养殖

中药材的种植