日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

童虎:人人皆可做插件 Discuz! 插件開(kāi)發(fā)實(shí)例講解_PHP教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:PHP技術(shù)進(jìn)階 PHP SOCKET 技術(shù)研究
今天試著寫(xiě)一個(gè) PHP 與 C 語(yǔ)言通過(guò)socket通訊的程序,看過(guò)PHP手冊(cè),發(fā)現(xiàn)有好幾種方式可以建立socket 客戶(hù)端. 1、通過(guò) fsockopen() 建立socket連接,然后用 用fputs() 發(fā)送消息,用 fgets() 接

作者簡(jiǎn)介:童虎,Discuz!論壇程序研發(fā)經(jīng)理,負(fù)責(zé)Discuz!論壇程序研發(fā)團(tuán)隊(duì)的管理工作,曾是Discuz!早期插件作者,擔(dān)任過(guò)Freediscuz插件區(qū)版主。 曾開(kāi)發(fā)過(guò)社區(qū)寵物、社區(qū)監(jiān)獄、社區(qū)虛擬形象等多個(gè)Discuz!熱門(mén)插件。

論壇向社區(qū)化發(fā)展已經(jīng)成為趨勢(shì),站長(zhǎng)對(duì)網(wǎng)站的個(gè)性化需求越來(lái)越高,同時(shí)隨著網(wǎng)站規(guī)模的擴(kuò)大,站長(zhǎng)對(duì)于一些特殊功能的需求也越來(lái)越多, Discuz! 標(biāo)準(zhǔn)程序作為一個(gè)通用程序,從某種意義上講很難滿(mǎn)足所有站長(zhǎng)個(gè)性化功能的需求,因此論壇插件就成為對(duì)標(biāo)準(zhǔn)程序最好的功能補(bǔ)充。

從目前來(lái)看,正在做插件和想做插件的人越來(lái)越多,從Discuz!官方論壇的統(tǒng)計(jì)數(shù)據(jù)大家就可以看出,目前插件區(qū)已經(jīng)成為僅次于安裝使用區(qū)之后的第二大版塊。于此我們同時(shí)也發(fā)現(xiàn)許多希望開(kāi)發(fā)插件的作者,有時(shí)候感覺(jué)插件開(kāi)發(fā)很難上手,一定程度上也影響了插件的豐富性和多樣性。特此,寫(xiě)這樣一篇文章,談不上有什么教育意義,只是給那些希望開(kāi)發(fā)插件的朋友一塊敲門(mén)磚,讓更多的人成為一名插件作者,拿出你們的創(chuàng)意,讓論壇更加豐富多彩。

閑話(huà)少敘,書(shū)歸正言,首先我們來(lái)介紹一些Discuz!插件從程序?qū)崿F(xiàn)的方式,主要是分兩種:

第一種是利用已有的插件機(jī)制,這種機(jī)制官方有詳細(xì)的開(kāi)發(fā)文檔,可以利用現(xiàn)有的一些接口和函數(shù),按照文檔規(guī)定的文件以及目錄結(jié)構(gòu),進(jìn)行開(kāi)發(fā)就可以了,這種方式是官方鼓勵(lì)的開(kāi)發(fā)方式,所開(kāi)發(fā)的插件比較標(biāo)準(zhǔn),在后臺(tái)可以輕松管理并導(dǎo)入導(dǎo)出,利于插件的安裝。 但是這種方式需要插件作者看懂開(kāi)發(fā)文檔,嚴(yán)格按照開(kāi)發(fā)文檔做。個(gè)人感覺(jué)局限性相對(duì)而言比較大,不過(guò)推薦新手可以試試這種方式,畢竟這種方式插件方便插件使用者安裝,相對(duì)而言比較利于插件的推廣。

