可使用一品威客账号登录: 登录 立即注册
热搜: 活动 交友 discuz

怎样开发插件、发布插件资源

查看: 1349 | 回复: 0  峻险牛犊 发表于 2011-8-31 02:01:02

编辑采用
怎样开发插件、发布插件资源?
一、插件的程序文件和数据表简介



  软件采用模块化结构,每个模块的前后台程序、模板都放在单独得模块目录下,例如:文章模块的目录是news,该目录下包含了文章管理后台(admin)、插件目录(module)、模板目录(templates)等,,本文主要介绍插件开发相关的程序结构。
  每个插件由一个插件程序、一个默认模板、一条插件参数数据记录等三个元素构成。我们以“文章列表”插件为例,说明插件的文件和数据结构。“文章列表”插件程序是存放在news/module/目录中NewsList.php;插件的默认模板是news/templates/目录中的tpl_newslist.htm;插件记录存放在数据表“_base_plusdefault ”中,每个插件一条记录,记录了该插件的参数,其中pluslable字段的值就是该插件的标签名,文章列表的pluslable是modNewsList。其中的规则是,pluslable标签名去掉前面的“mod”,就是插件的程序文件名,程序依据此规则找到插件程序并运行。
  另外:

  _base_plus数据表记录了每个页面上插入了那些插件、插件的位置、显示参数等信息

  _base_plustemp数据表记录了插件的扩展模板


二、插件记录表_base_plusdefault结构说明



  每个插件在_base_plusdefault数据表中有一条记录,该记录决定了插件允许插入在哪些页面、有哪些参数可以设置、默认的设置参数是什么等信息。插件参数设置是和插件程序相配合的,设置了哪些可选项目,就要在程序中进行判断并正确体现出来。各字段说明如下:
id     自增量ID,新增插件记录时自动产生,无需特别指定

coltype  插件的来源模块代码(如:news),根据此值寻找插件程序和模板文件的位置

pluslable  唯一的插件标签名,不可重名,和插件程序文件名称对应,如modNewsList

plusname  插件的中文名,考虑到排版时在插件管理面板显示完整,一般不要超过16个字符

plustype  允许在哪些模块使用该插件,all表示该插件可以在全站所有模块使用

pluslocat  允许在哪些页面使用该插件,all表示全部页面;和plustype配合用以规定插件的可用范围

tempname  插件的默认模板文件名(扩展模板则记录在_base_plustemp表中)

tempcolor  插件的默认颜色方案编号。除了导航菜单可选配色方案,其他插件均填-1,即不可选配色方案;程序支持所有插件均可选配色方案,但是这样做将使插件模板开发增加15倍工作量,故暂时只有导航菜单使用了这一机制



showborder 插件默认选用的边框编号。A001代表001号边框模板,配色代号为A(配色编号从A-P共16种颜色,可以填写B001、P001等,但不推荐);1000表示自定义边框,如果插件默认不显示边框,可在此填写1000,并将borderwidth填为0。



bordercolor 自定义边框的颜色,仅在showborder为1000自定义边框时有效 

borderwidth 自定义边框的宽度,仅在showborder为1000自定义边框时有效

borderstyle边框的样式,solid表示实线,dotted表示点状,dashed表示虚线...

borderlable 用于标签式边框填写被控插件编号,默认记录不要填任何内容

borderroll  用于标签式边框的切换方式,默认记录不要填任何内容

showbar  自定义边框是否显示插件标题栏,仅在showborder为1000自定义边框时有效

barbg   自定义边框的标题栏背景色,仅在showborder为1000自定义边框时有效

barcolor  自定义边框的标题栏文字色,仅在showborder为1000自定义边框时有效

backgroundcolor 自定义边框的背景色,仅在showborder为1000自定义边框时有效

morelink    默认的更多链接,填-1表示不可设置更多链接

width     插件默认的宽度,根据插件的理想显示尺寸填写

height     插件的默认高度,根据插件的理想显示尺寸填写

top      插件的顶边距,是相对于容器的顶边距,一般填0,方便用户在同一位置找到新插入的插件

left      插件的左边距,是相对于容器的左边距,一般填0,

zindex     插件的Z轴位置,一般填写99,使插件插入时位于其他插件的前方

padding    插件边框的内边距,即边框和内容之间的距离

shownums   内容默认显示条数,如不可控制内容条数,填-1

ord      内容的排序参数,根据插件来源数据表可提供排序的参数,以“|”分割,如不允许设置,填-1

sc       内容的排序方法,asc或desc,如不允许设置,填-1

