二次开发文档:钩子开发

钩子开发说明

钩子特性提供了一种方法来修改框架的内部运作流程,而无需修改核心文件。

有些时候你可能希望在执行流程中的某些阶段添加一些动作,例如在控制器加载之前或之后执行一段脚本, 或者在其他的某些位置触发你的脚本。

钩子程序文件

./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

系统提醒用于显示在后台首页面板的提醒信息(用来通知管理员需要做一些什么事情)
image
此钩子用于捕获系统提醒后的触发程序,一般用来短信通知或微信通知管理员赶紧来处理这些事务。


挂钩点名称

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

image


/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');

});