第二種就是我這篇文章可能要重點(diǎn)推薦的,我稱(chēng)它為自由方式,這種方式需要插件作者對(duì) Discuz! 程序相關(guān)接口和函數(shù)有一定了解。當(dāng)然我會(huì)在下面的文章里面對(duì)一些常用函數(shù)做一個(gè)簡(jiǎn)單介紹。這種方式的好處就是在編寫(xiě)程序時(shí)候比較自由,不需要像第一種那樣需要放在規(guī)定的目錄中,給插件作者發(fā)揮的余地更大。還有,就是這樣寫(xiě)出的程序更像論壇程序的一部分,而不是一個(gè)插件,哈哈。不過(guò)這種方式編寫(xiě)的插件也有一定的缺陷,比如安裝上面相對(duì)第一種方式比較繁瑣,如果需要管理后臺(tái),還需要自己來(lái)編寫(xiě)。不過(guò)這些對(duì)于大家來(lái)說(shuō)應(yīng)該是小意思了吧,呵呵。

下面我一步一步來(lái)介紹自由方式編寫(xiě)插件的過(guò)程,以及一些常用的函數(shù)和其用法。先強(qiáng)調(diào)一點(diǎn),我這里所介紹的插件是有獨(dú)立運(yùn)行文件的,而不是那種只修改原文件。

首先介紹一下插件的組成,一個(gè)普通的插件不管是小型的還是大型的,一般都會(huì)有一個(gè)主程序文件,作為 Discuz! 的插件,如果有獨(dú)立頁(yè)面一般會(huì)有模板文件。當(dāng)然隨著插件功能增加可能還會(huì)有其他文件,比如后臺(tái)管理文件、自定義函數(shù)文件等等�?偟膩�(lái)說(shuō)一個(gè)插件最低限度要有一個(gè)主程序 PHP 文件,基本上都會(huì)有一個(gè)主程序文件和模板文件。高級(jí)一些插件還會(huì)存在后臺(tái)管理文件以及相關(guān)程序文件。

文件存放目錄,一般主程序會(huì)放在論壇根目錄下,這樣比較規(guī)范而且方便插件前臺(tái)調(diào)用。模板目錄一般放在 templatesdefault 目錄下,這樣即使更換風(fēng)格也可以正常使用,因?yàn)?Discuz! 模板處理程序會(huì)有這樣的一個(gè)機(jī)制:如果生成模板緩存的時(shí)候,當(dāng)前模板目錄下沒(méi)有需要的模板文件,會(huì)自動(dòng)到默認(rèn)模板目錄下獲取,如果還沒(méi)有才會(huì)報(bào)錯(cuò)。所以作為插件的模板最好放在默認(rèn)模板目錄下。

其他文件可以根據(jù)功能不同放在不同的目錄下,比如說(shuō)后臺(tái)管理文件,一般會(huì)放在論壇根目錄 admin 目錄下,然后通過(guò) admincp.php 里面調(diào)用,調(diào)用方法我會(huì)在后面說(shuō)到。用的一些 function 之類(lèi)的東西,可以寫(xiě)成一個(gè)文件放在 include 目錄下,不過(guò)最好是單獨(dú)建立一個(gè)目錄放在里面,這樣比較方便今后的拆卸。

最后還有一部分文件,就是你頁(yè)面中可能會(huì)用到的圖片文件,這些圖片文件一般放在images 目錄下,至于放在那里在這里我們就沒(méi)有嚴(yán)格的要求了。

說(shuō)完了文件,下面簡(jiǎn)單介紹一下插件中對(duì)數(shù)據(jù)表的操作。對(duì)于插件而言實(shí)際上是不希望對(duì)論壇的數(shù)據(jù)表進(jìn)行修改的,特別是論壇的幾個(gè)主要數(shù)據(jù)表:members、 posts、threads,對(duì)這幾個(gè)表如果修改的不恰當(dāng),很可能造成整個(gè)論壇系統(tǒng)性能的下降。為了防止給插件拆卸帶來(lái)不便,所以我們?cè)谥谱鞑寮䲡r(shí)候盡量避免對(duì)上面三個(gè)數(shù)據(jù)表的結(jié)構(gòu)進(jìn)行修改。如果非要修改,盡量能單獨(dú)建立數(shù)據(jù)表,然后通過(guò) uid 、 pid 、 tid 進(jìn)行數(shù)據(jù)關(guān)聯(lián),當(dāng)使用的時(shí)候再調(diào)用。