showtj     是否只显示推荐内容,1表示默认选中“只显示推荐内容”,0表示不规定是否显示推荐内容,如果不可设置是否显示推荐内容,填-1

cutword    内容标题截取文字,填数字,不可设置时填-1

target     链接打开方式,_self或_blank,不可设置时填-1

catid     默认选择的分类id,用于选择内容的显示分类。当该值不是-1时,必须在classtbl字段中填如对应的数据表名,该数据表的结构必须符合PHPWEB的catpath分类方法,如文章、下载分类等均按此标准规划分类。

cutbody   内容截取字数,一般配合程序截取body,memo等字段,不可设置时填-1

picw     缩图宽度,一般用于图片展示等插件,不可设置时填-1

pich     缩图高度,一般用于图片展示等插件,不可设置时填-1

fittype    缩图的默认自适应方法,填fill或不可设置时填-1

title   默认的插件标题

body     在插件设置时可直接输入html编辑内容,-1为不可填

pic      在插件设置时可直接上传图片,-1为不可上传图片

piclink在插件设置时可直接上传图片的配套链接,-1为不可填

attach     在插件设置时可直接上传文件,-1为不可上传文件

movi     在插件设置时可填写视频来源网址,-1为不可填

sourceurl   在插件设置时可填写其他来源网址,-1为不可填



word、word1、word2、word3、word4、text、text1、link、link1、link2、link3、link4

这些字段用于自定义内容模块中的组合内容插件,一般不使用,填-1



code 用于输入代码,不可输入填-1

tags为空时可设置匹配标签,-1时不可设置

groupid 用于选择分组,如友情链接、广告组等插件,填-1时不可选择分组

projid  用于选择专题,如文章列表插件,填-1时不可选择专题

moveable 预留字段,全部填1

classtbl  对应catid的分类数据表名

grouptbl  对应groupid的分组数据表名

projtbl  对应projid的专题数据表名



setglobal 是否允许全站同时插入插件,1为可同时插入,0为不可同时插入。注意事项:一般只能允许每页只可插入一个的插件进行全站同时插入,否则会弄乱页面



overflow 内容溢出是是否自动增加高度,对于可预知高度的应设为hidden,不可预知高度得设为visible

bodyzone插件默认插入的容器,可选填top、content、bottom

display 预留字段,填1

ifmul一个页面中是否允许多次插入本插件,注意插入多个会产生互相冲突的一般应设为0

ifrefresh  插入插件后是否刷新页面,一般带js的插件应设为1,需要刷新后才能看到效果,普通插件设为0


重要提示:插件记录表默认参数的设置属于开发范畴,所设置的参数必须进行对应的程序开发才能体现,非程序开发人员切勿在数据表中随意更改已有插件的参数,否则可能导致程序出错!


三、插件程序开发



  在规划好一个插件应该按什么样的规则显示、有哪些参数可以设置后,就可以进行插件开发了。插件程序的作用就是按可选参数设置,将内容取出来,交给模板显示内容。接下来以“文章列表”插件为例,说明插件程序的开发方法:
<?php
/*

[插件名称]最新文章列表

[适用范围]全站

*/
functionNewsList(){ #插件程序文件名和插件函数同名
global$fsql,$msql;  #全局数据库连接类
$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"];



#以上读入插件设置参数,在插件记录表中允许设置的项目,必须将设置参数读入,在程序中对参数进行判断;在插件记录表中设置为-1的字段,绝对不要在这里引入或判断。这是因为当记录值为-1时,插件设置窗口将不显示该参数的设置,用户看不到,但程序一旦解释了,该值就是-1,会使运行结果和预期的不一样。
//地址栏参数
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;

}

 

 #文章列表插件中根据插件插入的不同地方,判断当前页面的分类id,以求根据页面自动显示当前分类下的文章。
#默认查询条件

$scl="iffb='1'andcatid!='0'";
#如果插件设置了只显示推荐,则只取tj=1的数据
if($showtj!=""&&$showtj!="0"){

$scl.="andtj='1'";

}


#显示分类规则:如果插件设置时未指定分类,则显示当前所在分类,否则不限分类
if($catid!=0&&$catid!=""){

$catid=fmpath($catid);

$scl.="andcatpathregexp'$catid'";

}elseif($nowcatid!=0&&$nowcatid!=""){

$catid=fmpath($nowcatid);

$scl.="andcatpathregexp'$nowcatid'";

}
#匹配专题,如果插件设置中选择了只显示某个专题的文章,则只获取匹配某专题的数据

