当前位置: 首页 > 图文教程 > 网页制作 > 心得技巧 > Discuz! 论坛如何添加配置选项

心得技巧
IE8 Beta 1两个地方需要大家注意
提高网站性能中内容有关的10条原则
网页设计者应该从三个方面优化网页
Web 设计 实现干净代码的12条定律[图文]
网页设计必备工具 firefox Web Developer插件 CSS工具组教程
UCenter Home 站点添加统计代码
9款很棒的网页绘制图表JavaScript框架脚本
提高网站可用性的10个小技巧
网站维护页面的列表制作技巧
B2C 网站用户体验细节设计参考
收集12个实用的网页在线工具
设计参考 漂亮和原创的博客设计
收集25个知名网站标志中使用的字体
极尽简约的网站设计实例
个性化创意鲜明的网站设计实例(30个)
水平滚动的网站设计 小结
更受欢迎 更具创造性的深底色网页设计实例
有创意的关于我们网页页面设计
整洁漂亮的网页设计的4项原则
设计参考 WordPress建站成功案例

心得技巧 中的 Discuz! 论坛如何添加配置选项


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-10   浏览: 48 ::
收藏到网摘: n/a

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