Perfex CRM中after_invoice_added钩子测试失败问题咨询
问题分析与解决方案
哥们,我看你在Perfex CRM的after_invoice_added钩子上踩了几个小坑,咱们一个个来捋清楚:
1. 钩子函数里的前端代码完全无效(核心错误)
你在钩子函数里写了<script>alert('Hello, world!');</script>,这是行不通的!Perfex CRM的钩子是后端PHP钩子,运行在服务器端,不是前端浏览器环境,这种JS代码根本不会被执行,自然看不到任何效果。
2. 为什么add_invoice.log文件没生成?
首先你的钩子函数逻辑错误导致没执行,其次你也没写日志写入的代码。给你一个能正常生成日志的钩子示例:
hooks()->add_action('after_invoice_added','my_after_invoice_added'); function my_after_invoice_added($id) { // 定义日志文件路径,确保服务器有写入权限 $log_file = FCPATH . 'add_invoice.log'; // 写入内容,比如当前时间和发票ID $log_content = date('Y-m-d H:i:s') . " - 发票ID {$id} 已创建\n"; // 追加写入日志 file_put_contents($log_file, $log_content, FILE_APPEND); }
额外注意两点:
- 要确保
FCPATH(Perfex内置的根目录常量)对应的文件夹有写入权限,否则日志文件无法生成 - 确认钩子文件放在Perfex指定的钩子目录(通常是
application/hooks/),且config/hooks.php里已全局启用钩子(你说状态设为true,这部分没问题)
3. 如何获取发票提交的$data变量?
after_invoice_added钩子的官方参数只有$id(刚创建的发票ID),没法直接拿到提交的原始$data数组,但有两种办法解决:
方法一:通过发票ID查询完整数据
用Perfex的内置模型获取发票详情,就能拿到所有字段:
function my_after_invoice_added($id) { // 加载发票模型 $this->CI->load->model('invoices_model'); // 通过ID获取发票完整数据 $invoice_data = $this->CI->invoices_model->get($id); // 现在$invoice_data就是该发票的完整数组,包含提交的所有信息 // 可以写入日志验证 $log_file = FCPATH . 'add_invoice.log'; $log_content = date('Y-m-d H:i:s') . " - 发票数据:" . print_r($invoice_data, true) . "\n"; file_put_contents($log_file, $log_content, FILE_APPEND); }
方法二:改用before_invoice_added钩子
如果你需要在发票创建前获取提交的原始$data,可以换用before_invoice_added钩子,它的参数就是提交的$data数组:
hooks()->add_action('before_invoice_added','my_before_invoice_added'); function my_before_invoice_added($data) { // $data就是提交的原始数据,可以直接使用 $log_file = FCPATH . 'add_invoice.log'; $log_content = date('Y-m-d H:i:s') . " - 提交的发票数据:" . print_r($data, true) . "\n"; file_put_contents($log_file, $log_content, FILE_APPEND); }
4. 验证钩子是否触发的小技巧
除了日志,你还可以用更直观的方式测试,比如在钩子函数里发邮件确认:
function my_after_invoice_added($id) { $this->CI->load->library('email'); $this->CI->email->from('your@email.com', 'Perfex Hook Test'); $this->CI->email->to('test@email.com'); $this->CI->email->subject('发票创建钩子触发'); $this->CI->email->message('发票ID '.$id.' 已创建,钩子正常运行!'); $this->CI->email->send(); }
内容的提问来源于stack exchange,提问作者Waqas
相关产品推荐
相关产品推荐

