我在自定义模块中有以下代码,用于在登录后保存session_id以进行比较。我想将其添加到用户对象,因此我调用了hook_user,如下所示:
function mymodule_init() {
global $user;
if ($user->uid == 0 && !isset($_SESSION['anonymous_session_id'])) {
$_SESSION['anonymous_session_id'] = session_id();
}
}
function mymodule_user($op, &$edit, &$account, $category = NULL) {
switch ($op) {
case 'load':
$user->anonymous_session_id = $_SESSION['anonymous_session_id'];
break;
default:
break;
}
}
但是,它不在用户对象中。有一个'session'字段有一个$ _SESSION信息的序列化数组,这意味着我可能不需要hook_user,但为什么这段代码不起作用?
答案 0 :(得分:5)
您遇到两个问题:
hook_user()
中的用户对象不在$user
中(它不是参数之一):它实际上位于$account
。$user
期间修改$account
后,全局hook_user()
对象也未完全加载(请参阅related issue)。要获取满载的用户对象,请执行以下操作:
global $user;
$account = user_load(array($user->uid));
要记住的一件事是,除非您运行user_save()
,否则在$user
期间添加到hook_user($op = 'load')
对象的信息不会在页面之间传输:hook_user()
每次加载用户时都会调用,这至少是一次页面。如果要在不使用数据库的情况下维护会话信息,请使用$_SESSION
。