PW插件是是论坛中少有的几个相对独立的模块,可使您在相对独立的环境开发论坛的应用的同时,最大程度的调用论坛已有的数据及接口。如任何插件直接可以用$winddb变量来获取登录用户的信息。
下面我们来看看插件运行的原理,及后面我会给出一个简单的实例
插件的系统文件其实只有两个:
hack.php
admin/hackcenter.php
论坛根目录hack.php是所有插件的入口文件代码如下
define('SCR','hack');
if(isset($_GET['action']) && $_GET['action'] == 'ajax'){ //如果action等于ajax则定义AJAX为1,
define('AJAX','1');//AJAX主要是控制输出时是否调用ajax_footer()函数
}
require_once('global.php'); //包含了global.php就包含了论坛的灵魂了,什么全局变量,什么接口调用都ok了
S::gp(array('H_name')); //H_name这个参数其实就是您建立的插件目录名了。
if (preg_match('/^http/i',$H_name)) { //如果$H_name变量存在’http’则显示提示(因为可能是非法名称),所以各位不要将包含http字样的名称做目录名呀!
Showmsg($H_name);
}elseif(!$db_hackdb[$H_name] ||!is_dir(R_P.'hack/'.$H_name) ||
!file_exists(R_P."hack/$H_name/index.php")){ //如果找不到目录或找不到目录下面的index.php则提示错误
Showmsg('hack_error');
}
define('H_P',R_P."hack/$H_name/"); //定义H_P常量
$basename = "hack.php?H_name=$H_name"; //$basename这个东西蛮用的,地址前面都写上!
$hkimg = "hack/$H_name/image"; //插件图片目录
$webPageTitle = strip_tags($db_hackdb[$H_name][0]).' ';//这个就是插件页的标题了
if (!defined('AJAX')) { //如果不是ajax方式则调用普通头部
require_once(R_P.'require/header.php');
}
require_once(H_P.'index.php'); //看到了吧,直接调用插件目录下的index.php了。
function PrintHack($template,$EXT="htm"){//这个就是插件模板路径拼装函数。
return H_P."template/".$template.".$EXT";
}
admin/hackcenter.php文件是系统插件管理文件,主要功能是插件的安装,卸载,编辑等功能。执行安装的时候系统会自动执行sql.txt里面的sql语句进行数据库安装。然后在对应前台”社区服务”里面添加一个菜单。更新” pw_hack”数据表,并更新缓存,使插件信息记录到data/bbscache/config
.php。卸载则执行反过程,分析sql.txt将该插件的数据表删除,将改插件从”社区服务”菜单里删除,并更新数据库及缓存。
上面已介绍基本原理,下面我们进行实例操作
用户插件文件都是放在/hack目录下面的,打开目录我们会看到一些系统默认带的插件,如图1-1
图1-1
如果您要建立一个插件就在这下面建立一个文件夹。
比如我建立一个test目录结构如下
hack/ 论坛插件根目录
test/ 用户制定目录
template/ 模板目录
image/ 图片目录
admin.php 插件后台控制文件
index.php 插件前台控制文件
sql.txt 建表sql语句文件
info.xml 插件名称信息
info.xml里面内容如下:
<?xml version="1.0" encoding="gb2312"?>
<hack>
<hackname>这个是test</hackname>
<ifopen>0</ifopen>
</hack>
这样后台插件管理里面就会显示未安装插件如图1-2
图1-2
如无info.xml则插件名称就以目录名命名,点击安装后我,测试的插件将被安装,后台插件列表将出现如下内容图1-3
图1-3
如果点击设置,程序就会调用hack/test/admin.php里面的程序,我们在里面写简单的一句调用模板的语句
<?php
!function_exists('adminmsg')
&& exit('Forbidden'); //防止用户直接访问,为了安全
require_once PrintHack('admin'); //加载模板
然后我们在hack/test/template/admin.htm里面写一句话。
<!--<?php
include_once PrintEot('left');print <<<EOT
-->
这是个测试界面
<!—
EOT;
include_once PrintEot('adminbottom');
?>-->
我们看运行结果:图1-4
图1-4
就可以显示” 这是个测试界面”几个字,那么为这几个字要放在一堆的代码里面呢?
这个是为了调用系统公共的头部与底部信息,包括js与css;
include_once PrintEot('left');就是包含template/admin/left.htm
同样include_once PrintEot('adminbottom');
就是包含template/admin/adminbottom.htm
知道了原理您就可以随意制作后台页面了!
接下来是前台页面,同样的我们也在hack/test/template/index.htm里面加一些简单的显示信息
<!--<?php print <<<EOT
-->
这是前台页面
<!—
EOT;
?>-->
在hack/test/index.php里面加上调用模板
<?php
!function_exists('readover')
&& exit('Forbidden');
require_once PrintHack('index');
预览程序,效果如下:图1-5
图1-5
您可能会以后为什么会出现同一的头部信息呢,插件里面没有调用的呀?那我告诉您其实系统默认的在hack.php就调用头部了。require_once(R_P.'require/header.php');当然如果您不想使用系统的头部而用自己的头部的话也是可以的。只要在您的程序开始时将php输出区的内容清除就好,您可以调用ob_clean()函数清空缓冲区,将hack/test/index.php修改如下:
<?php
!function_exists('readover')
&& exit('Forbidden');
ob_clean();
require_once PrintHack('index');
然后看预览效果:图1-6
图1-6
最后我们再看看插件安装与删除时数据库的变化。我们在hack/test/sql.txt里面写上一个简单的建表语句:
CREATE TABLE pw_ext_test
(
`id` int(10) unsigned NOT NULL auto_increment,
PRIMARY
KEY(`id`)
) ENGINE=MyISAM;
建立一个仅又一个字段id的表pw_ext_test.
然后我们卸载后重新安装程序。
,然后再进行卸载看没有那个表了吧。
至此插件的内部处理流程,与简单插件制作实例已经完成。
需要特别注意的是,不论是插件文件的格式,还是数据库的编码都要和论坛的编码保持一致,要不然会出现恐怖乱码呀!