退一步說(shuō)如果非要在上述三個(gè)數(shù)據(jù)表里面添加字段,所添加的字段如果是字符類(lèi)型必須是定長(zhǎng)字段,例如 char ,如果是數(shù)字類(lèi)型根據(jù)數(shù)值范圍不同,盡量用 tinyint 、 smallint 、int ,這樣盡可能不影響論壇效率。當(dāng)然在實(shí)際使用中還有許多要注意的地方,鑒于文章的篇幅有限這里不做太多詳細(xì)的說(shuō)明,另外我會(huì)對(duì)插件數(shù)據(jù)庫(kù)要注意的問(wèn)題,單獨(dú)寫(xiě)成文檔和大家一起討論。

上面都是一些常識(shí)問(wèn)題,下面我以一個(gè)以前我寫(xiě)過(guò)的插件為例子,具體對(duì)插件的編寫(xiě),以及一些 Discuz! 常用函數(shù)的使用做說(shuō)明。

這個(gè)插件很簡(jiǎn)單,就是一個(gè)抽獎(jiǎng)的插件,主要功能是根據(jù)會(huì)員的一些論壇資料,比如發(fā)帖數(shù)、精華帖、在線(xiàn)時(shí)間、注冊(cè)時(shí)間等計(jì)算出獲獎(jiǎng)幾率,并獲得一定數(shù)量指定積分。主要由三部分文件組成,主程序文件:luck.php、模板文件 templatesdefaultluck.htm 模板文件和圖片文件 imagesdefault ,增加了一個(gè)數(shù)據(jù)表:cdb_luck。

下面我將 luck.php 和模板文件部分關(guān)鍵代碼進(jìn)行詳解,講解前我先介紹幾個(gè)必備的文件和自定義函數(shù)。

首先是幾乎在所有插件都要用到的文件 common.inc.php ,這個(gè)文件是 Discuz! 核心文件,幾乎所有的程序文件都會(huì)用到,這個(gè)文件主要是一些重要的變量進(jìn)行初始化以及賦值,調(diào)用常用的自定義函數(shù),以及一些共用程序。并且在里面對(duì)用戶(hù)登陸以及相關(guān)操作做了處理,具體的代碼這里就不詳細(xì)分析了,大家可以到 www.discuz.net 上找到詳解的文章。

其次就是幾個(gè)自定義函數(shù)了:

1、 function showmessage($message, $url_forward = '', $extra = '')

這個(gè)函數(shù)的主要作用就是返回提示信息,參數(shù)變量有三個(gè):

$memssage 要返回的提示信息,支持 html ;

$url_forward 返回提示信息后跳轉(zhuǎn)的 url ;

$extra 其他參數(shù),主要有兩個(gè) HALTED 、 NOPERM ,其中 NOPERM 是比較常用的,是當(dāng)一個(gè)用戶(hù)沒(méi)有權(quán)限時(shí)候,用這個(gè)參數(shù)會(huì)自動(dòng)出現(xiàn)無(wú)權(quán)限頁(yè)面以及要求登陸的界面。

這個(gè)函數(shù)使用還有一個(gè)小技巧,就是當(dāng) $memssage 包含“返回”這個(gè)字樣的時(shí)候,無(wú)需填寫(xiě) $url_forward 變量,會(huì)自動(dòng)返回上一頁(yè)。

2、function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0)

