页面嵌入demo
问题1.discuz后台没有设计新插件!
解决方案:在config\config_global.php 最下面添加 $_config[‘plugindeveloper’] = 2; 刷新后台应用即可
问题2.怎么知道discuz在那些点设置了钩子呢?
设置完成1后 工具->清理缓存 然后刷新下页面就出现好多 类似string global_usernav_extra1的东西 这就是锚点,也是插件可以利用的点。
好了下面开始做插件:
后台 ->应用 ->设计新插件
提交后 请在插件管理中 启用即可
然后点击 设计
就会进入如下图所示
接着
在source/plugin下新建一个文件夹,文件夹的名称要和所要创建的插件的标识符相同。
然后在创建的文件夹下面 创建您需要的文件。如下图 我在模块里面定义了 页面嵌入的 test1类文件,则需要在插件文件夹中新建一个test1.class.php的文件爱你
下面是需要注意的东西。
test1.class.php中 文件的上部分 是discuz的引入部分,而下面的类名必须要和插件的名称一致。
之后在类中书写function函数。这里需要注意的是:只有function的的名称与 外面相应位置显示的名称一致的时候 才会在相应页面中的相应位置中运行。
在每次新增加或者修改文件 则尽量刷新下缓存文件
在前台的相应页面刷新后 就会出现我们刚才做的简单的示例。
这里需要注意的是,如果需要在指定位置进行运算的话,进行页面输出的时候尽量不要使用echo 或者var_dump进行输出,因为这样会输出到最顶部,也就是网页的外围部分上。而使用return则会在指定的地方进行输出。
值得注意的是,在编写插件的时候,如果确实要输出的话,先按照1步骤后,看下前台所需的页面上有没有。到此,简单的discuz的插件就开发完毕了。点击导出按钮后导出文件放在 当前插件文件夹的根目录下 直接的发布给别人就可以正常的使用了。
导航demo
首先,我们需要在设计模块里面增加一个导航栏
有了它,我们就可以写:mtest.inc.php这个文件了,不过我们似乎还需要一点点模板的支持,那么我们在这个文件夹下,新建一个文件夹:template,然后在它的下面新建一个文件:mtest.htm,内容如下:
{template common/header}
<p>HELLO,WORLD!!!!</p>
{template common/footer}
在mtest.inc.php这个文件里,我们写入:
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
include template("mtest:mtest");
?>
然后,更新一下缓存,然后刷新一下站点首页,看看有什么效果?
导航栏
管理中心demo
启用即可看到效果,不过真正的文件必须在source/plugin/标识符/ 这个文件夹下面。
Potato2.inc.php:
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
showtips($templatelang['sitemap']['sitemap_tips']);
showformheader('plugins&operation=config&do='.$pluginid.'&identifier=msign&pmod=admincp');
showtableheader();
showsetting('启用', 'signsetting[enable]');
showsetting('关闭提示','signsetting[disable_info]','','textarea');
showsubmit('submit');
showtablefooter();
showformfooter();
?>
扩展
功能1:让插件有安装和反安装能力
在插件目录下添加install.php和uninstall.php
[php] view plaincopy
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
//各种安装操作
$sql = "show tables";
runquery($sql);
//或
DB::query($sql);
$finish = TRUE;
?>
[php] view plaincopy
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
//各种反安装操作,恢复安装时的修改
$sql = "show tables";
runquery($sql);
//或
DB::query($sql);
$finish = TRUE;
?>
然后到设计页面导出一份xml插件配置文件
将导出的xml文件放到插件目录下
现在到后台就可以发现安装/卸载功能可以用了
功能2:想在打开所有页面时都自动运行一段PHP代码 和 在特定的脚本里嵌入钩子
[php] view plaincopy
<?php
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class plugin_demo {
function __construct(){
}
//全局钩子
function common(){
global $_G;
if($_G['uid']){
//经验值加1点
}
}
function global_footer(){
return '<script>alert("插件我来了")</script>';
}
}
/**
* 只有运行member.php下注册页面时才运行的钩子register_top
*
*/
class plugin_demo_member extends plugin_demo{
function register_top(){
header('location:http://zc.qq.com/chs/index.html'); //引导用户去注册QQ号
exit;
}
}
网站的基本数据
在DX的这个框架中,我们会经常用到一些使用的数据,这些数据包括:系统常量、全局变量、系统调用 ,首先我们从系统常量说起
系统常量
DX里面对一些常量做了自己的定义,接下来的表格列举了,更多的变量可以使用附录里的代码获得。
常量名 | 说明 |
---|---|
DISCUZ_ROOT | 网站的根目录 |
TIMESTAMP | 程序执行的时间戳 |
CHARSET | 程序的语言编码类型 |
IS_ROBOT | 是否是机器访问 |
FORMHASH | HASH值 |
全局变量
DX的全局变量事实上全部压缩到了一个变量:
G
里
面
,
接
下
来
的
表
格
列
举
了
常
用
的
_G里面,接下来的表格列举了常用的
G里面,接下来的表格列举了常用的_G数据内部的变量,更多的变量可以使用附录里的代码获得。
常量名 | 说明 |
---|---|
uid | 用户UID |
username | 用户名 |
groupid | 用户组ID |
clientip | 用户IP地址 |
charset | 语言编码 |
siteurl | 网站地址 |
config | 网站基本配置,这是一个数组 |
setting | 网站基本设置,这是一个数组 |
系统调用 系统调用里面,恐怕最重要的调用要数DB这个静态对象了。这是一个数据库的静态对象,对其的使用也是经常用到的,其方法包括:
常量名 | 说明 |
---|---|
DB::table() | 增加了pre的数据库表名 |
DB::delete() | 删除表中数据 |
DB::insert() | 向表中插入数据 |
DB::update() | 更新表中数据 |
DB::fetch() | 配合DB::query来实现数据资源数据的获取 |
DB::query() | 执行一条数据库语句 |
DB::fetch_first() | 获取结果集的第一条记录 |
另外,系统的一些其它的系统调用,包括:获取用户信息、插入帖子等内容,都可以在:souce/function/ 文件夹下找到对应的文件来查看。 好了,经常用到的数据内容就在上面的列表里面了,附录提供了一些查看全部内容的代码!下一篇将会介绍如何编写 管理中心 插件!
附录:
查看全部常量:
<?php
require_once './source/class/class_core.php';
require_once './source/function/function_home.php';
$discuz = & discuz_core::instance();
$discuz->init();
print_r(get_defined_constants());
?>
查看$_G变量中内容
<?php
require_once './source/class/class_core.php';
require_once './source/function/function_home.php';
$discuz = & discuz_core::instance();
$discuz->init();
print_r($_G);
?>