Discuz 插件开发【X3.4】 二次开发 - 在线手册
验证插件二次开发
本功能由PHP+MYSQL语言开发,无缝对接新秀网络验证系统,采用独立入口文件、类文件、第三方类文件库进行调用开发。所有功能实现及控制均采用api接口操作,数据输出形式为JSON、XML两种常见形式,达到毫秒级数据快速交换功能。1、插件开发是结合新秀网络验证系统进行的二次开发,不能独立使用;2、插件开发遵循Discuz、新秀网络验证、PHP语言规范开发;3、插件开发适用于新秀网络验证系统ver6.5版本以后;4、本功能与新秀网络验证系统、扩展框架系统,代码相互独立,但功能同时执行;5、插件开发可使用Discuz内置函数、新秀网络验证内置函数、PHP函数。
适用环境:php版本>5.6、Mysql版本>5.5以上、Discuz版本>3.0。
= Discuz资料库= Discuz插件开发文档= 开发交流=BUG反馈=QQ客服:3188639QQ交流群:281079920
接口开发常用函数
1、DB数据库操作函数 /*常用MYSQL数据库操作命令,增、减、改、查功能函数。*/
2、新秀网络验证数据库对照表 /*新秀网络验证系统内部,所有数据库表及说明*/
3、Discuz官方数据库对照表/*Discuz官方数据库表,包括discuz、UCente数据库字典。*/
4、Discuz基础框架、类、函数 /*包含Discuz官方基础框架、类、函数、方法使用说明。*/
5、新秀网络基础框架类、函数 /*包含新秀网络验证基础框架、类、函数、方法使用说明。*/
验证插件二次开发示例
1、ip地址查询 /*用于查询ip地址接口!*/
使 用 简 介
1、插件开发演示文件下载(IP地址查询)
2、插件开发演示文件目录说明
xinxiu_network_plugin \\新秀网络验证应用中心插件主目录—extend \\自定义类存放目录 (用于开发者存放第三方类、自定义类)—function \\自定义方法存放目录 (用于开发者存放自定义开发接口类和方法)——function_dev.php \\自定义方法类开发文件 (自定义开发接口方法类)—plugins \\插件数据库代码存放目录 (用于开发者存放插件数据库执行代码)——dev \\插件名目录———extend_network.php \\设置插件数据库执行代码文件(数据新增、更新、删除,接口增加、删除功能,插件安装和卸载代码)—template \\插件前端htm开发存放目录(根据discuz官方插件前台开发代码进行开发)—admin_dev_set.inc.php \\插件后台设置文件(根据discuz官方插件后台开发代码进行开发,并在插件设计页面自行增加插件设置文件入口)—dev.inc.php \\自定义接口入口开发文件
3、如何安装、开发、调试?
#1、下载演示文件后,上传至新秀网络验证应用中心插件根目录。discuz论坛插件根目录 \source\plugin\xinxiu_network_plugin\#2、使用PHP代码编辑软件,对入口文件 dev.inc.php 和 自定义方法类文件 function_dev.php 等进行开发,注意:UTF8及GBK编码问题。#3、如需新增接口文件,请根据演示文件,修改 “dev” 为您想要的文件名,但不能与新秀框架插件内文件名冲突,且开发的接口方法,不能与新秀框架冲突。#4、如何发布自己开发的插件并获取一定收益,请联系客服QQ:3188639#5、功能代码开发完成,组装调试接口://根据演示文件中组装url接口地址http://demo.xinxiuvip.com/plugin.php?id=xinxiu_network_plugin:ip&action=ip_cha&key=123456&ip=14.21.97.153{
"code": 200,
"result": "ok",
"count": 2,
"data": {
"ip": "14.21.97.153",
"dizhi": "- 中国广东"
},
"sqltime": "0.01041s"
}
ip.inc.php入口文件代码实例
<?php
/*
技术支持 QQ:3188639 QQ交流群:281079920
官方网站 http://www.xinxiuvip.com/
获取授权 http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit
接口开发手册 http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394
严禁反编译、逆向等任何形式的侵权行为,违者将追究法律责任!
*/
#========================================
#以下两行代码,用于开发环境下代码错误提示,可根据提示信息进行代码检查,无误后即可注释掉!
//ini_set("display_errors", "on");
//error_reporting(E_ALL);
#========================================
#========================================
#防止游客直接输入网址进行访问,权限检测,勿动!!!
if (! defined('IN_DISCUZ')) {
exit('Access Denied');
}
#========================================
#========================================
#引入自定义开发类文件,此文件保存位置 'function/dev' 代表 function/function_dev.php 如需修改请按格式进行!
C::import('function/ip', 'plugin/xinxiu_network_plugin', false);//注意这里插件开发和接口二次开发不同!
$api = new function_ip();//实例化function_dev.php类操作,实例化后可用$api->调用function_dev.php中的类方法!
#========================================
#此处为入口文件,根据接口方法,调用对应类方法。
switch ($api->action) { //$api->action 获取入口方法,勿动!!!
#========================================
case 'ip_cha': // 判断是否是此方法,如果是则进入下一步!
$ip =xx_client::safe_check('ip', true); //判断参数传输,params为参数名称,iscore为是否是必填项(true为必填,false为可空)
$api->ip_cha($ip);//调用function_dev.php实例化后类方法,根据类方法设置传入参数。
break;
#此处代码根据接口开发需求,可以无限添加循环。
#========================================
#========================================
case 'ip_demo': // 判断是否是此方法,如果是则进入下一步!
$ip =xx_client::safe_check('ip', true); //判断参数传输,params为参数名称,iscore为是否是必填项(true为必填,false为可空)
$api->ip_demo($ip);//调用function_dev.php实例化后类方法,根据类方法设置传入参数。
break;
#此处代码根据接口开发需求,可以无限添加循环。
#========================================
#========================================
#此处代码是判断接口输入是否正确。勿删!!!
default:
xx_client::json_output(400,'error010');
break;
#========================================
}
function_ip.php自定义方法类代码实例
<?php
/*
技术支持 QQ:3188639 QQ交流群:281079920
官方网站 http://www.xinxiuvip.com/
获取授权 http://www.xinxiuvip.com/plugin.php?id=xinxiu_license:accredit
接口开发手册 http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=394
严禁反编译、逆向等任何形式的侵权行为,违者将追究法律责任!
*/
#========================================
#以下两行代码,用于开发环境下代码错误提示,可根据提示信息进行代码检查,无误后即可注释掉!
//ini_set("display_errors", "on");
//error_reporting(E_ALL);
#========================================
#========================================
#防止游客直接输入网址进行访问,权限检测,勿动!!!
if (! defined('IN_DISCUZ')) {
exit('Access Denied');
}
#========================================
#========================================
#引入核心系统类,勿删!!!
C::import('class/plugin','plugin/xinxiu_network_plugin',false);
require_once DISCUZ_ROOT.'./config/config_ucenter.php';
require_once DISCUZ_ROOT.'./uc_client/client.php';
#========================================
#========================================
#如何引入自定义系统类?
#1、将自定义核心类、第三方核心类上传至extend文件夹下;
#2、通过 C::import 、 require_once 两种引入形式引入第三方核心类;
#3、在下方 public function dev_demo1($demo1,$demo2) 方法中实例化后使用 $new-> 进行调用。
#========================================
class function_ip extends class_plugin
{
public $action_all = array('ip_cha','ip_demo');//所有接口必填,用逗号隔开!!!除以下key、adminkey所包含以外,未包含的接口都是通过token令牌进行访问。
public $function_action_key = array('ip_cha','ip_demo');//使用key密钥访问的接口
public $function_action_adminkey = array();//使用管理密钥adminkey访问的接口
/**
* 构造方法 __construct() 是在实例化对象时被自动调用
* 用途:可以用于初始化程序(可以给成员属性赋值,也可以调用成员方法)
*/
public function __construct(){
$this->plugin_status();//判断插件后台开启状态,勿删!
parent::__construct();//注意这里和接口二次开发不同
}
#========================================
#此处为标准类方法,可根据DISCUZ、新秀网络验证内置函数进行调用,也可使用PHP官方函数进行操作。
public function ip_cha($ip){
#-具体DISCUZ内置函数、新秀网络验证内置函数、PHP函数,论坛相应帖子有专门介绍。
$tinyipfile = DISCUZ_ROOT.'./data/ipdata/tinyipdata.dat';
$data = $this->convertip_tiny($ip,$tinyipfile);
$data_array = array(
'ip'=>$ip,
'dizhi'=>$data,
);
$data ? xx_client::json_output(200,'ok',$data_array): $this->json_output(400,'请检查IP地址是否正确!');
#-具体DISCUZ内置函数、新秀网络验证内置函数、PHP函数,论坛相应帖子有专门介绍。
}
#========================================
#========================================
#演示方法设置钩子
public function ip_demo($ip){
#========================================
#嵌入插件开发钩子,注意:此扩展方法在应用中心扩展文件中使用‘extend_plugin.php’;
xx_client::class_hook('hook_ip_ip_cha',array('ip'=>$ip));
/*
* 下面是插件拓展对应的方法
* 注意class_hook中的'hook_ip_ip_cha' 就是扩展文件中的方法名!
*
public function hook_ip_ip_cha($data){
var_dump($data,'plugin');
}
*/
#========================================
}
#========================================
function convertip_tiny($ip, $ipdatafile) {//获取ip地址的方法类
static $fp = NULL, $offset = array(), $index = NULL;
$ipdot = explode('.', $ip);
$ip = pack('N', ip2long($ip));
$ipdot = (int)$ipdot;
$ipdot = (int)$ipdot;
if($fp === NULL && $fp = @fopen($ipdatafile, 'rb')) {
$offset = @unpack('Nlen', @fread($fp, 4));
$index= @fread($fp, $offset['len'] - 4);
} elseif($fp == FALSE) {
return'- Invalid IP data file';
}
$length = $offset['len'] - 1028;
$start= @unpack('Vlen', $index[$ipdot * 4] . $index[$ipdot * 4 + 1] . $index[$ipdot * 4 + 2] . $index[$ipdot * 4 + 3]);
for ($start = $start['len'] * 8 + 1024; $start < $length; $start += 8) {
if ($index[$start] . $index[$start + 1] . $index[$start + 2] . $index[$start + 3] >= $ip) {
$index_offset = @unpack('Vlen', $index[$start + 4] . $index[$start + 5] . $index[$start + 6] . "\x0");
$index_length = @unpack('Clen', $index[$start + 7]);
break;
}
}
@fseek($fp, $offset['len'] + $index_offset['len'] - 1024);
if($index_length['len']) {
return '- '.@fread($fp, $index_length['len']);
} else {
return '- Unknown';
}
}
/**
* 析构方法 __destruct() 是在对象被销毁时自动调用
* 用途:可以进行资源的释放操作或文件的关闭操作或信息保存操作
*/
public function __destruct()
{
return parent::__destruct(); // TODO: Change the autogenerated stub
}
}
admin_qq_set.inc.php插件后台设置文件(以QQ登录插件为例)
<?php
if (! defined('IN_DISCUZ') || ! defined('IN_ADMINCP')) {
exit('Access Denied');
}
global $_G;
C::import('class/xinxiu','plugin/xinxiu_network',false);
//判断接收go参数
$go = $_GET['go'];
$formhash= $_G['formhash'];
$identifier = 'xinxiu_network_plugin';
//判断接收go参数
if (submitcheck('qqsubmit')){
$data = array(
//'open' => $_GET['open'],
'appid' => $_GET['appid'],
'appkey' => $_GET['appkey'],
'callback' => $_GET['callback'],
'scope' =>$_GET['like'],
);
xx_cache::set_cache('plugin/set/qq_set',$data,true);
cpmsg('更新数据成功!', 'action=plugins&operation=config&do='.$_GET['do'].'&identifier=xinxiu_network_plugin&pmod=admin_qq_set', 'succeed');
}else{
//QQ登录配置信息获取
$data = xx_cache::get_cache('plugin/set/qq_set','',true);
$appid = $data['appid'];
$appkey = $data['appkey'];
$callback = $data['callback'];
//$open = $data['open'];
$get_user_info = $data['scope']['get_user_info'] == 'on' ? 'checked' : '';
//QQ登录配置信息获取
}
showtableheader('QQ登录设置');
showformheader('plugins&operation=config&do='.$pluginid.'&identifier='. $identifier .'&pmod=admin_qq_set');
//showsetting('QQ登录开关', 'open',$open, 'radio','','','是否开启QQ登录!');
showsetting('appid:', 'appid',$appid, 'text','','','请输入appid');
showsetting('appkey:', 'appkey',$appkey, 'password','','','请输入appkey');
showsetting('callback:', 'callback',$callback, 'text','','','请输入callback回调地址');
showtips('', 'tips', true, '<h2 style="color: red">提示:首先要进行QQ账号绑定接口成功后,才能使用其他功能。</h2>');
showsubmit('qqsubmit','提交配置');
showformfooter();
showtablefooter();
extend_network.php插件安装卸载配置实例
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
C::import('class/plugin','plugin/xinxiu_network_plugin',false);//引入系统核心类
class extend_network extends class_plugin {
public function __construct()//构造方法
{
parent::__construct(false);
}
public function hook_plugin_install(){//插件安装代码
$sql = <<<EOF
CREATE TABLE IF NOT EXISTS `pre_xinxiu_plugin_ip` (
`id` BIGINT(16) unsigned NOT NULL AUTO_INCREMENT,
`text1` longtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAMDEFAULT CHARSET=utf8 ;
EOF;
return $sql;
}
public function hook_plugin_upgrade(){//插件更新代码
$sql = <<<EOF
CREATE TABLE IF NOT EXISTS `pre_xinxiu_plugin_ip` (
`id` BIGINT(16) unsigned NOT NULL AUTO_INCREMENT,
`text1` longtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAMDEFAULT CHARSET=utf8 ;
EOF;
return $sql;
}
public function hook_plugin_uninstall(){//插件卸载代码
$sql = <<<EOF
DROP TABLE IF EXISTS `pre_xinxiu_plugin_ip`;
EOF;
return $sql;
}
public function hook_plugin_actions_install(){//插件安装接口代码
$actions_array = array(
array(
'type'=>'ip模块',
'name'=>'查询ip地址',
'actions'=>'ip_cha',
'url'=>'http://www.xinxiuvip.com/forum.php?mod=viewthread&tid=424',
),
);
return $actions_array;
}
public function hook_plugin_actions_upgrade(){//插件接口更新代码
}
}
页:
[1]