- 您的當(dāng)前位置: 網(wǎng)站首頁 ? 服務(wù)支持 ? 常見問題 ? 成品網(wǎng)站 ? 怎樣開發(fā)插件、發(fā)布插件資源
- ***
問: | 怎樣開發(fā)插件、發(fā)布插件資源 |
答: |
一、插件的程序文件和數(shù)據(jù)表簡介 軟件采用模塊化結(jié)構(gòu),每個(gè)模塊的前后臺(tái)程序、模板都放在單獨(dú)得模塊目錄下,例如:文章模塊的目錄是news,該目錄下包含了文章管理后臺(tái)(admin)、插件目錄(module)、模板目錄(templates)等,各模塊目錄名的介紹請(qǐng)參考《軟件文件系統(tǒng)結(jié)構(gòu)說明》,本文主要介紹插件開發(fā)相關(guān)的程序結(jié)構(gòu)。 每個(gè)插件由一個(gè)插件程序、一個(gè)默認(rèn)模板、一條插件參數(shù)數(shù)據(jù)記錄等三個(gè)元素構(gòu)成。我們以“文章列表”插件為例,說明插件的文件和數(shù)據(jù)結(jié)構(gòu)?!拔恼铝斜怼辈寮绦蚴谴娣旁趎ews/module/目錄中NewsList.php;插件的默認(rèn)模板是news/templates/目錄中的tpl_newslist.htm;插件記錄存放在數(shù)據(jù)表“_base_plusdefault ”中,每個(gè)插件一條記錄,記錄了該插件的參數(shù),其中pluslable字段的值就是該插件的標(biāo)簽名,文章列表的pluslable是modNewsList。其中的規(guī)則是,pluslable標(biāo)簽名去掉前面的“mod”,就是插件的程序文件名,程序依據(jù)此規(guī)則找到插件程序并運(yùn)行。 另外: _base_plus數(shù)據(jù)表記錄了每個(gè)頁面上插入了那些插件、插件的位置、顯示參數(shù)等信息 _base_plustemp數(shù)據(jù)表記錄了插件的擴(kuò)展模板 二、插件記錄表_base_plusdefault結(jié)構(gòu)說明 每個(gè)插件在_base_plusdefault數(shù)據(jù)表中有一條記錄,該記錄決定了插件允許插入在哪些頁面、有哪些參數(shù)可以設(shè)置、默認(rèn)的設(shè)置參數(shù)是什么等信息。插件參數(shù)設(shè)置是和插件程序相配合的,設(shè)置了哪些可選項(xiàng)目,就要在程序中進(jìn)行判斷并正確體現(xiàn)出來。各字段說明如下: id 自增量ID,新增插件記錄時(shí)自動(dòng)產(chǎn)生,無需特別指定 coltype 插件的來源模塊代碼(如:news),根據(jù)此值尋找插件程序和模板文件的位置 pluslable 唯一的插件標(biāo)簽名,不可重名,和插件程序文件名稱對(duì)應(yīng),如modNewsList plusname 插件的中文名,考慮到排版時(shí)在插件管理面板顯示完整,一般不要超過16個(gè)字符 plustype 允許在哪些模塊使用該插件,all表示該插件可以在全站所有模塊使用 pluslocat 允許在哪些頁面使用該插件,all表示全部頁面;和plustype配合用以規(guī)定插件的可用范圍 tempname 插件的默認(rèn)模板文件名(擴(kuò)展模板則記錄在_base_plustemp表中) tempcolor 插件的默認(rèn)顏色方案編號(hào)。除了導(dǎo)航菜單可選配色方案,其他插件均填-1,即不可選配色方案;程序支持所有插件均可選配色方案,但是這樣做將使插件模板開發(fā)增加15倍工作量,故暫時(shí)只有導(dǎo)航菜單使用了這一機(jī)制 showborder 插件默認(rèn)選用的邊框編號(hào)。A001代表001號(hào)邊框模板,配色代號(hào)為A(配色編號(hào)從A-P共16種顏色,可以填寫B(tài)001、P001等,但不推薦);1000表示自定義邊框,如果插件默認(rèn)不顯示邊框,可在此填寫1000,并將borderwidth填為0。 bordercolor 自定義邊框的顏色,僅在showborder為1000自定義邊框時(shí)有效 borderwidth 自定義邊框的寬度,僅在showborder為1000自定義邊框時(shí)有效 borderstyle 邊框的樣式,solid表示實(shí)線,dotted表示點(diǎn)狀,dashed表示虛線... borderlable 用于標(biāo)簽式邊框填寫被控插件編號(hào),默認(rèn)記錄不要填任何內(nèi)容 borderroll 用于標(biāo)簽式邊框的切換方式,默認(rèn)記錄不要填任何內(nèi)容 showbar 自定義邊框是否顯示插件標(biāo)題欄,僅在showborder為1000自定義邊框時(shí)有效 barbg 自定義邊框的標(biāo)題欄背景色,僅在showborder為1000自定義邊框時(shí)有效 barcolor 自定義邊框的標(biāo)題欄文字色,僅在showborder為1000自定義邊框時(shí)有效 backgroundcolor 自定義邊框的背景色,僅在showborder為1000自定義邊框時(shí)有效 morelink 默認(rèn)的更多鏈接,填-1表示不可設(shè)置更多鏈接 width 插件默認(rèn)的寬度,根據(jù)插件的理想顯示尺寸填寫 height 插件的默認(rèn)高度,根據(jù)插件的理想顯示尺寸填寫 top 插件的頂邊距,是相對(duì)于容器的頂邊距,一般填0,方便用戶在同一位置找到新插入的插件 left 插件的左邊距,是相對(duì)于容器的左邊距,一般填0, zindex 插件的Z軸位置,一般填寫99,使插件插入時(shí)位于其他插件的前方 padding 插件邊框的內(nèi)邊距,即邊框和內(nèi)容之間的距離 shownums 內(nèi)容默認(rèn)顯示條數(shù),如不可控制內(nèi)容條數(shù),填-1 ord 內(nèi)容的排序參數(shù),根據(jù)插件來源數(shù)據(jù)表可提供排序的參數(shù),以“|”分割,如不允許設(shè)置,填-1 sc 內(nèi)容的排序方法,asc或desc,如不允許設(shè)置,填-1 showtj 是否只顯示推薦內(nèi)容,1表示默認(rèn)選中“只顯示推薦內(nèi)容”,0表示不規(guī)定是否顯示推薦內(nèi)容,如果不可設(shè)置是否顯示推薦內(nèi)容,填-1 cutword 內(nèi)容標(biāo)題截取文字,填數(shù)字,不可設(shè)置時(shí)填-1 target 鏈接打開方式,_self或_blank,不可設(shè)置時(shí)填-1 catid 默認(rèn)選擇的分類id,用于選擇內(nèi)容的顯示分類。當(dāng)該值不是-1時(shí),必須在classtbl字段中填如對(duì)應(yīng)的數(shù)據(jù)表名,該數(shù)據(jù)表的結(jié)構(gòu)必須符合PHPWEB的catpath分類方法,如文章、下載分類等均按此標(biāo)準(zhǔn)規(guī)劃分類。 cutbody 內(nèi)容截取字?jǐn)?shù),一般配合程序截取body,memo等字段,不可設(shè)置時(shí)填-1 picw 縮圖寬度,一般用于圖片展示等插件,不可設(shè)置時(shí)填-1 pich 縮圖高度,一般用于圖片展示等插件,不可設(shè)置時(shí)填-1 fittype 縮圖的默認(rèn)自適應(yīng)方法,填fill或不可設(shè)置時(shí)填-1 title 默認(rèn)的插件標(biāo)題 body 在插件設(shè)置時(shí)可直接輸入html編輯內(nèi)容,-1為不可填 pic 在插件設(shè)置時(shí)可直接上傳圖片,-1為不可上傳圖片 piclink 在插件設(shè)置時(shí)可直接上傳圖片的配套鏈接,-1為不可填 attach 在插件設(shè)置時(shí)可直接上傳文件,-1為不可上傳文件 movi 在插件設(shè)置時(shí)可填寫視頻來源網(wǎng)址,-1為不可填 sourceurl 在插件設(shè)置時(shí)可填寫其他來源網(wǎng)址,-1為不可填 word、word1、word2、word3、word4、text、text1、link、link1、link2、link3、link4 這些字段用于自定義內(nèi)容模塊中的組合內(nèi)容插件,一般不使用,填-1 code 用于輸入代碼,不可輸入填-1 tags 為空時(shí)可設(shè)置匹配標(biāo)簽,-1時(shí)不可設(shè)置 groupid 用于選擇分組,如友情鏈接、廣告組等插件,填-1時(shí)不可選擇分組 projid 用于選擇專題,如文章列表插件,填-1時(shí)不可選擇專題 moveable 預(yù)留字段,全部填1 classtbl 對(duì)應(yīng)catid的分類數(shù)據(jù)表名 grouptbl 對(duì)應(yīng)groupid的分組數(shù)據(jù)表名 projtbl 對(duì)應(yīng)projid的專題數(shù)據(jù)表名 setglobal 是否允許全站同時(shí)插入插件,1為可同時(shí)插入,0為不可同時(shí)插入。注意事項(xiàng):一般只能允許每頁只可插入一個(gè)的插件進(jìn)行全站同時(shí)插入,否則會(huì)弄亂頁面 overflow 內(nèi)容溢出是是否自動(dòng)增加高度,對(duì)于可預(yù)知高度的應(yīng)設(shè)為hidden,不可預(yù)知高度得設(shè)為visible bodyzone 插件默認(rèn)插入的容器,可選填top、content、bottom display 預(yù)留字段,填1 ifmul 一個(gè)頁面中是否允許多次插入本插件,注意插入多個(gè)會(huì)產(chǎn)生互相沖突的一般應(yīng)設(shè)為0 ifrefresh 插入插件后是否刷新頁面,一般帶js的插件應(yīng)設(shè)為1,需要刷新后才能看到效果,普通插件設(shè)為0 重要提示:插件記錄表默認(rèn)參數(shù)的設(shè)置屬于開發(fā)范疇,所設(shè)置的參數(shù)必須進(jìn)行對(duì)應(yīng)的程序開發(fā)才能體現(xiàn),非程序開發(fā)人員切勿在數(shù)據(jù)表中隨意更改已有插件的參數(shù),否則可能導(dǎo)致程序出錯(cuò)! 三、插件程序開發(fā) 在規(guī)劃好一個(gè)插件應(yīng)該按什么樣的規(guī)則顯示、有哪些參數(shù)可以設(shè)置后,就可以進(jìn)行插件程序開發(fā)了。插件程序的作用就是按可選參數(shù)設(shè)置,將內(nèi)容取出來,交給模板顯示內(nèi)容。接下來以“文章列表”插件為例,說明插件程序的開發(fā)方法: <?php /* [插件名稱] 最新文章列表 [適用范圍] 全站 */ function NewsList(){ #插件程序文件名和插件函數(shù)同名 global $fsql,$msql; #全局?jǐn)?shù)據(jù)庫連接類 $coltitle=$GLOBALS["PLUSVARS"]["coltitle"]; $shownums=$GLOBALS["PLUSVARS"]["shownums"]; $ord=$GLOBALS["PLUSVARS"]["ord"]; $sc=$GLOBALS["PLUSVARS"]["sc"]; $showtj=$GLOBALS["PLUSVARS"]["showtj"]; $cutword=$GLOBALS["PLUSVARS"]["cutword"]; $cutbody=$GLOBALS["PLUSVARS"]["cutbody"]; $target=$GLOBALS["PLUSVARS"]["target"]; $catid=$GLOBALS["PLUSVARS"]["catid"]; $projid=$GLOBALS["PLUSVARS"]["projid"]; $tags=$GLOBALS["PLUSVARS"]["tags"]; $pagename=$GLOBALS["PLUSVARS"]["pagename"]; $tempname=$GLOBALS["PLUSVARS"]["tempname"]; #以上讀入插件設(shè)置參數(shù),在插件記錄表中允許設(shè)置的項(xiàng)目,必須將設(shè)置參數(shù)讀入,在程序中對(duì)參數(shù)進(jìn)行判斷;在插件記錄表中設(shè)置為-1的字段,絕對(duì)不要在這里引入或判斷。這是因?yàn)楫?dāng)記錄值為-1時(shí),插件設(shè)置窗口將不顯示該參數(shù)的設(shè)置,用戶看不到,但程序一旦解釋了,該值就是-1,會(huì)使運(yùn)行結(jié)果和預(yù)期的不一樣。 //地址欄參數(shù) if($pagename=="query" && strstr($_SERVER["QUERY_STRING"],".html")){ $Arr=explode(".html",$_SERVER["QUERY_STRING"]); $nowcatid=$Arr[0]; }elseif($_GET["catid"]>0){ $nowcatid=$_GET["catid"]; }else{ $nowcatid=0; } #文章列表插件中根據(jù)插件插入的不同地方,判斷當(dāng)前頁面的分類id,以求根據(jù)頁面自動(dòng)顯示當(dāng)前分類下的文章。 #默認(rèn)查詢條件 $scl=" iffb=1 and catid!=0 "; #如果插件設(shè)置了只顯示推薦,則只取tj=1的數(shù)據(jù) if($showtj!="" && $showtj!="0"){ $scl.=" and tj=1 "; } #顯示分類規(guī)則:如果插件設(shè)置時(shí)未指定分類,則顯示當(dāng)前所在分類,否則不限分類 if($catid!=0 && $catid!=""){ $catid=fmpath($catid); $scl.=" and catpath regexp $catid "; }elseif($nowcatid!=0 && $nowcatid!=""){ $catid=fmpath($nowcatid); $scl.=" and catpath regexp $nowcatid "; } #匹配專題,如果插件設(shè)置中選擇了只顯示某個(gè)專題的文章,則只獲取匹配某專題的數(shù)據(jù) if($projid!=0 && $projid!=""){ $projid=fmpath($projid); $scl.=" and proj regexp $projid "; } #判斷匹配標(biāo)簽,如果插件設(shè)置中填寫了匹配標(biāo)簽,只獲取匹配的記錄 if($tags!=""){ $tags=$tags.","; $scl.=" and tags regexp $tags "; } #模版解釋,讀入插件模板,將插件模板中的代碼按<!- ->標(biāo)簽進(jìn)行分離,存入數(shù)組 #例如<!-start->和<!-start->之間的內(nèi)容,就是$TempArr["start"],依此類推 $Temp=LoadTemp($tempname); $TempArr=SplitTblTemp($Temp); #首先將模板的start部分需要的顯示的變量替換給模板 $var=array( coltitle => $coltitle, morelink => $morelink ); $str=ShowTplTemp($TempArr["start"],$var); #開始循環(huán),按條件取出文章 $picnum=1; $fsql->query("select * from pw_news_con where $scl order by $ord $sc limit 0,$shownums"); while($fsql->next_record()){ $id=$fsql->f(id); $title=$fsql->f(title); $catpath=$fsql->f(catpath); $dtime=$fsql->f(dtime); $nowcatid=$fsql->f(catid); $ifnew=$fsql->f(ifnew); $ifred=$fsql->f(ifred); $ifbold=$fsql->f(ifbold); $author=$fsql->f(author); $source=$fsql->f(source); $cl=$fsql->f(cl); $src=$fsql->f(src); $cl=$fsql->f(cl); $fileurl=$fsql->f(fileurl); $downcount=$fsql->f(downcount); $prop1=$fsql->f(prop1); $prop2=$fsql->f(prop2); $prop3=$fsql->f(prop3); $prop4=$fsql->f(prop4); $prop5=$fsql->f(prop5); $prop6=$fsql->f(prop6); $prop7=$fsql->f(prop7); $prop8=$fsql->f(prop8); $prop9=$fsql->f(prop9); $prop10=$fsql->f(prop10); $prop11=$fsql->f(prop11); $prop12=$fsql->f(prop12); $prop13=$fsql->f(prop13); $prop14=$fsql->f(prop14); $prop15=$fsql->f(prop15); $prop16=$fsql->f(prop16); $prop17=$fsql->f(prop17); $prop18=$fsql->f(prop18); $prop19=$fsql->f(prop19); $prop20=$fsql->f(prop20); $memo=$fsql->f(memo); $mid=$fsql->f(memberid); #對(duì)取出的數(shù)據(jù)進(jìn)行一系列判斷,取出在該插件中可能被顯示的數(shù)據(jù) if($mid>0){ $memberurl=ROOTPATH."member/home.php?mid=".$mid; }else{ $memberurl="#"; } if($GLOBALS["CONF"]["CatchOpen"]=="1" && file_exists(ROOTPATH."news/html/".$id.".html")){ $link=ROOTPATH."news/html/".$id.".html"; }else{ $link=ROOTPATH."news/html/?".$id.".html"; } $dtime=date("m/d",$dtime); if($ifbold=="1"){$bold=" style=font-weight:bold ";}else{$bold="";} if($ifred!="0"){$red=" style=color:".$ifred." ";}else{$red="";} if($cutword!="0"){$title=csubstr($title,0,$cutword);} if($cutbody!="0"){$memo=csubstr($memo,0,$cutbody);} if($src==""){$src="news/pics/nopic.gif";} $src=ROOTPATH.$src; $downurl=ROOTPATH."news/download.php?id=".$id; //顯示所屬分類 $msql->query("select cat from pw_news_cat where catid=$nowcatid"); if($msql->next_record()){ $cat=$msql->f(cat); } //參數(shù)列 $i=1; $msql->query("select * from pw_news_prop where catid=$nowcatid order by xuhao"); while($msql->next_record()){ $pn="propname".$i; $$pn=$msql->f(propname); $i++; } #模版標(biāo)簽解釋,將數(shù)據(jù)解釋給模板 $var=array ( title => $title, memo => $memo, dtime => $dtime, red => $red, bold => $bold, link => $link, target => $target, author => $author, source => $source, cat => $cat, src => $src, cl => $cl, memberurl => $memberurl, picnum => $picnum, downurl => $downurl, fileurl => $fileurl, downcount => $downcount, prop1 => $prop1, prop2 => $prop2, prop3 => $prop3, prop4 => $prop4, prop5 => $prop5, prop6 => $prop6, prop7 => $prop7, prop8 => $prop8, prop9 => $prop9, prop10 => $prop10, prop11 => $prop11, prop12 => $prop12, prop13 => $prop13, prop14 => $prop14, prop15 => $prop15, prop16 => $prop16, prop17 => $prop17, prop18 => $prop18, prop19 => $prop19, prop20 => $prop20, propname1 => $propname1, propname2 => $propname2, propname3 => $propname3, propname4 => $propname4, propname5 => $propname5, propname6 => $propname6, propname7 => $propname7, propname8 => $propname8, propname9 => $propname9, propname10 => $propname10, propname11 => $propname11, propname12 => $propname12, propname13 => $propname13, propname14 => $propname14, propname15 => $propname15, propname16 => $propname16, propname17 => $propname17, propname18 => $propname18, propname19 => $propname19, propname20 => $propname20 ); $str.=ShowTplTemp($TempArr["list"],$var); $picnum++; } #循環(huán)結(jié)束,將模板的結(jié)尾部分,即<!-end->標(biāo)簽之間的內(nèi)容加入$str,最后返回$str,$str的內(nèi)容將被完整顯示。 $str.=$TempArr["end"]; return $str; } ?> 四、插件默認(rèn)模板制作 以“文章列表”插件的默認(rèn)模板tpl_newslist.htm為例,源碼如下: <!-start-> <link href="css/newslist.css" rel="stylesheet" type="text/css" /> <ul class="newslist"> <!-start-> <!-list-> <li class="newslist"><a href="{ # link # }" target="{ # target # }" class="newslist" { # bold # } { # red # } >{ # title # }</a></li> <!-list-> <!-end-> </ul> <!-end-> 插件模板一般具有開始部分、循環(huán)部分、結(jié)束部分,可根據(jù)顯示的需要,將內(nèi)容放在合適的位置。如果插件中需要進(jìn)行多個(gè)循環(huán),或加入其它內(nèi)容,除了這些標(biāo)簽外,還可以使用以下標(biāo)簽: <!-m1-><!-m1-> <!-m2-><!-m2-> <!-m3-><!-m3-> <!-menu-><!-menu-> <!-text-><!-text-> <!-rowstart-><!-rowstart-> <!-rowend-><!-rowend-> <!-con-><!-con-> 實(shí)際上,標(biāo)簽的作用是讓程序把其中的內(nèi)容加入到數(shù)組元素中,而循環(huán)是在程序中進(jìn)行的。例如<!-menu-><!-menu->之間的內(nèi)容在被加入到數(shù)組后就是$TempArr["menu"],在程序中可以將其中的內(nèi)容進(jìn)行判斷,輸出需要的數(shù)據(jù)。 文章列表插件是所有插件中設(shè)置參數(shù)最多,也是比較復(fù)雜的插件。學(xué)習(xí)插件開發(fā),可以從簡單的開始。比如你可以嘗試只從數(shù)據(jù)庫中取出一條數(shù)據(jù),通過插件+模板將其顯示出來,然后逐步深入研究插件開發(fā)。你也可以通過研究學(xué)習(xí)現(xiàn)有的插件,通過修改現(xiàn)有插件來逐步熟悉插件的開發(fā)。 五、插件資源包制作方法 插件可以打包發(fā)布到PHPWEB資源分享區(qū),分享插件賺?。袔?。 如果你希望發(fā)布自己制作的插件,建議你給插件的命名帶有自己的英文網(wǎng)名,以避免插件重名。例如你自己制作的特色文章列表插件,可以是MyNameNewsList.php,pluslable是modMyNameNewsList.。 插件打包時(shí)應(yīng)按原來的文件結(jié)構(gòu),從模塊目錄開始,按實(shí)際目錄存放文件,方便用戶了解文件的上傳位置。還要在后臺(tái)“模塊插件設(shè)置”中,將此插件的記錄導(dǎo)出為.dat文件,一起打包。 初次制作插件資源包,建議先自己測試一次插件安裝過程,以保證插件資源包的正確。 秦皇島炎黃科技網(wǎng)絡(luò)工作室 為您提供優(yōu)質(zhì)的 秦皇島成品網(wǎng)站 秦皇島網(wǎng)站制作 秦皇島網(wǎng)站建設(shè)服務(wù) |
問題沒解決? 在線咨詢 或致電:13785936100 |

致電 137 859 36100
7×24小時(shí)服務(wù)熱線



