Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[展示] DZ插件制作简易入门教程(自学手记)17楼更新第二篇

[复制链接]
zx4044 发表于 2009-4-19 20:10:18 | 显示全部楼层
还是不是很清楚,知识不是很行呀!
回复

使用道具 举报

lisen 发表于 2009-4-19 20:22:18 | 显示全部楼层
学习了楼主!
回复

使用道具 举报

gaojuvip 发表于 2009-4-19 20:28:54 | 显示全部楼层
收藏,学习!
回复

使用道具 举报

肥爺 发表于 2009-4-19 20:32:56 | 显示全部楼层
回复

使用道具 举报

hamen 发表于 2009-4-19 21:18:53 | 显示全部楼层
写得很好。
回复

使用道具 举报

adicom 发表于 2009-4-20 16:17:17 | 显示全部楼层
支持
授人鱼不如授人渔
回复

使用道具 举报

 楼主| tomcash 发表于 2009-4-26 00:55:04 | 显示全部楼层

RE: DZ插件制作简易入门教程(自学手记)第二篇

本帖最后由 tomcash 于 2009-4-26 01:17 编辑

谢谢大家的鼓励和帮助,我会继续写下去。工作忙,只能周末寥寥几笔,不当之处,请指正,我会修改的。

在开篇中,可以说已经做完了一个完整的插件。不过功能很简单,只能在表格中央显示“Hello World!”。下面来做一件事,实现对插件中央显示的文字进行设定。

有两种方法可以达到这一目的。

方法一:利用DISCUZ论坛插件管理的自定义变量。
1.1 进入后台->扩展->论坛插件->管理->详情->变量

  *配置名称意思是该项设定的名称(好像有点废话^_^)。
  *配置变量名是指该项设定所控制的变量。
  *配置类型中有很多种类,因为该例中要设定的是一个字符串,所以选字串。

1.2 上一步完成后,在后台->扩展->论坛插件,插件列表Hello World插件下面会出现一项参数设置。


1.3 点击参数设置后就能看见所设置的配置(变量)了。


1.4 为正确显示出所设定的内容,对插件程序模块文件helloworld.inc.php进行编辑并保存。
  1. <?
  2. if(!defined('IN_DISCUZ')) {
  3.         exit('Access Denied');
  4. }

  5. if(!$discuz_uid) {//如果想未登陆的游客也能看到本插件,删除6~8行,谢谢q-tech指正^_^
  6.         showmessage('not_loggedin', null, 'NOPERM');
  7. }

  8. include DISCUZ_ROOT.'./forumdata/cache/plugin_'.$identifier.'.php';
  9. extract($_DPLUGIN[$identifier], EXTR_SKIP);
  10. extract($_DPLUGIN[$identifier]['vars']);

  11. //$say_string='Hello World!';

  12. include template('hw_helloworld');
  13. ?>
复制代码
  *在第1.1步中设定好了配置变量后,该变量实际是放在该插件相关的缓存文件中,第10行代码即将此缓存文件“装入”。在论坛根目录/forumdata/cache/下可以找到这个缓存文件,文件名plugin_helloworld.php。
  *如果打开该文件可以发现设定的配置变量say_string存放在一个数组$_DPLUGIN['helloworld']中,名字为$say_string,PHP中变量前面都要有$符号。程序的11、12行代码就是将此数组“解开”,以得到$say_string变量。关于extract函数和其它语句的的详细内容请参考PHP手册。

1.5 保存后可以尝试在本篇步骤1.3的界面中提交新值,插件界面上的值应该有变化了。



方法二:自己编写插件设定程序
  DISCUZ的自定义配置变量基本能够满足一般插件的设定需求,但是对比较高级和复杂的插件,还是自己编写设定程序比较好。下面还以Hello World项目为例子,顺带简单说一下怎么引用和操作数据库。

2.1 在论坛根目录\plugins\helloworld下新建一个文件setting.inc.php,在论坛根目录\templates\default下新建一个文件hw_setting.htm。

2.2 在后台插件模块页面为Hello World插件添加一个程序模块。


2.3 在DISCUZ论坛的数据库中添加一张数据表命名为cdb_plugin_helloworld,建立一个字段say_string。并插入一条记录,随便什么内容吧。我是用phpmyadmin来做这件事的,具体怎么操作请参考mysql手册。


2.4 编辑hw_setting.htm,创建一个提交数据的界面。

表单部分的代码如下:
  1. <form name="form1" method="post" action="admincp.php?action=plugins&identifier=$identifier&mod=$mod" >
  2.         <div align="center">欢迎词:
  3.           <input type="text" name="textfield" value="$hw_set_saystring">

  4.           <input type="submit" name="hw_submit" class="btn" value="提交">
  5.                   <input type="hidden" name="formhash" value="$hw_formhash">
  6.       
  7.         </div>
  8.       </form>
