关于嵌入点:
除了常见的模板的嵌入点以外,Discuz! X2 还有一些比较冷门的嵌入点,给大家总结下:
showmessage 函数中的嵌入点
function_message.php 的 25 行左右
- hookscript(CURMODULE, $_G['basescript'], 'messagefuncs', array('param' => $_G['messageparam']));
对应的调用函数命名为 XXX_message(),可以接受一个传递参数。
参数的值为 showmessage 函数的所有参数的集合的一个数组。
该嵌入点可以用于输出成功提示之前执行操作。
discuzcode 函数中的嵌入点
function_discuzcode.php 的 87 行左右
- hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'discuzcode'), 'discuzcode');
function_post.php 的 529 行左右
- hookscript('discuzcode', 'global', 'funcs', array('param' => $param, 'caller' => 'messagecutstr'), 'discuzcode');
对应的调用函数命名应为 discuzcode(),与 showmessage 的嵌入点类似,接受一个参数,参数为 discuzcode 函数所有参数的集合的一个数组。
'caller' 指明了入口函数是'discuzcode'还是'messagecutstr'。
该嵌入点通常用于处理 discuzcode 输出,可以定义插件专有的 code 替换代码。
deletethread 和 deletepost 函数中的嵌入点
function_delete.php 中
- hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletepost');
- hookscript('deletepost', 'global', 'funcs', array('param' => $hookparam, 'step' => 'delete'), 'deletepost');
- hookscript('deletethread', 'global', 'funcs', array('param' => $hookparam, 'step' => 'check'), 'deletethread');
- hookscript('deletethread', 'global', 'funcs', array('param' => $hookparam, 'step' => 'delete'), 'deletethread');
该嵌入点分别在删除主题 (帖子) 操作的前后执行,区别在于'step'参数的值。
对应的调用函数命名应为 deletethread() 和 deletepost(),接受一个参数以取得 deletethread 和 deletepost 函数所有参数。
该嵌入点用于执行删除主题 (帖子) 时,嵌入插件操作
关于返回值:
通过设置配置文件中的 $_config['plugindeveloper'] = 2; 可以在页面上看到模板中的嵌入点。
[array XXXX] 这样的嵌入点需要返回 array 类型的数据,而不能是其他类型的数据。
如果返回空值会导致同一个嵌入点无法被其他插件再度使用,需要特别注意一下。
正确的做法是对于 array 类型的 hook 点,如果没有返回值,请 return array();
关于安全方面:
任何插件脚本文件,在开始判断 IN_DISCUZ 是必须的,如果是后台执行的脚本,需要判断 IN_ADMINCP 。
对于任何形式的提交数据,请使用 $_G['gp_XXX'] 的形式取得值,并且最好是做一些 is_array 、 is_numeric 的判断,减少一些意外的错误。
尽量不使用插件目录作为读写文件的目录,如果有读写文件的操作,放到 data 目录下比较合适
关于插件开发的细节众多,本人也会在将来开发的路上,不断补充~