-
442
/
/
插件开发-常用方法
获取 GET 和 POST 变量
推荐使用核心的 Input 类来获取 GET 和 POST 提交的变量,不要直接使用 $a = $_POST['xxxx'] 的方式来获取,可能造成 SQL 注入等安全问题。
// 读取通过 POST 提交的字符串,默认值设置为空 $var_name = Input::postStrVar('var_name', ''); // 读取通过 POST 提交的数字类型,默认值设置为 0 $var_name = Input::postIntVar('var_name', 0); // 读取通过 GET 提交的字符串,默认值设置为空 $var_name = Input::getStrVar('var_name', ''); // 读取通过 GET 提交的数字类型,默认值设置为 0 $var_name = Input::getIntVar('var_name', 0); // 读取 POST 提交的数字类型的数组,如: name="ids[]",默认值为:[] $logs = Input::postIntArray('blog'); // 读取 POST 提交的字符串类型的数组,如: name="someting[]",默认值为:[] $logs = Input::postStrArray('blog'); // 读取通过 GET, POST, and COOKIE 提交的字符串,默认值设置为空 $var_name = Input::requestStrVar('var_name', ''); // 读取通过 GET, POST, and COOKIE 提交的数字类型,默认值设置为 0 $var_name = Input::requestNumVar('var_name', 0);发送邮件通知
$mail = 'xxx@qq.com'; $title = '邮件标题'; $content = '邮件内容'; Notice::sendMail($mail, $title, $content); -
387
/
/
前后台挂载点-3轮流接管式挂载
执行原理:执行挂在钩子上的所有函数,上一个执行结果作为下一个的输入,且会修改传入的第二个变量值。
适用场景:对指定内容进行修改,eg:不同插件对文章内容进行不同的修改替换。
// 挂载点名称:article_content_echo,文章内容展示挂载点,带有参数$log_content, $log_content // 第一个参数 $logData:输入原始的文章数据,数组结构包括标题、内容、文章id等信息 // 第二个参数 $logData:被插件修改后的文章数据,完成内容变量的覆盖替换。 doMultiAction('article_content_echo', $logData, $logData);挂载点列表(轮流接管式挂载)
挂载点 所在文件 描述 doMultiAction('article_content_echo', $log_content, $log_content); include/controller/log_controller.php 文章内容输入挂载点,可用于文章内容替换 示例
// 将文章内容中的 aaaa 替换为 bbbb,并将替换后的文章内容存入变量 $result function content_replace($logData, &$result){ $result = str_replace('aaaa', 'bbbb', $logData['log_content']) } addAction('article_content_echo', 'content_replace'); -
392
/
/
前后台挂载点-2单次接管式挂载
执行原理:执行挂在钩子上的第一个函数,仅执行一次,接收输入input,且会修改传入的变量$ret)
适用场景:替换核心的函数,如接管核心的文件上传函数,将上传本地改为上传云端
// 挂载点名称:upload_media,上传文件挂载点,带有参数$attach,$ret doOnceAction('upload_media', $attach, $ret); // 插件开发例子:将函数upload2qiniu 挂载到upload_media挂载点 addAction('upload_media', 'upload2qiniu'); function upload2qiniu($attach, &$result) { }挂载点列表(单次接管式挂载)
挂载点 所在文件 描述 doOnceAction('upload_media', $attach, $ret); admin/media.php 资源文件上传挂载点,可以用于云存储插件开发 doOnceAction('get_Gravatar', $email, $gravatar_url); include/lib/common.php 评论人头像挂载点,可以用于改变头像的生成方式 -
422
/
/
前后台挂载点-1插入式挂载点
执行原理:顺序执行挂在钩子上的函数,支持多参数
适用场景:在挂载点位置插入指定内容,或者执行某些动作。
// 挂载点名称:adm_main_top doAction('adm_main_top'); // 插件开发例子:在如上挂载点 "adm_main_top",挂载tips函数,实现管理后台插入一句话。 addAction('adm_main_top', 'tips'); function tips() { echo "<div>世界你好</div>"; }带有参数的挂载点,参数会按照顺序传递给挂载在上面的函数。如下面的例子
// 挂载点名称:save_log,保存文章的挂载点,带有参数$blogid doAction('save_log', $blogid) // 插件开发例子:将函数test_foo挂载到如上 save_log 挂载点,并接收传递的第一个参数 $blogid addAction('save_log', 'test_foo'); function test_foo($blogid) { }后台相关挂载点
挂载点 所在文件 描述 doAction('adm_main_top') admin/views/header.php 后台首页顶部区域扩展,官方小贴士插件就使用了该挂载点 doAction('adm_head') admin/views/header.php 后台头部扩展:可以用于增加后台css样式、加载js等 doAction('adm_menu') admin/views/header.php 后台侧边栏一级菜单扩展,仅管理员可见。 doAction('login_head') admin/views/user_head.php 登录、注册页面头部扩展,可用于添加登录样式css等。 doAction('user_menu') admin/views/uc_header.php 个人中心顶部菜单扩展,仅注册用户可见。 doAction('adm_menu_ext') admin/views/header.php 后台侧边栏扩展二级菜单,用于插件单独页面。 doAction('adm_footer') admin/views/footer.php 后台底部扩展:可以用于增加后台js等 doAction('adm_main_content') admin/views/index.php 管理员后台首页信息模块扩展 doAction('user_main_content') admin/views/index_user.php 注册用户后台首页信息模块扩展 doAction('login_ext') admin/views/signin.php 后台登录页扩展:可以用于增加QQ登录等第三方登录按钮 doAction('adm_comment_display') admin/views/comment.php 后台评论显示扩展,可以用于查询评论人ip所在地域 doAction('blogger_ext') admin/views/blogger.php 后台个人信息编辑页面扩展点 doAction('save_log', $blogid) admin/article_save.php 新增文章、修改文章扩展点 doAction('del_log', $key) admin/article.php 删除文章操作扩展点 doAction('adm_writelog_head', $key) admin/article_write.php 写文章页摘要下方区域 doAction('adm_writelog_side', $key) admin/article_write.php 写文章页右侧边栏下方区域 doAction('comment_reply',$commentId, $reply) admin/comment.php 回复评论扩展点 doAction('post_note') admin/twitter.php 笔记发布扩展点 doAction('attach_upload') include/lib/common.php 扩展附件上传,如增加图片水印效果等 前台相关挂载点
挂载点 所在文件 描述 doAction('comment_post') include/controller/comment_controller.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('index_loglist_top') content/templates/default/log_list.php 前台模板:文章列表顶部扩展点,如显示公告等 doAction('rss_display') rss.php Rss输出扩展 示例
function tips_css() { echo "<style> #tip{ background:url(../content/plugins/tips/icon_tips.gif) no-repeat left 3px; padding:3px 18px; margin:5px 0px; font-size:12px; color:#999999; } </style>\n"; } // 在管理后台 head 头部加入 css 样式 addAction('adm_head', 'tips_css'); -
376
/
/
添加事件调用方法 函数: addAction
本函数是插件用来向挂载点挂载方法的函数,写在插件文件中。 函数有两个参数:$hook, $actionFunc。
- $hook 挂载点名称,
- $actionFunc 挂载到该挂载点上的函数名称
addAction('save_log','plugin_addlog');上例中将plugin_addlog函数绑定到系统的save_log事件中,只要系统执行到了save_log挂载点时,就会调用plugin_addlog函数.
-
355
/
/
EMLOG插件挂载点函数:doAction
//这是emlog的添加文章事件,在添加文章后会触发,参数为新文章的$id号码. 那么系统会自动的将$id传入到每一个绑定到本事件的钩子函数中。 doAction('save_log',$id);本函数内置于emlog核心代码中,就是传说中的插件挂载点。 本函数有一个固定的参数: $hook, $hook是执行动作的名称 ,其他的参数则可以在调用本函数时依次传入,函数会自动的发送给钩子函数
-
403
/
/
EMLOG插件运行原理
在emlog整个运行过程中我们设定了一些动作事件,遇到这些事件时emlog会自动的调用插件绑定到该事件的上的所有插件函数,从而实现插件的功能。
-
367
/
/
插件安全性
在插件文件开头增加限制语句 插件函数文件需要增加:
!defined('EMLOG_ROOT') && exit('access denied!');如果不增加该语句,那么直接访问插件的程序文件php会爆出博客的物理路径,对博客的安全造成威胁。
如果你的插件需要接收一些参数,请务必严格过滤每一个变量的数据. 例如:获取外部获取一个int型的参数,$id = $_GET['id']; 这样写是不安全的,要改为:$id = intval($_GET['id']);
如果是一个字符型的参数,$action = $_GET['action']; 这样写也是不安全的, 要改为:$action = addslashes($_GET['action']);
-
338
/
/
插件命名规则
- 上文提到的pluginname(插件名)请以小写的英文字母、数字、下划线(_)、横杠(-) 组合而成,且只能以字母作为开头
- 函数/变量命名标准 插件的所有函数/变量采用 "插件名_" 作为前缀来命名
例如:$emlogplugin_var 、emlogplugin_dosomething() 采用这样的命名方式可以避免于其他插件的函数或者变量出现冲突.
-
358
/
/
插件文件名称
- 插件文件命名推荐使用自定义前缀,避免和其他插件冲突,如: myprefixtips ,其中 myprefix 为自定义前缀。
-
插件主文件名称必须与插件所在文件夹名称相同,如:
myprefix_tips/
myprefix_tips.php
myprefix_tips_setting.php
myprefix_tips_callback.php