主要作用驗(yàn)證表單提交是否合法, Discuz! 系統(tǒng)中為了防止非法表單提交,所有的表單提交頁(yè)面都會(huì)有一個(gè)隱藏 input , name 為 formhash ,這個(gè) hash 是根據(jù)一些用戶(hù)資料經(jīng)過(guò)加密生成的,主要驗(yàn)證該用戶(hù)的表單提交動(dòng)作是否合作。這個(gè)函數(shù)在有表單提交的時(shí)候會(huì)經(jīng)常用到。

這個(gè)函數(shù)的參數(shù)變量有四個(gè):

$var 提交 submit 的 name ;

$allowget 這個(gè)表單是否允許 get 方式提交;

$seccodecheck 提交表單是否需要驗(yàn)證碼;

$secqaacheck 提交表單是否需要驗(yàn)證問(wèn)題。

3、 function template($file, $templateid = 0, $tpldir = '')

這個(gè)也是插件中比較常用的自定義函數(shù)之一,主要用戶(hù)生成插件的模板,參數(shù)變量有三個(gè):

$file 要生成模板的文件名(不包括擴(kuò)展名)這個(gè)指的是上面所說(shuō)的模板文件;

$templateid 指定模板 ID , Discuz! 系統(tǒng)支持多套模板,每個(gè)模板都有對(duì)應(yīng)的 ID ,這里可以指定某套模板的 id 下面的某個(gè)模板文件,一般不需要填寫(xiě);

$tpldir 模板文件目錄,這個(gè)一般情況下也不用填寫(xiě)。

因?yàn)镈iscuz!的模板最終會(huì)編譯成 PHP 文件,所以在用這個(gè)函數(shù)的時(shí)候,還需要引用一下,一般用 PHP 中的 include 函數(shù)引用。

4、嚴(yán)格說(shuō)這個(gè)是一個(gè) class ,主要用于一些數(shù)據(jù)庫(kù)操作,比較多,這里就不一一描述了,大家可以自己看 includedb_mysql.class.php 文件,簡(jiǎn)單說(shuō)

兩個(gè)常用:

$db-query(“$sql”) 執(zhí)行某一特定的 SQL 語(yǔ)句,支持幾乎所有的 MYSQL 常用語(yǔ)句。

$db-fetch_array($query) 將 SQL 語(yǔ)句的結(jié)果輸出為數(shù)組,主要用于 SELECT 操作。

最后還要提一下一些在插件中可能用到的, Discuz! 系統(tǒng)中一些全局變量:

$discuz_uid 用戶(hù) uid

$discuz_user 用戶(hù)名

$tablepre 數(shù)據(jù)表前綴

$timestamp 當(dāng)前時(shí)間(時(shí)間戳形式)

說(shuō)了這么多了,下面我們來(lái)看具體代碼,我會(huì)把程序中每行代碼做解釋?zhuān)M蠹夷塬@得一點(diǎn)啟發(fā)吧

require_once '.includecommon.inc.php';

這行代碼就是前面說(shuō)的 common.inc.php 這個(gè)系統(tǒng)核心文件的引用,幾乎所有插件都會(huì)用到。

代碼如下:

以下為引用的內(nèi)容:
if(!$discuz_uid) {
showmessage('not_loggedin', NULL, 'NOPERM');
}

這段的含義是當(dāng)程序發(fā)現(xiàn)訪(fǎng)問(wèn)者是游客時(shí),自動(dòng)會(huì)提示無(wú)權(quán)訪(fǎng)問(wèn),請(qǐng)登陸的界面,在Discuz! 里面是通過(guò) common.inc.php 做處理,然后給 $discuz_uid 這個(gè)變量賦值,當(dāng)這個(gè)變量為空或者為 0 時(shí),程序會(huì)認(rèn)為這個(gè)訪(fǎng)問(wèn)者是游客,否則這個(gè)變量將被賦值為該會(huì)員的 uid 。和這個(gè)變量類(lèi)似的還有 $discuz_user 這個(gè)是用于顯示會(huì)員用戶(hù)名的,如果為空也說(shuō)明訪(fǎng)問(wèn)者為游客。

