PW插件体系

       PW插件是是论坛中少有的几个相对独立的模块,可使您在相对独立的环境开发论坛的应用的同时,最大程度的调用论坛已有的数据及接口。如任何插件直接可以用$winddb变量来获取登录用户的信息。

 

       下面我们来看看插件运行的原理,及后面我会给出一个简单的实例

插件的系统文件其实只有两个:

hack.php

admin/hackcenter.php

 

论坛根目录hack.php是所有插件的入口文件代码如下

define('SCR','hack');

if(isset($_GET['action']) && $_GET['action'] == 'ajax'){ //如果action等于ajax则定义AJAX1,

       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

就可以显示 这是个测试界面几个字,那么为这几个字要放在一堆的代码里面呢?

这个是为了调用系统公共的头部与底部信息,包括jscss;

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.

然后我们卸载后重新安装程序。

,然后再进行卸载看没有那个表了吧。

至此插件的内部处理流程,与简单插件制作实例已经完成。

需要特别注意的是,不论是插件文件的格式,还是数据库的编码都要和论坛的编码保持一致,要不然会出现恐怖乱码呀!