本帖最后由 tomcash 于 2009-4-26 01:17 编辑
谢谢大家的鼓励和帮助,我会继续写下去。工作忙,只能周末寥寥几笔,不当之处,请指正,我会修改的。
在开篇中,可以说已经做完了一个完整的插件。不过功能很简单,只能在表格中央显示“Hello World!”。下面来做一件事,实现对插件中央显示的文字进行设定。
有两种方法可以达到这一目的。
方法一:利用DISCUZ论坛插件管理的自定义变量。
1.1 进入后台->扩展->论坛插件->管理->详情->变量
*配置名称意思是该项设定的名称(好像有点废话^_^)。
*配置变量名是指该项设定所控制的变量。
*配置类型中有很多种类,因为该例中要设定的是一个字符串,所以选字串。
1.2 上一步完成后,在后台->扩展->论坛插件,插件列表Hello World插件下面会出现一项参数设置。
1.3 点击参数设置后就能看见所设置的配置(变量)了。
1.4 为正确显示出所设定的内容,对插件程序模块文件helloworld.inc.php进行编辑并保存。- <?
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- if(!$discuz_uid) {//如果想未登陆的游客也能看到本插件,删除6~8行,谢谢q-tech指正^_^
- showmessage('not_loggedin', null, 'NOPERM');
- }
- include DISCUZ_ROOT.'./forumdata/cache/plugin_'.$identifier.'.php';
- extract($_DPLUGIN[$identifier], EXTR_SKIP);
- extract($_DPLUGIN[$identifier]['vars']);
- //$say_string='Hello World!';
- include template('hw_helloworld');
- ?>
复制代码 *在第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,创建一个提交数据的界面。
表单部分的代码如下:- <form name="form1" method="post" action="admincp.php?action=plugins&identifier=$identifier&mod=$mod" >
- <div align="center">欢迎词:
- <input type="text" name="textfield" value="$hw_set_saystring">
- <input type="submit" name="hw_submit" class="btn" value="提交">
- <input type="hidden" name="formhash" value="$hw_formhash">
-
- </div>
- </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的内容如下:- <?
- if(submitcheck('hw_submit')){
- $db->query("UPDATE {$tablepre}plugin_helloworld SET say_string='$textfield';");
- cpmsg('设置成功!', 'admincp.php?action=plugins&identifier='.$identifier.'&mod='.$mod,'succeed');
- }
- $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");
- $hw_field=$db->fetch_array($query);
- $hw_set_saystring=$hw_field['say_string'];
- $hw_formhash=FORMHASH;
- include template('hw_setting');
- ?>
复制代码 *代码开始的if判断是否有表单提交的动作,如果有,则更新数据库,显示相关信息并返回。
*如果没有表单提交,则查询数据库,获取所需的数据。代码第7行对数据进行查询,返回资源号给$query。第9行将此“资源”中的数据提出赋值给$hw_field,得到的$hw_field实际上是一个数组,有点类似ASP中的记录集,但是又有区别,因为是一个数组,所以没有游标的概念。本例中只有1条记录,如果返回的记录有很多个,则要用while()循环遍历:- while($hw_field=$db->fetch_array($query)){
- $var = $hw_field['fieldname'];
- ......
- }
复制代码 而且还必须这么写,如果你写成while($hw_field){.....}是不行的。遍历完成后,$hw_field即失效,如果要再用,必须重新query()。不过听说PHP5支持存储过程的,特向诸位大牛请教^_^。
*第13行是为模版中的表单生成哈希值,很简单,直接引用FORMHASH(注意全是大写)就可以了。这里做了一下传递,是因为:我发现模版文件中的代码好像要被处理过才执行,只认得$打头的变量。
*因为是通过“后台调用(后台菜单)”的方式用admincp.php来执行,admmincp.php已经进行了权限验证,所以这里一般不用再对权限做检查了。
2.6 编辑前台程序helloworld.inc.php文件,引用数据库中的数据传递给模版,代码如下:- <?
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- if(!$discuz_uid) {//如果想未登陆的游客也能看到本插件,删除6~8行,谢谢q-tech指正^_^
- showmessage('not_loggedin', null, 'NOPERM');
- }
- $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");
- $hw_field=$db->fetch_array($query);
- $say_string=$hw_field['say_string'];
- include template('hw_helloworld');
- ?>
复制代码 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函数手册。如果已经有了,请一定告诉我,急需! |