代碼如下:

$startdate = '2007-02-17'; 開(kāi)始日期,填寫(xiě)格式2007-02-17

$enddate = '2007-02-24'; 結(jié)束日期,填寫(xiě)格式2007-02-24

$joincount = 30; 可以參與抽獎(jiǎng)的次數(shù)

$getcredit = 1; 增加擴(kuò)展積分1~8

$mincredit = 1; 獲得積分的最小值

$maxcredit = 100; 獲得積分的最大值

這段代碼是一些程序里面用到的設(shè)置變量,如果你的插件有后臺(tái)程序可以把這些變量放到后臺(tái)進(jìn)行設(shè)置,然后寫(xiě)到數(shù)據(jù)庫(kù)或者緩存為文件。

代碼如下:

以下為引用的內(nèi)容:
if(empty($getcredit) $getcredit 1 $getcredit 8) {
showmessage('積分設(shè)置有問(wèn)題,請(qǐng)返回修改');
}

這段代碼也是一個(gè)提示類(lèi)型的判斷語(yǔ)句,當(dāng)不滿(mǎn)足 if 里面的條件時(shí),就會(huì)跳到提示頁(yè)面,提示:積分設(shè)置有問(wèn)題,請(qǐng)返回修改,大家注意這個(gè)的提示語(yǔ)言有“返回”的字樣,這樣我們不需要在填寫(xiě)提示后返回的頁(yè)面。 Showmessage 會(huì)自動(dòng)生成返回上一頁(yè)的連接。

代碼如下:

以下為引用的內(nèi)容:
$starttime = strtotime($startdate) date('Z') - ($timeoffset 3600);
$endtime = strtotime($enddate) date('Z') - ($timeoffset 3600);
if($startdate $enddate) {
showmessage('開(kāi)始時(shí)間大于結(jié)束,請(qǐng)返回修改');
} elseif($timestamp $starttime) {
showmessage('活動(dòng)還沒(méi)開(kāi)始,請(qǐng)返回');
} elseif($timestamp $endtime) {
showmessage('活動(dòng)已經(jīng)結(jié)束了', 'index.php');
}

這段代碼主要是對(duì)抽獎(jiǎng)這個(gè)活動(dòng)開(kāi)始和結(jié)束時(shí)間做了計(jì)算,把標(biāo)準(zhǔn)時(shí)間格式轉(zhuǎn)換為 UNIX 時(shí)間戳。并對(duì)開(kāi)始結(jié)束時(shí)間和當(dāng)前時(shí)間做比較,返回一些錯(cuò)誤情況的提示信息。

代碼如下:

以下為引用的內(nèi)容:
$query = $db-query(SELECT COUNT(uid) as joinnum, SUM(credits) as credits
FROM {$tablepre}luck);
$total = $db-fetch_array($query);
$query = $db-query(SELECT count, credits FROM {$tablepre}luck WHERE uid='$discuz_uid');
if($luck = $db-fetch_array($query)) {
$update = 1;
} else {
$update = 0;
}
$remaincount = $joincount - $luck['count'];
$remaincount = $remaincount 0 $remaincount 0;

從這段開(kāi)始涉及到一些數(shù)據(jù)庫(kù)的查詢(xún),以及根據(jù)查詢(xún)情況進(jìn)行一些變量的賦值。例如其中的這句。

代碼如下:

以下為引用的內(nèi)容:
$query = $db-query(SELECT COUNT(uid) as joinnum, SUM(credits) as credits
FROM {$tablepre}luck);
$total = $db-fetch_array($query);

就是取一下當(dāng)前抽獎(jiǎng)活動(dòng)參與的任務(wù)和送出的總獎(jiǎng)金數(shù),并將這個(gè)結(jié)果生成數(shù)組放到$total 里面。

