0%

PHPWEB拖拽式站点如何增加模版,增加新的插件

起源

近期公司遇到一个项目是拖拽式页面布局,客户需要一个新样式,但是并没有办法做到适合她的效果。一开始的客户需求是动态条涌出来,但实际并没有动态调用这个东西的。刚接触这样的东西不太熟悉,简单了解了一下午,发现这个东西是phpweb做的。

插件如何设置页面可以设置为多个

_base_plusdefault中我们可以看到默认配置,找到你所要改的插件名称比如我的modPagePicList,然后将ismul的值改为1即可。

如何增加模版

_base_plustemp中增加找到page_piclist相关的然后copy一份在模版文件字段写入自己新增的模版文件即可。

如何增加插件

牵扯数据库比较多,我这里直接引用官网的文字

插件的程序文件和数据表简介

  软件采用模块化结构,每个模块的前后台程序、模板都放在单独得模块目录下,例如:文章模块的目录是news,该目录下包含了文章管理后台(admin)、插件目录(module)、模板目录(templates)等,各模块目录名的介绍请参考《软件文件系统结构说明》,本文主要介绍插件开发相关的程序结构。
  每个插件由一个插件程序、一个默认模板、一条插件参数数据记录等三个元素构成。我们以“文章列表”插件为例,说明插件的文件和数据结构。“文章列表”插件程序是存放在news/module/目录中NewsList.php;插件的默认模板是news/templates/目录中的tpl_newslist.htm;插件记录存放在数据表_base_plusdefault中,每个插件一条记录,记录了该插件的参数,其中pluslable字段的值就是该插件的标签名,文章列表的pluslablemodNewsList。其中的规则是,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种颜色,可以填写B001P001等,但不推荐);1000表示自定义边框,如果插件默认不显示边框,可在此填写1000,并将borderwidth填为0。

bordercolor 自定义边框的颜色,仅在showborder1000自定义边框时有效 
borderwidth 自定义边框的宽度,仅在showborder1000自定义边框时有效
borderstyle 边框的样式,solid表示实线,dotted表示点状,dashed表示虚线…
borderlable 用于标签式边框填写被控插件编号,默认记录不要填任何内容
borderroll  用于标签式边框的切换方式,默认记录不要填任何内容
showbar  自定义边框是否显示插件标题栏,仅在showborder1000自定义边框时有效
barbg   自定义边框的标题栏背景色,仅在showborder1000自定义边框时有效
barcolor  自定义边框的标题栏文字色,仅在showborder1000自定义边框时有效
backgroundcolor 自定义边框的背景色,仅在showborder1000自定义边框时有效
morelink    默认的更多链接,填-1表示不可设置更多链接
width     插件默认的宽度,根据插件的理想显示尺寸填写
height     插件的默认高度,根据插件的理想显示尺寸填写
top      插件的顶边距,是相对于容器的顶边距,一般填0,方便用户在同一位置找到新插入的插件
left      插件的左边距,是相对于容器的左边距,一般填0,
zindex     插件的Z轴位置,一般填写99,使插件插入时位于其他插件的前方
padding    插件边框的内边距,即边框和内容之间的距离
shownums   内容默认显示条数,如不可控制内容条数,填-1
ord      内容的排序参数,根据插件来源数据表可提供排序的参数,以|分割,如不允许设置,填-1
sc       内容的排序方法,ascdesc,如不允许设置,填-1
showtj     是否只显示推荐内容,1表示默认选中只显示推荐内容0表示不规定是否显示推荐内容,如果不可设置是否显示推荐内容,填-1
cutword    内容标题截取文字,填数字,不可设置时填-1
target     链接打开方式,_self_blank,不可设置时填-1
catid     默认选择的分类id,用于选择内容的显示分类。当该值不是-1时,必须在classtbl字段中填如对应的数据表名,该数据表的结构必须符合PHPWEBcatpath分类方法,如文章、下载分类等均按此标准规划分类。
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为不可填

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

code  用于输入代码,不可输入填-1
tags 为空时可设置匹配标签,-1时不可设置
groupid 用于选择分组,如友情链接、广告组等插件,填-1时不可选择分组
projid  用于选择专题,如文章列表插件,填-1时不可选择专题
moveable 预留字段,全部填1
classtbl  对应catid的分类数据表名
grouptbl  对应groupid的分组数据表名
projtbl  对应projid的专题数据表名

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

overflow 内容溢出是是否自动增加高度,对于可预知高度的应设为hidden,不可预知高度得设为visible
bodyzone 插件默认插入的容器,可选填topcontentbottom
display 预留字段,填1
ifmul 一个页面中是否允许多次插入本插件,注意插入多个会产生互相冲突的一般应设为0
ifrefresh  插入插件后是否刷新页面,一般带js的插件应设为1,需要刷新后才能看到效果,普通插件设为0
重要提示:插件记录表默认参数的设置属于开发范畴,所设置的参数必须进行对应的程序开发才能体现,非程序开发人员切勿在数据表中随意更改已有插件的参数,否则可能导致程序出错!

插件程序开发

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/*
[插件名称] 最新文章列表
[适用范围] 全站
*/
function NewsList()
{
//插件程序文件名和插件函数同名
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' 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' ";
}
//模版解释,读入插件模板,将插件模板中的代码按<!- ->标签进行分离,存入数组
//例如<!-start->和<!-start->之间的内容,就是$TempArr["start"],依此类推
$Temp = LoadTemp($tempname);
$TempArr = SplitTblTemp($Temp);
//首先将模板的start部分需要的显示的变量替换给模板
$var = [
'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 = [
'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为例,源码如下:

1
2
3
4
5
6
7
8
9
10
<!-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->

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

1
2
3
4
5
6
7
8
<!-m1-><!-m1->
<!-m2-><!-m2->
<!-m3-><!-m3->
<!-menu-><!-menu->
<!-text-><!-text->
<!-rowstart-><!-rowstart->
<!-rowend-><!-rowend->
<!-con-><!-con->

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

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

插件资源包制作方法

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

  • Post author: hainuo
  • Post link: phpweb-plugins-template
  • Copyright Notice: All articles in this blog are licensed under BY-NC-ND unless stating additionally.