emlog531博客系统插件的执行方式
系统会在加载和定义常量后马上执行下面这段代码,见根目录的init.php文件
源码
$active_plugins = Option::get('active_plugins');
$emHooks = array();
if ($active_plugins && is_array($active_plugins)) {
foreach($active_plugins as $plugin) {
if(true === checkPlugin($plugin)) {
include_once(EMLOG_ROOT . '/content/plugins/' . $plugin);
}
}
}
这段代码先获取配置文件中的启用的插件文件列表数组,然后定义一个全局的二维数组变量$emHooks用于保存所有插件的方法。 接下来是通过checkPlugin函数判断文件是否存在,如果存在则使用include_once加载对应文件,等待触发钩子执行插件功能。加载后可以在模板使用这个插件文件中的方法,变量需要加global声明再使用。
源码
function checkPlugin($plugin) {
if (is_string($plugin) && preg_match("/^[\w\-\/]+\.php$/", $plugin) && file_exists(EMLOG_ROOT . '/content/plugins/' . $plugin)) {
return true;
} else {
return false;
}
}
在插件中使用addAction函数将插件函数挂载到指定的钩子中,如下函数实现如果插件函数没有添加进去则执行添加操作。参数1是钩子名,参数2是插件方法。
in_array函数判断指定字符串是否在数组中。
源码
function addAction($hook, $actionFunc) {
global $emHooks;
if (!@in_array($actionFunc, $emHooks[$hook])) {
$emHooks[$hook][] = $actionFunc;
}
return true;
}
如下函数是插件的函数的挂载点挂载函数,遍布于博客系统地各个地方,包括模板,后台,后台模板以及系统文件中,当代码执行到对应位置时则会调用该函数实现插件方法的执行。参数是要执行的钩子中的函数。这个函数根据钩子不同执行不同的插件方法。
array_slice(func_get_args(), 1)函数func_get_args返回一个包含函数参数列表的数组,然后这个函数排除第一个元素,获取剩下的参数
所以下面这个函数就是通过参数$hook获得要执行的钩子,array_slice获得参数列表,foreach循环执行挂载在这个钩子中的所有方法,并通过call_user_func_array这个函数执行回调函数,参数1是要执行的函数,参数2是这个函数的参数列表(这个数组必须是索引数组,即键名必须是数字)。
源码
function doAction($hook) {
global $emHooks;
$args = array_slice(func_get_args(), 1);
if (isset($emHooks[$hook])) {
foreach ($emHooks[$hook] as $function) {
$string = call_user_func_array($function, $args);
}
}
}
如下函数是插件的函数的挂载点挂载函数,遍布于博客系统地各个地方,包括模板,后台,后台模板以及系统文件中,当代码执行到对应位置时则会调用该函数实现插件方法的执行。参数是要执行的钩子中的函数。这个函数根据钩子不同执行不同的插件方法。
array_slice(func_get_args(), 1)函数func_get_args返回一个包含函数参数列表的数组,然后这个函数排除第一个元素,获取剩下的参数
所以下面这个函数就是通过参数$hook获得要执行的钩子,array_slice获得参数列表,foreach循环执行挂载在这个钩子中的所有方法,并通过call_user_func_array这个函数执行回调函数,参数1是要执行的函数,参数2是这个函数的参数列表(这个数组必须是索引数组,即键名必须是数字)。
总结emlog系统地加载方式就是:1.先把插件文件加载进来。2.在插件文件中将函数进行“挂载”操作,赋值到全局emHooks中。3.在指定位置触发执行插件函数。
附录系统默认插件挂载点(共27个文件,其中模板相关5个文件,后台view11个文件,后台目录5个)
模板主题中的钩子:
echo_log.php第13行:<?php doAction('log_related', $logData); ?>
footer.php第12行:<?php doAction('index_footer'); ?>
header.php第31行:<?php doAction('index_head'); ?>
log_list.php第9行:<?php doAction('index_loglist_top'); ?>
side.php第10行:doAction('diff_side');
后台admin/view的钩子:
add_log.php第15行:<?php doAction('adm_writelog_head'); ?>
add_page.php第16行:<?php doAction('adm_writelog_head'); ?>
comment.php第51行:<?php doAction('adm_comment_display'); ?>
edit_log.php第17行:<?php doAction('adm_writelog_head'); ?>
edit_page.php第15行:<?php doAction('adm_writelog_head'); ?>
footer.php第3行:<?php doAction('adm_footer');?>
header.php第16行:<?php doAction('adm_head');?>
header.php第94行:<?php doAction('adm_sidebar_ext'); ?>
header.php第100行:<?php doAction('adm_main_top'); ?>
links.php第27行:doAction('adm_link_display');
login.php第27行:
navbar.php第52行:doAction('adm_navi_display');
twitter.php第25行:<?php doAction('twitter_form'); ?>
后台admin的钩子:
admin_log.php第102行:doAction('before_del_log', $val);
admin_log.php第104行:doAction('del_log', $val);
comment.php第135行:doAction('comment_reply', $commentId, $reply);
data.php第14行:doAction('data_prebakup');
save_log.php第68行:doAction('save_log', $blogid);
twitter.php第49行:doAction('post_twitter', $t, $twid);
根目录的钩子:
rss.php第31行:doAction('rss_display');
xmlrpc.php第502行:doAction('xmlrpc_attach_upload', $attachpath);
controller的钩子
comment_controller.php第30行:doAction('comment_post');
model的钩子
comment_model.php第270行:doAction('comment_saved', $cid);
comment_model.php第274行:doAction('comment_saved', $cid);
手机版的钩子
第167行:doAction('comment_post');
第209行:doAction('comment_saved', $cid);
第213行:doAction('comment_saved', $cid);
第293行: doAction('post_twitter', $t);
微语的钩子
第110行:doAction('reply_twitter', $r, $name, $date, $tid);
如果你对这篇文章有什么改进意见,请点击这里告诉我。
热门
随机
御坂网络 - 任何足夠先進的技術,初看皆與魔法無異!