二次开发文档:钩子开发
钩子开发说明
钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改核心文件。
有些时候你可能希望在执行流程中的某些阶段添加一些动作,例如在控制器加载之前或之后执行一段脚本, 或者在其他的某些位置触发你的脚本。
钩子程序文件
./config/hooks.php 此文件是网站钩子的定义文件,你可以把脚本写在这里。
执行方法格式
\Phpcmf\Hooks::on(挂钩点名称, 执行代码函数, 执行序号越大越优先); 或者 \Phpcmf\Hooks::app_on(插件名称, 挂钩点名称, 执行代码函数, 执行序号越大越优先);
挂钩点名称,由系统提供以便二次开发。
执行代码,你可以使用lambda表达式(匿名函数或闭包)作为钩子执行,这样语法更简单:
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'some_hook', function($foo, $bar, $baz) { ... });
执行序号,越大越靠前执行,不传入就按默认顺序
一、系统自带的钩子
系统会内置一些常用的钩子,例如:
cms_init 系统初始化后执行 cms_close 系统关闭时 cms_end 系统post执行结束时 cms_404 系统404时 cms_view 模板解析之后 ....
我们会更加开发者的需求来增加一些常用的钩子,当开发者需要时,可以给框架创始人提出。
二、自定义:无返回值的钩子
定义钩子点
\Phpcmf\Hooks::trigger('cms_diy_hook');
定义执行钩子函数
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_diy_hook', function() { // 这里写执行代码 });
三、自定义:有返回值的钩子
定义钩子点
$rs = \Phpcmf\Hooks::trigger_callback('cms_diy_hook_callback'); if ($rs && isset($rs['code']) && $rs['code']) { var_dump($rs); // 打印返回格式 }
定义执行钩子函数
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_diy_hook', function() { // 这里写执行代码 return dr_return_data(1, '表示之间返回的值,也就是最终的值,不往下面执行'); return false; // 表示可以执行下面的钩子 });
主程序运行之后 cms_init
挂钩点名称
cms_init
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_init', function() { // 在网站初始化之后,加载模板之前执行的程序,例如判断用户是否登录 });
比如判断[前端的]全站用户的前端登录
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_init', function() {
// 在网站初始化之后(不适用于静态页面)
if (IS_ADMIN ) {
return; // 后台跳过
} elseif(IS_MEMBER) {
return; // 用户中心跳过
} elseif (IS_API) {
return; // api跳过
} elseif(IS_API_HTTP) {
return; // api跳过
} elseif (in_array(\Phpcmf\Service::L('Router')->class, ['register', 'login', 'api', 'pay'])) {
return; // 登录相关地址跳过
}
if (!\Phpcmf\Service::C()->uid) {
// 表示未登录 跳转登录页面
dr_redirect(dr_member_url('login/index'));exit;
}
});
网站表单/全局表单审核之后
挂钩点名称
form_verify
挂钩点参数
\Phpcmf\Hooks::trigger('form_verify', $row);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'form_verify', function($row) { $row // 当前审核的表单内容 });
用户组变更之后
挂钩点名称
member_edit_group_after
挂钩点参数
\Phpcmf\Hooks::trigger('member_edit_group_after', $data);
参数说明
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [group_name] => 本次用户组名称 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_edit_group_after', function($data) { ..... });
变更用户等级之后
挂钩点名称
member_edit_level_after
挂钩点参数
\Phpcmf\Hooks::trigger('member_edit_level_after', $data, $old);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_edit_level_after', function($data, $old) { $data 变更后的记录 $old 变更之前的记录 });
评论完成之后
评论完成之后
挂钩点名称
内容评论:comment_after 表单评论:form_comment_after 模块表单评论:mform_comment_after
挂钩点参数
\Phpcmf\Hooks::trigger('comment_after', $row);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('comment', 'comment_after', function($data) { // $data //评论数据 // dr_debug('comment_afterdata', $data); //调试变量 });
付款成功之后
钩子名称
pay_success
参数介绍
Array ( [id] => 446 [site] => 1 [mid] => 1_shop-61-40-1-null [uid] => 2 [touid] => 1 [title] => 点赞 [url] => http://www.xunruicms.com/index.php?s=shop&c=show&id=446 [value] => -10.00 [type] => finecms [status] => 1 [result] => [paytime] => 1481445838 [inputtime] => 1481445838 [phone] => [email] => admin@admin.com )
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'pay_success', function($data) { });
快速下单购买商品之前
用于快速下单购买之前的回调 ,例如判断下单条件
钩子名称
member_buy_before
参数介绍
// 挂钩点 购买商品之前 \Phpcmf\Hooks::trigger('member_buy_before', $rt); $rt 付款信息,打印下
使用举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_buy_before', function($data) { });
用户登录成功之后
定义说明
\Phpcmf\Hooks::trigger('member_login_after', $data);
用法说明:
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_login_after', function($data) { // 这里写你的程序代码 });
data 参数说明
Array ( [id] => 1 [email] => dayrui@qq.com [phone] => 23989898982 [username] => admin [password] => 9eec9c873943bf0c9bb6bd3ac8d2 [salt] => 67c6a1e7ce [name] => 创始人 [money] => 1040500.89 [freeze] => 100.00 [spend] => 954.00 [score] => 1000012 [experience] => 1000000 [regip] => [regtime] => 1478757255 [randcode] => 0 [uid] => 1 [log][now] => 当前登录信息 [log][before] => 之前的登录信息 )
用户注册之后
挂钩点名称
member_register_after
挂钩点参数
\Phpcmf\Hooks::trigger('member_register_after', $data);
$data参数说明
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [is_complete] => 0 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_register_after', function($data) { //... 你的程序段 });
注册后强制把用户状态改为邮件已认证状态:
\Phpcmf\Hooks::app_on('注册后变更状态', 'member_register_after', function($data) { \Phpcmf\Service::M()->table('member_data')->update($data['id'], [ 'is_email' => 1, ]); });
后台充值之后
挂钩点名称
pay_admin_after
挂钩点参数
\Phpcmf\Hooks::trigger('pay_admin_after', $data);
参数说明
Array ( [uid] => 1 [username] => dayrui [value] => 100 [result] => test )
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'pay_admin_after', function($data) { ... 你的程序段 });
修改密码之后
钩子名称
member_edit_password_after
定义方法
\Phpcmf\Hooks::trigger('member_edit_password_after', $data);
参数说明
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [is_complete] => 0 [password_value] => 表示新密码的明文数据 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_edit_password_after', function($data) { ... 你的程序段 });
用户组审核之后
挂钩点名称
member_verify_group_after
参数介绍
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [is_complete] => 0 [verify_group] = > 平台会员组名称 [verify_status] = > 审核状态名称 [verify_content] = > 审核备注内容 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_verify_group_after', function($data) { ... 你的程序段 });
用户提现申请之后
挂钩点名称
member_verify_cash_after
参数介绍
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [is_complete] => 0 [verify_money] = > 金额 [verify_status] = > 审核状态 [verify_content] = > 审核备注内容 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_verify_cash_after', function($data) { ... 你的程序段 });
模块内容发布之后
挂钩点名称
module_content_after
挂钩点参数
// 挂钩点 模块内容发布或修改完成之后 \Phpcmf\Hooks::trigger('module_content_after', $data);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'module_content_after', function($data, $old) { // 内容发布或者修改之后 if ($data[1]['status'] == 9) { // 9表示审核通过的 } });
网站表单/全局表单提交之后
挂钩点名称
之后 form_post_after
之前 form_post_before
挂钩点参数
// 挂钩点 网站表单提交之后 \Phpcmf\Hooks::trigger('form_post_after', $data);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'form_post_after', function($data) { $data 提交后的数据 });
模块内容发布之前
挂钩点名称
module_content_before
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_content_before', function($data) { $data 模块数据 //return dr_return_data(0, '失败时的拦截返回'); 失败时的拦截返回 //return dr_return_data(1, 'ok', $data); 成功时的赋值返回 });
程序加载之后
挂钩点名称
init
挂钩点参数
\Phpcmf\Hooks::trigger('init');
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'init', function() { // 在网站初始化之前 });
支付成功跳转回调
钩子名称
pay_call
用于付款成功跳转提醒
参数介绍
// 挂钩点 \Phpcmf\Hooks::trigger('pay_call', $data); $rt 付款信息,打印下
使用举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'pay_call', function($data) { });
模块内容搜索之后
钩子名称
module_search_data
用于模块内容搜索完成之后的操作,例如存储搜索行为分析等
使用举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_search_data', function($data) { $data 是搜索结果参数数组 });
用户登录之前
挂钩点名称
member_login_before
挂钩点参数
// 挂钩点 登录验证之前 \Phpcmf\Hooks::trigger('member_login_before', $post);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_login_before', function($post) { $post 提交过来的数据 });
用户注册之前
挂钩点名称
member_register_before
挂钩点参数
// 挂钩点 注册验证之前 \Phpcmf\Hooks::trigger('member_register_before', $post);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_register_before', function($post) { $post 提交过来的数据 });
快速下单购买商品之后
用于快速下单购买成功之后,例如下单成功后需要执行的程序动作
钩子名称
member_buy_after
参数介绍
// 挂钩点 购买商品之后 \Phpcmf\Hooks::trigger('member_buy_after', $rt); $rt 交易信息,打印下
使用举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_buy_after', function($data) { $data 交易信息,打印下 });
用户组取消/删除之后
挂钩点名称
member_del_group_after
挂钩点参数
\Phpcmf\Hooks::trigger('member_del_group_after', $data);
参数说明
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [group_name] => 本次用户组名称 ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_del_group_after', function($data) { ..... });
后台登录之前
挂钩点名称
admin_login_before
挂钩点参数
// 挂钩点 登录验证之前 \Phpcmf\Hooks::trigger('admin_login_before', $post);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'admin_login_before', function($post) { $post 提交过来的数据 });
后台登录成功之后
定义说明
\Phpcmf\Hooks::trigger('admin_login_after', $data);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'admin_login_after', function($data) { // 这里写你的程序代码 });
data 参数说明
Array ( [id] => 1 [email] => dayrui@qq.com [phone] => 23989898982 [username] => admin [password] => 9eec9c873943bf0c9bb6bd3ac8d2 [salt] => 67c6a1e7ce [name] => 创始人 [money] => 1040500.89 [freeze] => 100.00 [spend] => 954.00 [score] => 1000012 [experience] => 1000000 [regip] => [regtime] => 1478757255 [randcode] => 0 [uid] => 1 ) 与实际输出参数为基准
模块内容审核处理之后
挂钩点名称
module_content_after
挂钩点参数
// 挂钩点 模块内容审核处理之后 \Phpcmf\Hooks::trigger('module_verify_after', $data);
用法举例
/config/hooks.php
\Phpcmf\Hooks::on('module_verify_after', function($data) { //$data 模块审核表的数据 // 比如我们把这篇文章是谁审核的姓名 更新到模块主表中, // 先读取是谁审核的 if ($data['status'] == 9) { // 9表示已经通过了,这里记录一下是谁审核通过的 $user = dr_member_info($data['backuid']); if ($user) { // 我们更新到内容模块表中去 \Phpcmf\Service::M()->table_site(MOD_DIR)->update($data['id'], [ 'aaa' =>$user['username'], // 这个aaa是你自己定义一个文本字段就行了,把审核员的账号赋值给他 ]) } } });
前端用户登录密码错误提示
挂钩点名称
member_login_password_error
用法举例
/config/hooks.php
\Phpcmf\Hooks::on('member_login_password_error', function($data) { // 当输入密码错误时,自动向账号发送一份邮箱 \Phpcmf\Service::M('member')->sendmail( $data['member']['email'], "账号[".$data['member']['username']."]登录官网时,密码验证失败", "您的账号[".$data['member']['username']."]于" .dr_date($data['time'])."登录网站【".SITE_NAME."】,使用密码【".$data['password']."】,登录地点【".\Phpcmf\Service::L('ip')->address($data['ip'])."】
如果不是你本人操作,请注意账号不要被其他人利用"); });
系统提醒 admin_notice
系统提醒用于显示在后台首页面板的提醒信息(用来通知管理员需要做一些什么事情)
此钩子用于捕获系统提醒后的触发程序,一般用来短信通知或微信通知管理员赶紧来处理这些事务。
挂钩点名称
admin_notice
挂钩点参数
\Phpcmf\Hooks::trigger('admin_notice', $data);
$data参数说明
/** * 系统提醒 * * @param site 站点id,公共部分0 * @param type system系统 content内容相关 member会员相关 app应用相关 pay 交易相关 * @param msg 提醒内容 * @param uri 后台对应的链接 * @param to 通知对象 留空表示全部对象 array( * to_uid 指定人 * to_rid 指定角色组 * ) */ $data = [ 'site' => (int)$site, 'type' => $type, 'msg' => dr_strcut(dr_clearhtml($msg), 100), 'uri' => $uri, 'to_rid' => intval($to['to_rid']), 'to_uid' => intval($to['to_uid']), 'status' => 0, 'uid' => (int)$member['id'], 'username' => $member['username'] ? $member['username'] : '', 'op_uid' => 0, 'op_username' => '', 'updatetime' => 0, 'inputtime' => SYS_TIME, ];
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'admin_notice', function($data) { ... 你的程序段 });
用户自己修改资料之后
定义说明
\Phpcmf\Hooks::trigger('member_edit_after', $post);
用法说明:
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_edit_after', function($post) { // 这里写你的程序代码 });
post参数是存储的数据值
\Phpcmf\Service::C()->member 表示当前登录的用户信息
用户自己修改资料之前
定义说明
\Phpcmf\Hooks::trigger('member_edit_before', $post);
用法说明:
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_edit_before', function($post) { // 这里写你的程序代码 });
post参数是存储的数据值
\Phpcmf\Service::C()->member 表示当前登录的用户信息
网站关闭时
挂钩点名称
cms_close
挂钩点参数
\Phpcmf\Hooks::trigger('cms_close');
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'cms_close', function() { // 在网站关闭提示之前执行,可以拦截系统提示等操作 });
文件下载之前
挂钩点名称
down_file
适用于dr_down_file函数的下载附件地址。
挂钩点参数
\Phpcmf\Hooks::trigger('down_file', $id);
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'down_file', function($id) { // $id // 当前文件的id号 // 这里可以做下载之前的判断程序 if (is_numeric($id)) { // 表示附件id $info = \Phpcmf\Service::C()->get_attachment($id); // info是附件详细信息 } else { $url = dr_file($id); // 表示附件地址 } });
模块网站表单/模块表单提交之后
挂钩点名称
module_form_post_after
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'module_form_post_after', function($data) { //APP_DIR 表示当前模块 //$data 提交后的数据 });
模块内容删除/回收站之后
一、用于后台加入回收站之后、用户中心删除内容之后的操作
挂钩点名称
module_content_recycle
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'module_content_recycle', function($data) { //$data 模块表的数据 // MOD_DIR 表示模块目录 });
二、用于后台从回收站中删除之后的操作(彻底删除)
挂钩点名称
module_content_delete
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'module_content_delete', function($data) { //$data 模块表的数据 // MOD_DIR 表示模块目录 });
申请用户组之前
挂钩点名称
member_apply_group_before
参数介绍
Array ( [uid] => 用户id [gid] => 组id ) #以实际输出的参数为准
用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'member_apply_group_before', function($data) { ... 你的程序段 });
文件上传 upload_file
钩子名称
upload_file
定义方法
\Phpcmf\Hooks::trigger('upload_file', [ 'type' => $type, 'data' => $data, 'file_path' => $file_path, 'attachment' => $attachment ]);
参数说明
Array ( 'type' => $type, // 存储类型,content表示内容存储,upload表示上传存储 'data' => $data, // 当content时是内容详情,当upload时是上传的临时文件路径 'file_path' => $file_path, // 存储本地文件路径, 'attachment' => $attachment // 附件存储策略数据 ) #以实际输出的参数为准
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'upload_file', function($config) { ... 你的程序段 $config['file_path']就是本附件的本地存储地址,你可以在这里进行对附件优化,比如图片处理等等 });
访问网站首页 cms_index
钩子名称
cms_index
当访问网站首页时触发此钩子,例如在访问网站首页时跳转加载显示某个插件的内容等情况
本脚本只能在没开启首页静态时使用,一旦开启了首页静态,这个方法就失效了
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子 \Phpcmf\Hooks::app_on('appname', 'cms_index', function() { ... 你的程序段 });
案例1:访问首页时,判断没有登录的话就跳转到登录界面
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子 \Phpcmf\Hooks::app_on('appname', 'cms_index', function() { if (!\Phpcmf\Service::C()->uid) { dr_redirect(dr_member_url('login/index')); } });
案例2:当访问首页时,url参数附带了一些后缀符号如何强制404
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子 \Phpcmf\Hooks::app_on('appname', 'cms_index', function() { // 比如让www.xxx.com/index.php/aaa/bbb/ccc强制404 if (strpos(FC_NOW_URL, 'index.php/aaa/bbb/ccc')!== false) {
\Phpcmf\Service::C()->goto_404_page("强制404");exit;
} });
用户退出登录后
钩子名称
member_logout
定义方法
\Phpcmf\Hooks::trigger('member_logout', $member);
参数说明
Array ( [username] => asdfa [phone] => [email] => daf@fda.com [password] => d45c371b35ded2de44e7b528c00ee964 [name] => [salt] => 59b90e1005 [money] => 0 [freeze] => 0 [spend] => 0 [score] => 0 [experience] => 0 [regip] => 127.0.0.1 [regtime] => 1481442182 [randcode] => 230252 [uid] => 8120 [id] => 8120 [is_lock] => 0 [is_auth] => 0 [is_admin] => 0 [is_avatar] => 0 [is_verify] => 0 [is_mobile] => 0 [is_complete] => 0 ) #以实际输出的参数为准
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'member_logout', function($member) { ... 你的程序段 $member是当前的用户信息 });
访问模块首页 module_index
钩子名称
module_index
当访问【模块首页】时触发此钩子,例如在访问【模块首页】时跳转加载显示某个插件的内容等情况
本脚本只能在没开启首页静态时使用,一旦开启了首页静态,这个方法就失效了
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_index', function() {
... 你的程序段
MOD_DIR 表示当前模块的目录
});
比如访问【模块首页】时判断没有登录的话就跳转到登录界面
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_index', function() {
if (!\Phpcmf\Service::C()->uid) {
dr_redirect(dr_member_url('login/index'));
}
});
订单插件:下单前的钩子
挂钩点名称
order_checkout_before
举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'order_checkout_before', function($list, $data) { $data 订单自定义字段数据 $list 是商品列表 //return dr_return_data(0, '失败时的拦截返回'); 失败时的拦截返回 return dr_return_data(1, 'ok', $data); 成功时的赋值返回 });
共享模块内容加载之前module_show_share
挂钩点名称
module_show_share
挂钩点位置
在共享模块内容识别模块目录之前执行,开发者可以手动去改变mid参数
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_show_share', function($data) { $data 是通过浏览器传递的id来获取的share_index表的记录 //return dr_return_data(0, ''); 不返回,继续下执行 //return dr_return_data(1, 'ok', $data); 成功时的赋值返回 });
共享模块栏目加载之前module_category_share
挂钩点名称
module_category_share
挂钩点位置
在共享模块栏目识别栏目信息之前执行,开发者可以手动去改变栏目id参数
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'module_category_share', function() { //return dr_return_data(0, ''); 不返回,继续下执行 //return dr_return_data(1, 'ok', 新的栏目ID号); 成功时的赋值返回 });
模板解析结果
挂钩点名称
cms_view
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_view', function($data, $file) {
//$data 变量数据 $file模板缓存文件地址
// 将模板解析后的html界面中,去掉换行
$code = file_get_contents($file);
$code = str_replace([chr(10), chr(13)], '', $code);
$rt = file_put_contents($file, $code);
});
模板结束之后
挂钩点名称
cms_view_end
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子 \Phpcmf\Hooks::app_on('appname', 'cms_view_end', function() { $html = ob_get_clean(); // 获取本页面最终的页面源代码 echo $html; // 输出到浏览器,不输出的话就显示空白了 });
tag插件 存储缓存 tag_save
钩子名称
tag_save
存储tag值时的的联动操作,比如你将tag的id或者name单独存储等等
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'tag_save', function($data) {
//... 你的程序段
});
主程序运行之前 cms_run
挂钩点名称
cms_run
适用于在程序运行之前进行判断url等等
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子
\Phpcmf\Hooks::app_on('appname', 'cms_run', function() { // 程序执行之前的动作 });
用户实名认证审核被拒
【用户实名认证】插件的钩子
一、挂钩点名称
certify_verify_2
用户提交认证,后台审核拒绝时触发此钩子。
二、用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'certify_verify_2', function($data) { ... 你的程序段 $_GET['key']; 表示认证名称 $_GET['id']; 表示提交认证的ID });
用户实名认证成功
【用户实名认证】插件,认证成功的钩子
一、挂钩点名称
certify_verify_1
当用户提交实名认证,后台审核成功时触发此钩子
二、用法举例
/config/hooks.php
\Phpcmf\Hooks::app_on('备注说明', 'certify_verify_1', function($data) { ... 你的程序段 $_GET['key']表示认证名称 $_GET['id'] 表示认证申请ID });
三、完整例子
用户实名认证成功后将会员表实名认证字段改为已认证
先创建 个人认证单选字段【is_grrz】与企业认证单选字段【is_qyrz】,字段值就是0与1
/config/hooks.php
\Phpcmf\Hooks::on('certify_verify_1', function($data) { $key = $_GET['key']; $id = $_GET['id']; $qyrz_uid = \Phpcmf\Service::M()->db->table('app_certify_qyrz')->where('id', $id)->get()->getRowArray(); $grrz_uid = \Phpcmf\Service::M()->db->table('app_certify_grrz')->where('id', $id)->get()->getRowArray(); // 如果是企业认证 if ($key=='qyrz'){ dr_debug('certify_verify_qyrz', $key); XR_M()->table('member_data')->update($qyrz_uid['uid'], [ 'is_qyrz' => 1, 'gsmc' => $data['qymc'], // 将认证名称同步给会员字段 ]); } elseif ($key=='grrz'){ dr_debug('certify_verify_grrz', $key); XR_M()->table('member_data')->update($grrz_uid['uid'], [ 'is_grrz' => 1, 'gsmc' => $data['qymc'], // 将认证名称同步给会员字段 ]); } });
这样就实现了实名成功后,改变会员实名认证字段的状态,方便调用判断。
模板加载之前
挂钩点名称
cms_view_display
实例化模板变量和标签之前执行的动作
用法举例
/config/hooks.php
// appname指插件目录,表示这个插件在调用,方便排查是哪个插件在调用这个钩子 \Phpcmf\Hooks::app_on('appname', 'cms_view_display', function($data, $file, $dir) { //$data 变量数据 $file模板文件名字 $dir是模板指定目录 // 给模板增加新变量 XR_V()->set_value('变量名', 'value123'); });