代碼如下:

以下為引用的內(nèi)容:
if(!submitcheck('lucksubmit', 1)) {
$query = $db-query(SELECT l.credits, l.uid, m.username
FROM {$tablepre}luck l
LEFT JOIN {$tablepre}members m ON m.uid=l.uid
ORDER BY l.credits DESC LIMIT 0, 10);
while($top = $db-fetch_array($query)) {
$toplist[] = $top;
}
include template('luck');
} else {
if($luck['count'] $joincount) {
$query = $db-query(SELECT regdate, posts, digestposts, oltime
FROM {$tablepre}members WHERE uid='$discuz_uid');
$member = $db-fetch_array($query);
$regday = intval(($timestamp - $member['regdate']) 86400);
$lucknum = ($member['digestposts'] 15 $member['post'] 10 $member['oltime'] 5
$regday 5) 100;
$mostcredit = $lucknum $maxcredit $maxcredit intval($lucknum);
$mostcredit = $mostcredit $mincredit $mostcredit $mincredit;
$finalcredit = rand($mincredit, $mostcredit);
$db-query(UPDATE {$tablepre}members SET extcredits$getcredit=extcredits$getcredit
'$finalcredit' WHERE uid='$discuz_uid');
if($update) {
$db-query(UPDATE {$tablepre}luck SET count=count 1, credits=credits '$finalcredit'
WHERE uid='$discuz_uid');
} else {
$db-query(INSERT INTO {$tablepre}luck (uid, count, credits) VALUES ('$discuz_uid', '1',
'$finalcredit'), 'UNBUFFERED');
}
showmessage('恭喜你獲得'.$finalcredit.$extcredits[$getcredit]['title'], 'luck.php');
} else {
showmessage('每人只有'.$joincount.'次抽獎(jiǎng)機(jī)會(huì),做人不要太貪心啊!', dreferer());
}
}

這段代碼比較長(zhǎng)我們把它分為兩部分講解, else 前面為一部分,后面會(huì)一部分。 else前面的部分是當(dāng) !submitcheck('lucksubmit', 1) 這個(gè)條件不滿(mǎn)足的時(shí)候,也就是說(shuō)當(dāng)用戶(hù)沒(méi)有提交這個(gè)表單的時(shí)候,會(huì)進(jìn)行一次數(shù)據(jù)庫(kù)查詢(xún),并生成沒(méi)有提交前的界面。

這段代碼有兩點(diǎn)要注意,第一點(diǎn)就是 include template('luck'); 前面一段,這段是從cdb_luck 這個(gè)數(shù)據(jù)表中取得一些需要的數(shù)據(jù),首先生成一個(gè)數(shù)組,然后再把這個(gè)數(shù)組,循環(huán)寫(xiě)到 $toplist[] 這個(gè)數(shù)組中,最終形成了一個(gè)多維數(shù)組,這個(gè)數(shù)組會(huì)在下面的生成模板中生成列表用,其中的 include template('luck'); 就是用 templatesdefaultluck.htm 這個(gè)模板生成頁(yè)面的語(yǔ)句。

else 后面的部分主要是當(dāng)用戶(hù)點(diǎn)擊提交按鈕后,系統(tǒng)自動(dòng)判斷提交請(qǐng)求是否合法,當(dāng)判斷確實(shí)合法后會(huì)通過(guò)一系列的計(jì)算,計(jì)算出該用戶(hù)獲得的分值,并寫(xiě)入對(duì)應(yīng)的 member 數(shù)據(jù)表中。并返回成功或者失敗信息。

這個(gè)插件的 PHP 部分就講完了,下面我來(lái)簡(jiǎn)單講一下模板和數(shù)據(jù)庫(kù)部分。

