作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
登录用户,必须启用cookie;匿名用户则不需要cookie。一个关闭了cookie的用户,仍然可以以匿名的身份与Drupal进行交互。
在引导指令流程的会话阶段,Drupal创建了一个全局$user对象,用来作为当前用户的标识。如果用户没有登录(这样就没有建立一个会话cookie),那么它将被当作匿名用户对待。创建匿名用户的代码如下所示(位于bootstrap.inc):
function drupal_anonymous_user() {
$user = new stdClass();
$user->uid = 0;
$user->hostname = ip_address();
$user->roles = array();
$user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
$user->cache = 0;
return $user;
}
另一方面,如果用户当前登录了,那么可以通过使用用户的ID,通过关联表users和sessions,来创建对象$user。两个表中的所有字段都放到了对象$user中。
注意:用户的ID是在用户注册时或者管理员创建用户时所分配的一个序列数。这个ID是users表中的主键。
我们可以向主题中的page.tpl.php添加以下代码:
<?php debug($user); ?>
这样我们就可以很容易的查看$user对象的内部结构了。下面是用户1的$user对象的一个实例结构:
stdClass::__set_state(array(
'uid' => '1',
'name' => 'admin',
'pass' => '$S$Cv6KBmupqlDMHO/yQ4GadB.JGaRlASPQ3rtJ1SS0f.GiSvJO5BRM',
'mail' => 'g089h515r806@gmail.com',
'theme' => '',
'signature' => '',
'signature_format' => NULL,
'created' => '1297216111',
'access' => '1310787362',
'login' => '1308985143',
'status' => '1',
'timezone' => NULL,
'language' => '',
'picture' => '0',
'init' => 'g089h515r806@gmail.com',
'data' => false,
'sid' => 'Bjfjz8wSsOkQ1d7BeYfhzmerrpVfR2VM3MRjQuuciKU',
'ssid' => '',
'hostname' => '127.0.0.1',
'timestamp' => '1310787484',
'cache' => '0',
'session' => 'batches|a:1:{i:2;b:1;}updates_remaining|a:0:{}',
'roles' =>
array (
2 => 'authenticated user',
3 => 'administrator',
),
))
在上面显示的$user对象中,斜体字段意味着数据来自于sessions表。表6-1解释了$user对象的组成部分:
表6-1 $user的组成部分
组成 描述
来自于表users
uid 用户ID。它是表users的主键,在Drupal系统中是唯一的。
name 用户的用户名,在用户登录时使用。
pass 用户的SHA哈希密码,在用户登录时进行对比。由于没有保存用户的原始明文密码,所以密码只能被重置,不能被恢复。
mail 用户当前的email地址。
theme 用户的默认主题。
signature 用户在他/她的账号页面所输入的签名。只有当评论模块(comment module)启用时,当用户添加一个评论时,才会看到签名。
signature_format 签名的文本格式。
created 用户账号创建时的Unix时间戳。
access 用户最近一次访问的Unix时间戳。
login 用户最近一次成功登录的Unix时间戳。
status 1表示正常激活的用户,0表示被拒绝访问的用户。
timezone 用户时区与GMT之间的差异,以秒为单位。
language 用户的默认语言。只有在站点上启用了多语言,并且用户通过编辑账号选择了一个优先语言时,才不为空。
picture 用户头像图片的文件ID。
init 用户注册时提供的初始email地址。
data 这个字段在Drupal7中,不建议使用。请使用Field API来保存需要存储的数据。
来自于表user_roles
roles 分配给当前用户的角色。
来自于表session
sid 通过PHP分配给当前用户会话的会话ID。
Ssid 安全会话ID。
hostname 用户浏览当前页面时所使用的IP地址。
timestamp 一个Unix时间戳,表示用户的浏览器最近接收一个完整页面的时间。
cache 一个用于per-user caching(参看 includes/cache.inc)的时间戳
session $_SESSION的序列化内容。在用户会话期间,模块可以向这里存储任意数据。