You are here

4 班主任模块

admin 的头像
Submitted by admin on 星期三, 2015-06-24 09:59

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

    我们来看一个来自于实践的实例,有这样的一个网站需求,它用来展示一个中学各个班级的相关信息。注册用户为班级的班主任,每个班主任可以创建一个班级。在这里,班主任就是Drupal中的用户,班级就可以处理成为Drupal中的节点,一个用户只可以创建一个班级节点,这有相应的第三方模块可以控制,我们在这里不讨论这个。在这里,我们关注一个与我们的用户系统相关的需求,当班主任注册自己的帐户时,他希望能够同时输入班级的名字,在创建自己的帐户时,同时创建了班级节点;当班主任登录时,检查它所填写的班级信息的完整性,如果部分信息没有填完,将其重定向到班级的编辑页面,并提示他完善班级信息。

 

    为此,我们首先需要创建一个班级节点类型。导航到admin/structure/types,点击“添加内容类型”链接,在这里我们输入与班级相关的信息:

QQ截图20150624113023.png 

    注意这里面,机读名字的输入,它有点小技巧,首先在名称里面输入拼音,然后点击右边的编辑链接,然后再把名称里面的拼音改为中文。这是由于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。在上面的代码中,我们为注册表单添加了一个表单元素“班级名”,同时添加了一个提交处理函数。

 

    这样,当我们启用了这个模块后,换一个浏览器,使用匿名用户访问注册页面,此时我们就可以看到我们新加的“班级名”字段了。如图所示:

图片1.png 

    接下来,我们添加处理函数的相关代码:

/**

 * 为注册表单新增的一个处理函数,用来处理班级名和其它.

 */

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”,这个模块对于改造用户的个人主页,非常有帮助的,但是在这里,与我们的这个模块存在冲突。

 


Drupal版本: