插件系统详解
本文介绍emlog插件系统的调度方法,emlog的实现方法很简单,定义一个全局的钩子,钩子里内置很多函数,需要的时候直接调用就行了。
插件功能实现
在init.php
最后
从缓存读取调用的插件,直接include_once
这个插件。(不是应该用require_once吗)
然后看定义的钩子函数
/**
* 该函数在插件中调用,挂载插件函数到预留的钩子上
*
* @param string $hook
* @param string $actionFunc
* @return boolearn
*/
function addAction($hook, $actionFunc) {
global $emHooks;
if (!@in_array($actionFunc, $emHooks[$hook])) {
$emHooks[$hook][] = $actionFunc;
}
return true;
}
/**
* 执行挂在钩子上的函数,支持多参数 eg:doAction('post_comment', $author, $email, $url, $comment);
*
* @param string $hook
*/
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);
}
}
}
首先在模板内内置 类似doAction('post_comment', $author, $email, $url, $comment);
插件里面直接调用 addAction("钩子名称", "调用的函数")
来引用函数即可
Emlog内置了许多钩子可以方便插件 内置挂载点及说明
插件界面
根据路由器的指引来到 plugin_controller
控制器
<?php
/**
* 前台加载插件页面
*
* @copyright (c) Emlog All Rights Reserved
*/
class Plugin_Controller {
function loadPluginShow($params) {
$plugin = isset($params[1]) && $params[1] == 'plugin' ? addslashes($params[2]) : '' ;
if (preg_match("/^[\w\-]+$/", $plugin) && file_exists(EMLOG_ROOT."/content/plugins/{$plugin}/{$plugin}_show.php")) {
include_once("./content/plugins/{$plugin}/{$plugin}_show.php");
}
}
}
这里就是插件页面前台显示的函数
插件前台显示页面 如果想让插件在前台输出一个页面,可以在插件中定义一个 pluginname_show.php
的文件。
此时插件的前台显示地址为:http:博客地址/?plugin=pluginname
这样就可以在pluginname_show.php
文件构建插件的页面显示。
插件后台显示配置页面 如果你想让插件在后台输出一个设置页面,可以在插件中定义一个 pluginname_setting.php
的文件 此时插件的后台配置地址为:http:博客地址/admin/plugin.php?plugin=pluginname
后台的插件显示相关
这些定义都在 plugin_model.php
中,可自行查看
大概就是执行插件的激活与关闭 在emlog后台的插件管理中,点击每个插件后的状态按钮即可激活/关闭插件。
如果插件需要,可以给插件增加 plugin_callback.php
文件,其中包含两个函数: callback_init()
为插件激活时调用 callback_rm()
为插件关闭时调用