Skip to content

emlog结构解析 插件系统详解

字数
1388 字
阅读时间
6 分钟
更新日期
8/9/2016

版权声明:本文系小草窝x.hacking8.com原创尊重作者劳动,转载请标明出处。本文转载自x.hacking8.com谢谢

本文介绍emlog插件系统的调度方法,emlog的实现方法很简单,定义一个全局的钩子,钩子里内置很多函数,需要的时候直接调用就行了。

init.php最后

QQ截图20160809194721.jpg

从缓存读取调用的插件,直接include_once这个插件。(不是应该用require_once吗)

然后看定义的钩子函数

php
/** * 该函数在插件中调用,挂载插件函数到预留的钩子上 * * @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 Wiki的内置钩子

  • 挂载点:doAction('adm_main_top')

    • 所在文件:admin/views/header.php

    • 描述:后台红线区域扩展:

  • 挂载点:doAction('adm_head') ===

    • 所在文件:admin/views/header.php

    • 描述:后台头部扩展:可以用于增加后台css样式、加载js等

  • 挂载点:doAction('adm_siderbar_ext')===

    • 所在文件:admin/views/header.php

    • 描述:后台侧边栏 功能扩展 子菜单扩展,用于插件单独页面。

  • 挂载点:doAction('save_log', $blogid)===

    • 所在文件:admin/save_log.php

    • 描述:新增日志、修改日志扩展点

  • 挂载点:doAction('del_log', $key) ===

    • 所在文件:admin/admin_log.php

    • 描述:删除日志操作扩展点

  • 挂载点:doAction('adm_writelog_head', $key) ===

    • 所在文件:

    • admin/add_log.phpadmin/add_page.phpadmin/edit_log.php

    • admin/edit_page.php

    • 描述:可以再红框处显示扩展内容,如插入网络相册照片的插件。

  • 挂载点:doAction('comment_post') ===

    • 所在文件:./index.php

    • 描述:发表评论扩展点(写入评论前)。可用于垃圾评论防范

  • 挂载点:doAction('comment_saved’) ===

    • 所在文件:include/model/comment_model.php

    • 描述:发表评论扩展点(写入评论后)。用于发布评论成功的后续操作,如发通知邮件

  • 挂载点:doAction('log_related',$logData) ===

    • 所在文件:content/templates/default/echo_log.php

    • 描述:阅读日志页面扩展点、用于增加日志相关内容

  • 挂载点:doAction('index_head') ===

    • 所在文件:Content/templates/default/header.php

    • 描述:前台头部扩展:可以用于增加前台css样式、加载js等

  • 挂载点:doAction('index_footer') ===

    • 所在文件:content/templates/default/footer.php

    • 描述:首页底部扩展点

  • 挂载点:doAction('comment_reply', $commentId, $reply) ===

    • 所在文件:admin/comment.php

    • 描述:回复评论扩展点

  • 挂载点:doAction('data_prebakup') ===

    • 所在文件:admin/data.php

    • 描述:扩展备份数据库页面,可以对插件增加的表进行备份

  • 挂载点:doAction('rss_display') ===

    • 所在文件:rss.php

    • 描述:Rss输出扩展

  • 挂载点:doAction('attach_upload') ===

    • 所在文件:include/lib/function.base.php

    • 描述:扩展附件上传,如增加图片水印效果等

  • 挂载点:doAction('url_rewrite') ===

    • 所在文件:include/lib/function.base.php

    • 描述:扩展url重写,可以自定义其他url优化方案

  • 挂载点:doAction('adm_comment_display') ===

    • 所在文件:admin/views/comment.php

    • 后台评论显示扩展,可以用于查询评论人ip所在地域

  • 挂载点:doAction('index_loglist_top') ===

    • 所在文件:content/templates/default/log_list.php

    • 描述:日志列表顶部扩展点,如显示公告等

  • 挂载点:doAction('diff_side') ===

    • 所在文件:content/templates/default/side.php

    • 描述:侧边栏控制扩展点

  • 挂载点:doAction('reply_twitter', $r, $name, $date, $tid) ===

    • 所在文件:t/index.php

    • 描述:回复碎语扩展点,用于回复邮件提醒等

  • 挂载点:doAction('post_twitter', $t) ===

    • 所在文件:

    • /m/index.php

    • /admin/twitter.php

    • 描述:发布碎语扩展点,用于碎语和其他微博类产品同步等

  • 挂载点:doAction('adm_footer') ===

    • 所在文件:admin/views/footer.php

    • 描述:后台底部扩展:可以用于增加后台js等

根据路由器的指引来到 plugin_controller 控制器

php
<?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()为插件关闭时调用

撰写

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。

聚光灯样式

调整聚光灯的样式。

置于底部
在当前鼠标悬停的元素下方添加一个纯色背景以突出显示当前鼠标悬停的位置。
置于侧边
在当前鼠标悬停的元素旁边添加一条固定的纯色线以突出显示当前鼠标悬停的位置。