WHMCS 动作挂钩未触发

WHMCS Action Hooks Not Firing

我的头一直在桌子上敲了一个星期,终于决定是时候寻求帮助了。

我正在尝试为 WHMCS 创建操作挂钩,以便在客户端执行特定操作时使用。例如,我只是想让它达到 return 它获取的变量。基本上我只需要用户 ID,但出于测试目的,我要求它 return 几个变量。

下面是我的代码示例:

/*
 * Define Hook Functions 
*/
function hook_changedpassword($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    return print_r($vars);
}

function hook_clientmerged($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    return print_r($vars);  
}

function hook_clientupdated($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    return print_r($vars);  
}

function hook_emailverification($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    return print_r($vars);  
}

/*
 * Start Add Hook Functions 
*/

// when client changes portal password
add_hook('ClientChangePassword', 1, "hook_changedpassword");

// when client accounts are merged.
add_hook('AfterClientMerge', 1, "hook_clientmerged");

// when client updates client details
add_hook('AfterClientMerge', 1, "hook_clientupdated");

// when client verifies email address
add_hook('ClientEmailVerificationComplete', 1, "hook_emailverification");

它没有与任何模块或插件相关联,我不知道这是否是问题所在,但 Hooks Wiki 表明无论如何,这些都会在执行这些操作时得到处理。

如有任何帮助,我们将不胜感激。

如果勾选 Hook documentation, some hooks doesn't support returning any values, for example, AfterClientMerge,不支持回复。

可能您的钩子正在发射,但它们什么也没做。 WHMCS 以某种方式抑制某些挂钩中的浏览器输出,甚至 echo 也不会显示输出。

此类挂钩预期会执行某个操作,例如更新数据库 table 或发送电子邮件等

对于调试,使用以下语句将变量输出到文件而不是将它们输出到浏览器:

error_log(print_r($vars, true), 3, __DIR__.'/file.log');

函数变为:

function hook_clientmerged($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    error_log(print_r($vars, true), 3, __DIR__.'/file.log');  
}

编辑:将数据插入数据库

文件:example_hook.php

<?php
use WHMCS\Database\Capsule as DB;

function hook_clientmerged($vars) {
    $userid = $vars['userid'];
    $firstname = $vars['firstname'];
    $lastname = $vars['lastname'];
    $email = $vars['email'];
    $password = $vars['password'];

    //Insert vars in the database
    DB::table('table_name')->insert(
        ['field1' => $userid, 'field2' => $firstname]
    ); 
}

所以您需要跟踪三个阶段来调试它:

1) 是否正在加载挂钩?您可以通过启用挂钩调试来检查这一点:

https://docs.whmcs.com/Other_Tab#Hooks_Debug_Mode

2) 钩子在发射吗?启用挂钩调试后,您可以执行操作并通过查看 activity 日志确保附加到的挂钩点正在触发。

3) 你的钩子代码执行了吗?一旦你知道挂钩点被触发,你就想表明你的代码正在执行。我首选的简单方法是使用 logActivity() 函数:

https://developers.whmcs.com/advanced/logging/

检查触发挂钩时存在哪些变量的简单方法是:

logActivity('Hook variables: '.print_r($vars, true));