作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们来看一个来自于实践的实例,有这样的一个网站需求,它用来展示一个中学各个班级的相关信息。注册用户为班级的班主任,每个班主任可以创建一个班级。在这里,班主任就是Drupal中的用户,班级就可以处理成为Drupal中的节点,一个用户只可以创建一个班级节点,这有相应的第三方模块可以控制,我们在这里不讨论这个。在这里,我们关注一个与我们的用户系统相关的需求,当班主任注册自己的帐户时,他希望能够同时输入班级的名字,在创建自己的帐户时,同时创建了班级节点;当班主任登录时,检查它所填写的班级信息的完整性,如果部分信息没有填完,将其重定向到班级的编辑页面,并提示他完善班级信息。
为此,我们首先需要创建一个班级节点类型。导航到admin/structure/types,点击“添加内容类型”链接,在这里我们输入与班级相关的信息:
注意这里面,机读名字的输入,它有点小技巧,首先在名称里面输入拼音,然后点击右边的编辑链接,然后再把名称里面的拼音改为中文。这是由于Drupal对中文的支持不大友好,不过这并不影响使用。
除非我们把系统中的注册用户用作班主任,否则我们还需要创建一个“班主任”用户角色,导航到admin/people/permissions/roles,在这里我们添加一个“班主任”角色。接着编辑班主任的权限,授予它创建编辑班级节点的权限,也就是“班级: 创建新内容”、“班级: 编辑自己内容”。
这样我们就完成了前期的准备工作。让我们来创建这个模块,不妨把我们的模块命名为“class_teacher”,中文名字就叫作“班主任”。和前面一样,我们先准备好文件夹class_teacher,然后向里面添加class_teacher.info、 class_teacher.module文件。
我们向info文件中,添加以下内容,注意文件本身的编码格式:
name = 班主任
description = 在注册班主任用户时,为其添加一个班级节点
core = 7.x
接着,我们向module文件中添加实际的逻辑代码,我们首先实现在用户注册表单上显示一个文本框字段“班级名”,以供用户注册时输入使用。在里面输出以下代码:
<?php
/**
* @file
* 在注册班主任用户时,为其添加一个班级节点.
*/
/**
* 实现钩子hook_form_FORM_ID_alter().
*/
function class_teacher_form_user_register_form_alter(&$form, &$form_state) { $form['class_name'] = array(
'#type' => 'textfield',
'#title' => t('班级名'),
'#maxlength' => 255,
'#description' => t('请输出您所管理的班级名.') ,
'#weight' => 1,
);
$form['#submit'][] = 'class_teacher_user_register_submit';
}
在这里面,我们再次使用了hook_form_FORM_ID_alter钩子函数,注意这里面用户注册所用的表单ID为user_register_form。在上面的代码中,我们为注册表单添加了一个表单元素“班级名”,同时添加了一个提交处理函数。
这样,当我们启用了这个模块后,换一个浏览器,使用匿名用户访问注册页面,此时我们就可以看到我们新加的“班级名”字段了。如图所示:
接下来,我们添加处理函数的相关代码:
/**
* 为注册表单新增的一个处理函数,用来处理班级名和其它.
*/
function class_teacher_user_register_submit($form, &$form_state){
//全局用户,也就是当前新注册用户
global $user;
//班级名的值
$class_name = $form_state['values']['class_name'];
//新建一个节点对象
$node = new stdClass();
//为节点对象赋值
$node->title = $class_name;
$node->uid = $user->uid;
$node->type = 'banji';
//保存节点对象
node_save($node);
//将用户的角色设置为班主任,这里班主任的role id为4
$roles = array(
2 => 'authenticated user',
4 => '班主任',
);
//保存用户对象
user_save($user,array('roles' => $roles));
}
这段代码有详细的注释,它的作用就是保存班级节点,设置新建用户的角色。注意,如果我们将设置用户角色的代码修改为:
//将用户的角色设置为班主任,这里班主任的role id为4
$user->roles = array(
2 => 'authenticated user',
4 => '班主任',
);
//保存用户对象
user_save($user);
此时我们并不能有效地设置用户的角色。这里需要注意一下,这段不工作的代码,是很多时候第一时间所想到的,我最初也这样写。这应该和user_save本身的机制有关系。我们在这里不做更深的研究,有兴趣的读者可以自己研究一下,为什么不工作。
如果你一直在使用本教程里面的模块进行练习,并且在同一站点,那么我们此时需要禁用我们在菜单系统一章用到个人中心模块“my”,这个模块对于改造用户的个人主页,非常有帮助的,但是在这里,与我们的这个模块存在冲突。