DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> WEB網站前端 >> 前端技巧 >> Discuz! 論壇如何添加配置選項
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! 論壇添加了一個選項,論壇當然還有相當的選項,其基本思路都是這樣的,可以根據具體情況來進行添加。
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved