正文:
许多的扩展都依据当前的用户来决定具体显示什么。一个用户对象有很多中属性,其中我们比较感兴趣的属性有:
| 属性 | 描述 |
| activation | 用来激活新用户状态的字符串 |
| Aid | 权限组id |
| block | BOOL值 如果为空,那么就表示用户被禁止 |
| 用户的email地址 | |
| Gid | 用户组id |
| guest | BOOL值,如果为空,那么就表示用户没有登录 |
| Id | 用户ID,INT值,这个和用户名不同 |
| lastvistDate | 日期和时间 用户最后登录的日期和时间 |
| name | 用户名 |
| params | INI字符串参数 |
| password | 哈希加密的密码 |
| registerDate | 用户注册日期 |
| sendEmail | BOOL值,如果为真,表示用户接受系统邮件 |
| usename | 用户名 |
| usertype | 用户所属组的名称 |
当前正在浏览的对象用JUser来表示。我们可以通过JFactory::getUser()方法来访问这个对象。代码如下:
$user = & JFactory::getuser();
if($user->guest)
{
// user is a guest
}
用户参数
在$user对象中的参数属性是非常特殊的。我们设计一个INI字符串去存储附加的用户参数。默认的属性在User组件的根目录下的users.xml中声明。
下面是user.xml文件声明的属性:
| 参数 | 描述 |
| admin_language | 后台语言 |
| language | 前台语言 |
| editor | 使用的编辑器 |
| helpsite | 使用的帮会站点 |
| timezone | 使用的时区(UTC+0) |
去操控这些设置我们用getParam()和setParam()方法来完成。我们可以直接访问params属性,这样做的话,我们需要自己解析参数。下面的代码演示了我们怎样决定一个用户的时区设置:
// get the default time zone from the registry
$registry = & JFactory::getConfig();
$tzdefault = $registry->getValue('config.offset');
// get the user's time zone
$user = & JFactory::getuser();
$tz = $user->getParam('timezone',$tzdefault);
代码解释:
我们给getParam()用了一个默认值,这个值从网站的设置中提取。这个值是可选的。
下面的代码演示了怎样去修改用户的时区设置。
$user = & JFactory::getUser();
$user->setParam('timezone',0);
我们做的任何修改都只在用户会话的状态才有效,除非我们保存这些改变。用户参数不能作为一个零时数据。我们需要用session和用户state来完成零时数据的存储。
扩展用户属性通常有是那种方案;
- 在#__users 表中添加附加的字段
- 创建一个新的表,这个表和#__users表有一个一一对应关系
- 利用uses参数属性来存储附加的属性。
第一种方式会带来一些麻烦,最明显的一个就是如果有几个扩展都想扩展#__users表,那么很可能会出现命名冲突
第二种方法是一个不错的想法,特别适应于哪些需要被检索,可以进行查询的情况。但是为了成功的维护这个表,我们必须创建一个插件去处理onAgterStoreUser和onAfterDelteUser事件。
最后一种方案比较适合哪些不需要被检索到的字段。我们可以用三种方法来实现这种方案:
- 用setParam()方法手动编辑参数。如果参数很少或者用户不打算用表单来修改这个参数,那么这种方法就非常合适。
- 使用JParameter.如果用户打算通过使用表单来修改这个参数的话,那么这种方式还不错。
- 允许用户通过用户组件来修改参数。为了实现这个,我们需要修改users.xml文件。
在开始之前,我们需要理解一些事情。一个JUser对象最少需要两个参数,一个事RAW参数或者数组。另一个是JParameter 对象。
当用户对话开始的时候,这两个参数都自动从数据库加载。如果我们修改了这个参数,这种修改只会在本次会话有效。需要保存修改到数据库,可以用save()方法。这个方法将会依据RAW参数来更新参数。
当我们用setParam()方法,仅仅JParameter对象被修改了。这是因为在保存前我们必须更新RAW参数属性。在处理保存用户改变到user参数过程中,我们必须小心处理,这有可能造成数据丢失。
下面的例子演示了我们怎样设置user的foor参数并且将这个改变保存到数据库中:
// get the user and add the foo parameter
$user = & JFactory::getUser();
$user ->setParam('foo','bar');
// update the raw user parameters
$param= & $user->getParameters();
$user->set('params',$params->tostring());
// save the change to the database
if(!$user->save())
{
JError::raiseError('SOME_ERROR',JTEXT::_('Failed to save user'));
}