2010-11-02 73 views
0

这里是我想解决的商业店铺的情景:定制看门狗记录

在网站管理员日志,用户创建订单,创建支付和/或订单的用户适用学分。

看门狗记录所有这些,但是作为管理员用户,当我们需要它作为客户用户时,采取行动(这样我们就可以在该人员上列出系统针对他们的账户所做的所有操作或订单)。

我看到看门狗有:

function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE, $link = NULL) { 
    global $user, $base_root; 

    // Prepare the fields to be logged 
    $log_message = array(
    'type' => $type, 
    'message' => $message, 
    'variables' => $variables, 
    'severity' => $severity, 
    'link' => $link, 
    'user' => $user, 
    'request_uri' => $base_root . request_uri(), 
    'referer' => referer_uri(), 
    'ip' => ip_address(), 
    'timestamp' => time(), 
); 

    // Call the logging hooks to log/process the message 
    foreach (module_implements('watchdog') as $module) { 
    module_invoke($module, 'watchdog', $log_message); 
    } 
} 

有没有办法覆盖全球$用户没有黑客的核心功能,而无需复制呢?

我可以以某种方式将$ user作为变量传递吗?我可以在watchdog()之前调用$ user = user_load($ customer-> uid)来诱骗它记录该用户吗?我希望记录的UID不是0或1,如果我可以帮助它的话,因为每个用户配置文件(账户,账单,订单等)跟踪系统某些方面的日志非常困难。

回答

0

试试这个代码:

global $user; 
    $original_user = $user; 
    session_save_session(FALSE); 
    $user = user_load(array("uid" => NEW_USER_UID));  
    watchdog(HERE); 
    $user = $original_user; // @TODO: switch user: user back  
    session_save_session(TRUE); 

我不喜欢这一点,但它的工作原理:)

+0

嘿,我喜欢这样的解决方案。 – ceejayoz 2010-11-02 22:26:20

3

你可能最好把它记录在一个单独的表中。看门狗用于临时系统消息,而不是面向用户的永久信息。如果没有其他的东西,它会定期清理在cron上,这可能会让用户失望。

但是,如果你这样做,看门狗功能有一个钩子,hook_watchdog,你的模块可以改变用户。你必须做一些聪明的消息文本 - 使它能够在钩子中解析和解压缩的序列化信息 - 但这当然是可能的。

+0

呀。这就是我所说的,但它现在是一个遗留系统。大约有一百万条看门狗记录。我不知道从哪里开始将它归档到新表中并将数据修复到正确的UID。 – Kevin 2010-11-02 15:00:36

+0

查看我的更新。 'hook_watchdog'可以做你需要的,但它需要一点工作。 – ceejayoz 2010-11-02 15:02:12