欢迎关注微信公众号:chave-cn

Discuz X2.0插件机制解析HOOK钩子程序

最近一段时间弄了几个discuz的插件!研究了一下它的解析机制,供参考,请高手拍砖指正!

1. 阅读官方的 插件技术文档

2. 在系统的根目录下的查看文件如forum.php  home.php等,打开后都可看到 有一个runhooks();它就是系统运行钩子程序
加载插件程序开始!

/**
 * 运行钩子
 */
function runhooks() {
    /**
     * HOOKTYPE 钩子的类型:hookscript(设计插件时"页面嵌入-普通版")   hookscriptmobile("页面嵌入-手机版")
     */
    if(!defined('HOOKTYPE')) {
        define('HOOKTYPE', !defined('IN_MOBILE') ? 'hookscript' : 'hookscriptmobile');
    }
    if(defined('CURMODULE')) {
        global $_G;
        if($_G['setting']['plugins'][HOOKTYPE.'_common']) {
            hookscript('common', 'global', 'funcs', array(), 'common');
        }
        hookscript(CURMODULE, $_G['basescript']);
    }
}

/**
 * 执行插件脚本
 */
function hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '') { }

hookscript这个函数就不详细的说明了!比较长。

这个函数当中也没有什么难点,其中有一个是$_G['setting'][HOOKTYPE]可以不太清楚,这个是在后台,更新缓存时,系统自动的判断你安装完成的插件当中有没有选择"页面嵌入-普通版"和"页面嵌入-手机版"的模块,如果有,它会在更新缓存时,更新到$_G['setting'][HOOKTYPE]当中,更新$_G['setting'][HOOKTYPE],缓存文件为function/cache/cache_setting.php当中的get_cachedata_setting_plugin()为更新插件信息的函数

运行这个函数以后,它会生成一上$_G['setting']['pluginhooks']的一个数组,这个数组主要记录你的插件执行以后,要执行的内容或者输出的内容!

 

3.在加载模板的时候,如果这个模板当中有这个钩子,如{hook/XXXX},系统的模板转化程序就会将,class_template.php会将其中的,钩子程序替换成$_G['setting']['pluginhooks']当的数据,生成对应的模板缓存文件或信息,在调用时,它就执行了了!
4.当然如果没有应用“页面嵌入”,那就更简单了,好了,这次就到这了!

微信号
微信公众号

tao-s.com