如何判断CS Cart Hook触发?验证change_order_status Hook正确性
验证
change_order_status Hook正确性的实操步骤 基础合规性排查(先排除低级匹配错误)
- 确认Hook函数命名完全符合框架规则
框架识别Hook的规则是fn_[当前插件唯一标识]_[Hook名称],你当前写的fn_dellyman_change_order_status里的dellyman,必须和你插件在系统里注册的标识完全一致,大小写、下划线偏差一个字符,框架都不会匹配到这个函数,Hook自然不会触发。 - 确认Hook注册位置正确
你写的fn_register_hooks('change_order_status'),必须放在对应插件根目录的init.php文件里,不能放在全局入口文件、其他模块的初始化文件中,否则框架加载插件时根本不会执行这个注册逻辑。 - 确认调试输出被拦截
后台切换订单状态默认走异步AJAX请求,框架会强制把响应内容封装为标准JSON格式,你写的var_dump($auth)产生的非JSON输出,会被直接拦截,这是绝大多数人看不到调试输出的核心原因。
无渲染依赖的触发验证方法
绕开页面渲染的影响,用日志记录的方式验证,不受AJAX、页面路由影响:
- 把Hook函数里的
var_dump($auth)替换为框架原生的日志写入逻辑:function fn_dellyman_change_order_status(&$status_to,&$status_from,&$order_info,&$force_notification,&$order_statuses,&$place_order) { // 写入调试日志 fn_log( 'change_order_status hook triggered', 'from: ' . $status_from . ' to: ' . $status_to . ' order_id: ' . $order_info['order_id'], json_encode($_SESSION['auth']) ); } - 手动在后台执行一次从
open切换到complete的订单状态变更操作 - 查看系统日志记录:
- 如果日志里能找到刚才写入的调试记录,说明
change_order_statusHook本身选择正确,之前看不到输出只是因为AJAX流程拦截了var_dump内容 - 如果日志里没有对应记录,说明Hook根本没被触发,继续往下排查
- 如果日志里能找到刚才写入的调试记录,说明
Hook有效性排查
- 对照框架核心源码确认Hook的触发位置
全局检索源码中fn_set_hook('change_order_status'的代码行,确认这个Hook是在订单状态更新的核心流程中触发,没有被放在边缘的非状态变更分支里。从框架内置的Hook定义来看,这个Hook的触发时机完全匹配「订单状态完成更新后执行后续操作(比如自动派车)」的需求,参数里的新旧状态值、订单全量信息也足够支撑派车逻辑的取数要求。 - 核对函数参数顺序和Hook定义的一致性
部分旧版本框架中,Hook的参数顺序、传递方式如果和定义不匹配,会直接跳过Hook调用。逐行对照源码里fn_set_hook('change_order_status'行传递的参数:既要保持参数顺序完全一致,也要保留原有的引用传递(&)格式,顺序错位、改成值传递哪怕函数名正确也无法正常触发。
快速调试的临时方案
如果不想写日志,可以临时关闭订单状态变更的AJAX请求:在触发状态切换的请求里,临时去掉ajax=1的参数,让请求变成整页刷新的同步请求,这时候你写的var_dump输出就会直接渲染在页面上,能第一时间确认是否触发,调试完成后再改回异步模式即可。
内容的提问来源于stack exchange,提问作者uhexos
相关产品推荐
相关产品推荐

