Discuz! 論壇如何添加配置選項

來源:互聯網
上載者:User

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! 論壇添加了一個選項,論壇當然還有相當的選項,其基本思路都是這樣的,可以根據具體情況來進行添加。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。