复制代码
  *因为在插件模块设置中程序模块setting的模块类型设为了“后台调用(后台菜单)”,也就是通过admincp.php这个“传送带”来运行setting模块的,所以表单要提交给admincp.php,并且后面要跟上必要的参数,因此,表单的action参数要写成action="admincp.php?action=plugins&identifier=$identifier&mod=$mod"。在本例中,不用$identifier和$mod变量而直接写成:action="admincp.php?action=plugins&identifier=helloworld&mod=setting"也不会有错,但出于安全性和稳定性考虑并不建议这样写。
  *表单中必须要有一个name为formhash的隐藏标签(代码第6行),用于传送表单的哈希值进行安全性验证。其值要事先准备好,这一点见下一步。
  *因为是通过“后台调用(后台菜单)”的方式用admincp.php来执行,所以,setting模版的开头和结尾不用加{template header}和{template footer},这一点将在以后讨论。

2.5 编辑setting.inc.php的内容如下:
  1. <?
  2. if(submitcheck('hw_submit')){
  3.         $db->query("UPDATE {$tablepre}plugin_helloworld SET say_string='$textfield';");
  4.         cpmsg('设置成功!', 'admincp.php?action=plugins&identifier='.$identifier.'&mod='.$mod,'succeed');
  5. }

  6. $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");

  7. $hw_field=$db->fetch_array($query);

  8. $hw_set_saystring=$hw_field['say_string'];

  9. $hw_formhash=FORMHASH;

  10. include template('hw_setting');
  11. ?>
复制代码
  *代码开始的if判断是否有表单提交的动作,如果有,则更新数据库,显示相关信息并返回。
  *如果没有表单提交,则查询数据库,获取所需的数据。代码第7行对数据进行查询,返回资源号给$query。第9行将此“资源”中的数据提出赋值给$hw_field,得到的$hw_field实际上是一个数组,有点类似ASP中的记录集,但是又有区别,因为是一个数组,所以没有游标的概念。本例中只有1条记录,如果返回的记录有很多个,则要用while()循环遍历:
  1. while($hw_field=$db->fetch_array($query)){
  2.   $var = $hw_field['fieldname'];
  3.   ......
  4. }
复制代码
而且还必须这么写,如果你写成while($hw_field){.....}是不行的。遍历完成后,$hw_field即失效,如果要再用,必须重新query()。不过听说PHP5支持存储过程的,特向诸位大牛请教^_^。
  *第13行是为模版中的表单生成哈希值,很简单,直接引用FORMHASH(注意全是大写)就可以了。这里做了一下传递,是因为:我发现模版文件中的代码好像要被处理过才执行,只认得$打头的变量。
  *因为是通过“后台调用(后台菜单)”的方式用admincp.php来执行,admmincp.php已经进行了权限验证,所以这里一般不用再对权限做检查了。

  2.6 编辑前台程序helloworld.inc.php文件,引用数据库中的数据传递给模版,代码如下:
  1. <?
  2. if(!defined('IN_DISCUZ')) {
  3.         exit('Access Denied');
  4. }

  5. if(!$discuz_uid) {//如果想未登陆的游客也能看到本插件,删除6~8行,谢谢q-tech指正^_^
  6.         showmessage('not_loggedin', null, 'NOPERM');
  7. }

  8. $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");

  9. $hw_field=$db->fetch_array($query);

  10. $say_string=$hw_field['say_string'];

  11. include template('hw_helloworld');
  12. ?>
复制代码
2.7保存所有程序,在后台->扩展->论坛插件->设置的hello world插件下就会多一项“Hello World!设置”,这个就是我们自己做的插件设定程序,快试试吧。

  *前面有项“参数设置”是因为在本篇开头1.1中我们添加了一个配置变量,只要删除那个配置变量,这一项就没有了。

  总结:直到接触到了数据库,我才体会到了PHP的优势。虽然它不像ASP那样豪华,但高效,简洁。今天帖子的源代码中引用了一些DISCUZ自有的函数和类,如submitcheck()、cpmsg()、$db->query()、$db->fetch_array()等等。DISCUZ论坛的绝大多数函数分别在论坛根目录\admin\global.func.php和\include\global.func.php中定义,数据库的类在\include\db_mysql.class.php中定义。其实如果仔细研究DISCUZ论坛后缀名为.func.php和.class.php的文件能发现很多好东西^_^。只可惜里面什么注释都没有,函数型只能一点一点爬代码。真希望能尽快出一份DISCUZ函数手册。如果已经有了,请一定告诉我,急需!

评分

1

查看全部评分

回复

使用道具 举报

 楼主| tomcash 发表于 2009-4-26 08:46:31 | 显示全部楼层
半夜写的,早上起来自己顶一下
回复

使用道具 举报

dywe12 发表于 2009-4-26 08:48:35 | 显示全部楼层
支持了!等教程完整了再给分
回复

使用道具 举报

llsqxh 发表于 2009-4-26 09:03:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-15 18:17 , Processed in 0.031225 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表