模板文件上面已經(jīng)說(shuō)過(guò)了,一般會(huì)放在 templatesdefault 目錄下,這個(gè)插件也不例外。插件的模板和論壇的模板是一樣的,大部分都是由 html 代碼組成的,這里我就不多講了。重點(diǎn)我要講的時(shí)候模板中的一些 PHP 語(yǔ)法,了解 Discuz! 系統(tǒng)的人都知道模板在使用前會(huì)經(jīng)過(guò)論壇系統(tǒng)自帶的一個(gè)模板處理函數(shù)進(jìn)行編譯,生成一個(gè) PHP 文件,放在緩存目錄下,所以在 Discuz! 模板中就會(huì)有一些 PHP 的語(yǔ)法,不過(guò)這些語(yǔ)法都是一些比較簡(jiǎn)單的。在這個(gè)插件里面就用帶了一些,下面我和大家具體說(shuō)說(shuō)。

其中最常用的就是 if 語(yǔ)句,在模板中的寫(xiě)法是這樣的:

代碼如下:

以下為引用的內(nèi)容:
!--{if 變量名稱(chēng)}--顯示模板!--{else}--顯示模板!--{if}--

這個(gè)和 PHP 的 if 語(yǔ)法和用作是一樣的,支持 else 和 elseif 這個(gè)是 Discuz! 模板中最常用的一個(gè),也是今后大家做插件模板中最常用到的。

第二個(gè)常用到的模板語(yǔ)句: loop ,書(shū)寫(xiě)格式如下


代碼如下:

以下為引用的內(nèi)容:
!--{loop 數(shù)組名稱(chēng) key 值 元素名稱(chēng)}--!--{loop}--

這個(gè)和PHP里面的foreach語(yǔ)法和作用是一樣的,主要用于在模板中配合一些 html里面的trli之類(lèi)的語(yǔ)句,生成一些列表樣式的頁(yè)面,比如上文中提到的 $toplist[] 數(shù)組,在程序中被賦值后,在模板中通過(guò) loop 循環(huán)配合trtdtdtr就生成了一個(gè)排行榜的頁(yè)面。這個(gè)模板語(yǔ)句也是用得比較多的一個(gè)

當(dāng)然模板中還可以用一些其他 PHP 的語(yǔ)句,例如 eval 等,特別要提的還有就是在每個(gè)插件里面都會(huì)用到的 {template header} 、 {template footer} 這兩個(gè)雖然沒(méi)有對(duì)應(yīng)的 PHP 語(yǔ)句,不過(guò)對(duì)應(yīng)的是前文提到的 template 這個(gè)論壇自定義函數(shù),這個(gè)函數(shù)的作用主要是引用其他模板,在這里主要引用的是,論壇的 header 和 footer 模板。同時(shí)這個(gè)語(yǔ)句還可以引用其他模板,用法為 {template 模板文件名前綴} 。

模板部分就說(shuō)這么多了,其實(shí)只要知道了這些,一些專(zhuān)門(mén)做 html 不懂 PHP 的人稍加學(xué)習(xí)也可以做 Discuz! 的模板了。

模板和文件說(shuō)完了,最后來(lái)說(shuō)說(shuō)這個(gè)插件的數(shù)據(jù)庫(kù),前面已經(jīng)說(shuō)到了一些插件數(shù)據(jù)庫(kù)的基本要求,下面結(jié)合這個(gè)插件具體說(shuō)說(shuō),首先在設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,要想明白這個(gè)數(shù)據(jù)庫(kù)要記錄那些東西,這些東西是字符串類(lèi)型還是數(shù)字類(lèi)型,如果是字符串類(lèi)型的最大長(zhǎng)度是多少,如果是數(shù)字類(lèi)型的最大和最小值又是多少,那些字段是可以共用的。

