以下是我想为一家商业商店修复的场景:
站点管理员登录,为用户创建订单,为用户创建付款和/或在订单上应用积分。
Watchdog记录了所有这一切,但作为管理员用户,当我们需要它作为客户用户时,将对其执行操作(因此,我们可以在该人员帐户上列出系统对其帐户或订单执行的所有操作)。
我看到看门狗有:
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,而不需要修改核心函数和复制它?
我能以某种方式将$user作为变量传递吗?我可以在watchdog()之前调用$user = user_load($customer->uid)来欺骗它登录该用户吗?我希望记录的UID不是0或1,如果我可以帮助它,因为它真的很难跟踪系统的每个用户配置文件的某些方面的日志(帐户,账单,订单等)。
发布于 2010-11-03 02:56:38
尝试以下代码:
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);我不喜欢这样,但它是有效的:)
发布于 2010-11-02 22:59:17
您最好将其记录在一个单独的表中。Watchdog用于临时系统消息,而不是面向用户的永久信息。如果没有其他问题,它会在cron上定期清理,这可能会吓到用户。
但是,如果您打算这样做,watchdog函数有一个钩子hook_watchdog,您的模块可以在其中更改用户。您必须对消息文本做一些巧妙的处理-使其序列化信息,然后在钩子中解析和解包-但这当然是可能的。
https://stackoverflow.com/questions/4078861
复制相似问题