怎样开发插件、发布插件资源
更新日期:2010-07-23 14:49:49
一、插件的程序文件和数据表简介
软件采用模块化结构,每个模块的前后台程序、模板都放在单独得模块目录下,例如:文章模块的目录是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
重要提示:插件记录表默认参数的设置属于开发范畴,所设置的参数必须进行对应的程序开发才能体现,非程序开发人员切勿在数据表中随意更改已有插件的参数,否则可能导致程序出错!
三、插件程序开发
在规划好一个插件应该按什么样的规则显示、有哪些参数可以设置后,就可以进行插件程序开发了。插件程序的作用就是按可选参数设置,将内容取出来,交给模板显示内容。接下来以“文章列表”插件为例,说明插件程序的开发方法:
0){ $nowcatid=$_GET["catid"]; }else{ $nowcatid=0; } **文章列表插件中根据插件插入的不同地方,判断当前页面的分类id,以求根据页面自动显示当前分类下的文章。 ** 默认查询条件 $scl=" iffb='1' and catid!='0' "; 如果插件设置了只显示推荐,则只取tj=1的数据 if($showtj!="" && $showtj!="0"){ $scl.=" and tj='1' "; } ** 显示分类规则:如果插件设置时未指定分类,则显示当前所在分类,否则不限分类** if($catid!=0 && $catid!=""){ $catid=fmpath($catid); $scl.=" and catpath regexp '$catid' "; }elseif($nowcatid!=0 && $nowcatid!=""){ $catid=fmpath($nowcatid); $scl.=" and catpath regexp '$nowcatid' "; } **匹配专题,如果插件设置中选择了只显示某个专题的文章,则只获取匹配某专题的数据** if($projid!=0 && $projid!=""){ $projid=fmpath($projid); $scl.=" and proj regexp '$projid' "; } **判断匹配标签,如果插件设置中填写了匹配标签,只获取匹配的记录** if($tags!=""){ $tags=$tags.","; $scl.=" and tags regexp '$tags' "; } 模版解释,读入插件模板,将插件模板中的代码按 ->标签进行分离,存入数组 例如和之间的内容,就是$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 * 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'); **对取出的数据进行一系列判断,取出在该插件中可能被显示的数据** 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'); } //参数列 $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++; } **模版标签解释,将数据解释给模板** $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++; } **循环结束,将模板的结尾部分,即标签之间的内容加入$str,最后返回$str,$str的内容将被完整显示。** $str.=$TempArr["end"]; return $str; } ?>四、插件默认模板制作
以“文章列表”插件的默认模板tpl_newslist.htm为例,源码如下:
插件模板一般具有开始部分、循环部分、结束部分,可根据显示的需要,将内容放在合适的位置。如果插件中需要进行多个循环,或加入其它内容,除了这些标签外,还可以使用以下标签: <!-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文件,一起打包。
初次制作插件资源包,建议先自己测试一次插件安装过程,以保证插件资源包的正确。
文档内容是否对您有帮助?
如果遇到产品相关问题,您可咨询 在线客服 寻求帮助。