您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
discuz插件核心函数hookscript分析
亦瑶2025-07-14Discuz教程已有人查阅
导读function hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = '')
function hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = '') {
# 本函数是插件勾注的枋心函数. 对插件开发极为重要. 我们一一分析.
# hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = '')
# hookscript($script, $hscript, $type = 'funcs', $param = array(), $func = '', $scriptextra = '')
# hookscript(方法名, 类型(比如全局,主题, 移动等等..), 调用类型, 参数, 可以勾搭一个副方法, 特殊参数);
global $_G; // 引入核心数组, 默认是共计4KB大的数组,
static $pluginclasses; // 静态货插件类数组, 以便计算执行文件是否已经被引入过.
if($hscript == 'home') { // 当$hscript 等于home时, 做些变量的转换, 特殊参数就在这儿有效.
if($script == 'space') {
$scriptextra = !$scriptextra ? $_GET['do'] : $scriptextra;
$script = 'space'.(!empty($scriptextra) ? '_'.$scriptextra : '');
} elseif($script == 'spacecp') {
$scriptextra = !$scriptextra ? $_GET['ac'] : $scriptextra;
$script .= !empty($scriptextra) ? '_'.$scriptextra : '';
}
}
# 判断插件是否有定义或者开启. 否则退出.
if(!isset($_G['setting'][HOOKTYPE][$hscript][$script][$type])) {
return;
}
# 判断插件是否有缓存, 假如没有则退出.
if(!isset($_G['cache']['plugin'])) {
loadcache('plugin');
}
# 循环取出module数组, module数组里面包涵着文件路径.
foreach((array)$_G['setting'][HOOKTYPE][$hscript][$script]['module'] as $identifier => $include) {
// pluginrunlist 这儿检测了方法是否被禁用, 否则跳过一次.
if($_G['pluginrunlist'] && !in_array($identifier, $_G['pluginrunlist'])) {
continue;
}
// 权限的判断.
$hooksadminid[$identifier] = !$_G['setting'][HOOKTYPE][$hscript][$script]['adminid'][$identifier] || ($_G['setting'][HOOKTYPE][$hscript][$script]['adminid'][$identifier] && $_G['adminid'] > 0 && $_G['setting']['hookscript'][$hscript][$script]['adminid'][$identifier] >= $_G['adminid']);
if($hooksadminid[$identifier]) { // 只有权限判断通过, 才会引入文件. 个人觉得应该将$pluginclasses数组运用起来.
@include_once DISCUZ_ROOT.'./source/plugin/'.$include.'.class.php';
}
}
# 判断方法集是为数组, (is_array有必要用@抑制错误吗?)
if(@is_array($_G['setting'][HOOKTYPE][$hscript][$script][$type])) {
$_G['inhookscript'] = true; // 只能标明调用成功了.
// 处理附加调用的方法增加, 以便让循环中可以使用.
$funcs = !$func ? $_G['setting'][HOOKTYPE][$hscript][$script][$type] : array($func => $_G['setting'][HOOKTYPE][$hscript][$script][$type][$func]);
// 循环所有的方法. 多维数组, 考虑到一个类型的hook可能有多个实现方法.
foreach($funcs as $hookkey => $hookfuncs) {
foreach($hookfuncs as $hookfunc) {
// $hookfunc[0] 为 类型也可理解为类的名字.
// $hookfunc[1] 为 执行方法
if($hooksadminid[$hookfunc[0]]) {
# 这儿需要重组一下类的名字.
$classkey = (HOOKTYPE != 'hookscriptmobile' ? '' : 'mobile').'plugin_'.($hookfunc[0].($hscript != 'global' ? '_'.$hscript : ''));
# 判断类没有被加载就退出. false参数是为了不检查引入.
if(!class_exists($classkey, false)) {
continue;
}
# 判断如果没实例化过, 就实例化一次.
if(!isset($pluginclasses[$classkey])) {
$pluginclasses[$classkey] = new $classkey;
}
# 判断$hookfunc[1]方法不存在实例中. 就退出.
if(!method_exists($pluginclasses[$classkey], $hookfunc[1])) {
continue;
}
# 然后调用$hookfunc[1]方法, 并且植入方法.
$return = $pluginclasses[$classkey]->$hookfunc[1]($param);
// $param = var_export($param,true);
// echo "{$classkey}->$hookfunc[1]($param)<br />"; 可通过这两行打印具体.
# 判断 类型具有某特征, 并且在pluginhooks数组中存在, 然后退出.
if(substr($hookkey, -7) == '_extend' && !empty($_G['setting']['pluginhooks'][$hookkey])) {
continue;
}
# 判断返回值为数组时就进入.
if(is_array($return)) {
# $hookkey 判断 是否存在插件hook当中. 并且要是数组. 接着循环, 将返回值做不同的赋值释放.
if(!isset($_G['setting']['pluginhooks'][$hookkey]) || is_array($_G['setting']['pluginhooks'][$hookkey])) {
foreach($return as $k => $v) {
$_G['setting']['pluginhooks'][$hookkey][$k] .= $v;
}
} else {
foreach($return as $k => $v) {
$_G['setting']['pluginhooks'][$hookkey][$k] = $v;
}
}
} else {
#假如返回值不是数组, 则换种方法释放返回值.
if(!is_array($_G['setting']['pluginhooks'][$hookkey])) {
$_G['setting']['pluginhooks'][$hookkey] .= $return;
} else {
foreach($_G['setting']['pluginhooks'][$hookkey] as $k => $v) {
$_G['setting']['pluginhooks'][$hookkey][$k] .= $return;
}
}
}
}
}
}
}
# 变个变量是什么意思, 上面定义true, 这儿定义false, 是在计算流程是否完成吗?
$_G['inhookscript'] = false;
}
本文标签:
很赞哦! ()
相关教程
图文教程
Discuz X2任务开发教程实例
由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到:1、由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中
discuz功能列表说明
导航旁边的+就可以把其加入到常用操作上首页管理中心首页 文件校验,在线成员,管理团队留言。系统信息。开发团队介绍。常用操作管理 名称和URL全局站点信息 站点名称。网
Discuz3.X整合CAS的方法示例
有很多朋友问我为什么没能整合成功?我也没有能及时回复,在此表示抱歉。实际上将登录的过程是在Cas Server 登录页面 中完成的, DZ中的登录用户名密码这些都可以隐藏掉。 这个需要改模板了。
discuz X2.5文件结构说明文档
|-- /source/function DX自定义函数库|--/function_admincp.php 后台各项处理函数|--/function_attachment.php 附件类处理函数
相关源码
-
(自适应响应式)装修装潢设计公司网站源码下载本模板为装修设计企业打造,采用PbootCMS内核开发,整体设计突出空间美学与功能性结合。首页采用大图轮播展示工程案例,服务项目模块支持三维效果展示,呈现装修设计企业的专业形象与技术实力。查看源码 -
(自适应)中英文双语外贸扬声器音响喇叭话筒网站模板免费下载为音响设备外贸企业设计的中英文双语网站模板,基于PbootCMS内核开发。适配扬声器系统、音频设备等产品的国际化展示需求查看源码 -
(自适应)大型农业机械设备水稻玉米收割机网站pbootcms源码下载本模板基于PbootCMS内核开发,为农业机械设备制造与销售企业设计,特别适合水稻玉米收割机、拖拉机、播种机等农用机械展示。模板充分考虑了农机行业的特性,从产品展示到技术参数,从作业案例到售后服务查看源码 -
(自适应)HTML5响应式双语绿色物流运输快递货运pbootcms源码本款基于PbootCMS开发的网站模板为物流运输、快递货运行业设计,采用HTML5技术构建,支持简繁字体切换。模板设计充分考虑了货运物流行业的特点,可专业展示运输服务、物流网络和业务优势等内容。查看源码 -
(自适应)橙色家政服务清洁保洁服务pbootcms网站模板源码下载模板核心价值:基于PbootCMS内核开发的家政服务类网站模板,通过模块化设计展现服务项目、团队风采、服务案例等核心板块,突出时效预约、服务标准化展示等家政行业特性。查看源码 -
(自适应)WordPress二次元博客主题SakurairoSakurairo主题为二次元内容创作者设计,提供丰富的动漫风格元素和个性化的展示效果。该主题在原有Sakura主题基础上进行了功能增强,支持多种自定义设置,满足动漫爱好者建立个人博客的需求。查看源码
| 分享笔记 (共有 篇笔记) |