結(jié)合這個(gè)插件我的數(shù)據(jù)庫(kù)是這么設(shè)計(jì),需要三個(gè)字段 uid 用于存放參與抽獎(jiǎng)用戶(hù)的 uid ,最大值和論壇用戶(hù)表一致,為 mediumint(8) unsigned 。 count 參與抽獎(jiǎng)的次數(shù),一般有 255 次就夠了,所以設(shè)計(jì)成 tinyint(1) unsigned 。最后一個(gè)就是 credits 獲得積分,這個(gè)也和論壇數(shù)據(jù)字段一致 int(10) unsigned ,字段設(shè)計(jì)好了,下面開(kāi)始設(shè)計(jì)索引。

索引主要是為了讓數(shù)據(jù)查詢(xún)更快,盡可能少占用 mysql 資源,所以在設(shè)計(jì)時(shí)候首先要想一下我們需要查詢(xún)數(shù)據(jù)表里面那些數(shù)據(jù),哪些是我們經(jīng)常查的。以這個(gè)插件為例我們經(jīng)常要查的就是兩個(gè)字段,一個(gè)是 uid 和 credits ,因?yàn)槊看斡脩?hù)抽獎(jiǎng)的時(shí)候我們都要查這個(gè)用戶(hù)參與了幾次抽獎(jiǎng),獲得多少積分,所以肯定要根據(jù)用戶(hù)的 uid 進(jìn)行查詢(xún),所以首先我們將 uid設(shè)計(jì)為主鍵,同時(shí)還考慮到我們還要計(jì)算所有用戶(hù)的總共獲得的分?jǐn)?shù),所以我們把 credits 設(shè)置為索引,這樣以來(lái)基本上就可以滿(mǎn)足我們的需要了。當(dāng)然索引的設(shè)計(jì)是一門(mén)學(xué)問(wèn),可能在設(shè)計(jì)過(guò)程中還會(huì)遇到一些問(wèn)題,比如聯(lián)合索引,索引優(yōu)化等等。但是只要你把你要查詢(xún)的語(yǔ)句想清楚,設(shè)計(jì)索引也不是一件很困難的事情。

關(guān)于索引設(shè)置的數(shù)量的問(wèn)題,如果設(shè)置的數(shù)量過(guò)多,將會(huì)大大影響數(shù)據(jù)寫(xiě)入的速度,所以在設(shè)計(jì)索引的時(shí)候還要想清楚,所設(shè)計(jì)的這個(gè)數(shù)據(jù)表寫(xiě)操作和讀操作那個(gè)更多,如果寫(xiě)操作比較頻繁索引一定不要設(shè)置過(guò)多,否則會(huì)事倍功半的。

根據(jù)上面的這些東西,最終我設(shè)計(jì)成數(shù)據(jù)表導(dǎo)出 SQL 語(yǔ)句如下

代碼如下:

以下為引用的內(nèi)容:
CREATE TABLE `cdb_luck` (
`uid` mediumint(8) unsigned NOT NULL,
`count` tinyint(1) unsigned NOT NULL default '0',
`credits` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`uid`),
KEY `credits` (`credits`)
) TYPE=MyISAM;

到此為止,一個(gè)插件的所有內(nèi)容就完成了,當(dāng)然如果你是一個(gè)追求完美的人可能還要給插件做上后臺(tái)以及安裝界面,接下來(lái)的時(shí)候就是來(lái) www.discuz.net 的插件區(qū)發(fā)布了。怎么樣,還不算很復(fù)雜吧,我這里只能從技術(shù)上告訴大家,至于你的插件能不能受到大家的喜愛(ài)還要一個(gè)很重要的東西就是創(chuàng)意,別人能想到的東西你能想到,別人想不到的東西你也能想到,這樣你的插件才能受到大家的喜愛(ài)。

本次就談到這里,如果你還有什么問(wèn)題,可以到 www.discuz.net 上找我。希望所有人都能做出讓大家喜愛(ài)的插件,謝謝!

來(lái)源:模板無(wú)憂(yōu)//所屬分類(lèi):PHP教程/更新時(shí)間:2008-08-22
相關(guān)PHP教程