if($projid!=0&&$projid!=""){

$projid=fmpath($projid);

$scl.="andprojregexp'$projid'";

}
#判断匹配标签,如果插件设置中填写了匹配标签,只获取匹配的记录

if($tags!=""){

$tags=$tags.",";

$scl.="andtagsregexp'$tags'";

}
#模版解释,读入插件模板,将插件模板中的代码按<!-->标签进行分离,存入数组

#例如<!-start->和<!-start->之间的内容,就是$TempArr["start"],依此类推



$Temp=LoadTemp($tempname);

$TempArr=SplitTblTemp($Temp);
#首先将模板的start部分需要的显示的变量替换给模板
$var=array(

'coltitle'=>$coltitle,

'morelink'=>$morelink

);

$str=ShowTplTemp($TempArr["start"],$var);


#开始循环,按条件取出文章
$picnum=1;

$fsql->query("select*frompw_news_conwhere$sclorderby$ord$sclimit0,$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');
#对取出的数据进行一系列判断,取出在该插件中可能被显示的数据
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("selectcatfrompw_news_catwherecatid='$nowcatid'");

if($msql->next_record()){

$cat=$msql->f('cat');

}



//参数列

$i=1;

$msql->query("select*frompw_news_propwherecatid='$nowcatid'orderbyxuhao");

while($msql->next_record()){

$pn="propname".$i;

$$pn=$msql->f('propname');

$i++;

}
 #模版标签解释,将数据解释给模板
$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++;
}
#循环结束,将模板的结尾部分,即<!-end->标签之间的内容加入$str,最后返回$str,$str的内容将被完整显示。
$str.=$TempArr["end"];


return$str;
}
?>


四、插件默认模板制作
以“文章列表”插件的默认模板tpl_newslist.htm为例,源码如下:



<!-start->

<linkhref="css/newslist.css"rel="stylesheet"type="text/css"/>

<ulclass="newslist">

<!-start->

<!-list->

<liclass="newslist"><ahref="{#link#}"target="{#target#}"class="newslist"{#bold#}{#red#}>{#title#}</a></li>

<!-list->

<!-end->

</ul>

<!-end->
插件模板一般具有开始部分、循环部分、结束部分,可根据显示的需要,将内容放在合适的位置。如果插件中需要进行多个循环,或加入其它内容,除了这些标签外,还可以使用以下标签:

<!-m1-><!-m1->

<!-m2-><!-m2->

<!-m3-><!-m3->

<!-menu-><!-menu->

<!-text-><!-text->

<!-rowstart-><!-rowstart->

<!-rowend-><!-rowend->

<!-con-><!-con->

实际上,标签的作用是让程序把其中的内容加入到数组元素中,而循环是在程序中进行的。例如<!-menu-><!-menu->之间的内容在被加入到数组后就是$TempArr["menu"],在程序中可以将其中的内容进行判断,输出需要的数据。



文章列表插件是所有插件中设置参数最多,也是比较复杂的插件。学习插件开发,可以从简单的开始。比如你可以尝试只从数据库中取出一条数据,通过插件+模板将其显示出来,然后逐步深入研究插件开发。你也可以通过研究学习现有的插件,通过修改现有插件来逐步熟悉插件的开发。


五、插件资源包制作方法



插件可以打包发布到PHPWEB资源分享区,分享插件赚取P币。

如果你希望发布自己制作的插件,建议你给插件的命名带有自己的英文网名,以避免插件重名。例如你自己制作的特色文章列表插件,可以是MyNameNewsList.php,pluslable是modMyNameNewsList.。
插件打包时应按原来的文件结构,从模块目录开始,按实际目录存放文件,方便用户了解文件的上传位置。还要在后台“模块插件设置”中,将此插件的记录导出为.dat文件,一起打包。
初次制作插件资源包,建议先自己测试一次插件安装过程,以保证插件资源包的正确。


使用道具 举报

快速回复
登录后回帖,可以用一品威客账号登录 登录 | 立即注册

一品微博
一品活动
2024线上私享会
2024.3.21,一品威客2024创业领袖线上私享会将火热开播。
新粉福利社
【新粉福利社】新用户最高可领Apple iPad
最新主题热门主题


回顶部
关注
我们
官方微信 官方微博

微信号:epweike
已经有超过10万小伙伴关注了!
更多精彩好玩的活动敬请关注微信公众号

加为关注

微博账号:一品威客网
更多精彩互动尽在一品官方微博
小编期待您的参与