Drupal自动更改模块中的用户角色

时间:2010-05-03 03:12:50

标签: drupal module roles

我正在尝试编写一个模块,一旦将节点表单插入到数据库中,该模块将更改用户的权限。我已经在用户注册时分配了一个角色,但是我希望在这种情况下创建“公司”配置文件时更改该角色,即在他们填写“company_post”类型的cck形式时。我的代码如下......

type =='company_post'){                 } ?>

我不确定在if语句中放什么,因为我真的不知道如何引用用户角色或如何更改它们。 ? 所以我的问题是我可以使用哪些代码将用户当前角色更改为新角色? (这两个角色都已在drupal中创建并具有单独的权限)

3 个答案:

答案 0 :(得分:1)

要删除实际,有3个查询:

db_query('DELETE FROM {role} WHERE rid = %d', $form_state['values']['rid']);

db_query('DELETE FROM {permission} WHERE rid = %d', $form_state['values']['rid']);

// Update the users who have this role set:

db_query('DELETE FROM {users_roles} WHERE rid = %d', $form_state['values']['rid']);

答案 1 :(得分:0)

你不能制作通用代码,因为Drupal使用的是角色的角色id(rid),这是一个连续的角色。

用户角色位于包含uid和rid的user_roles表中,因此要删除您要执行的角色:

global $user;
$rid = x; // x = the id of the role to remove
db_query("DELETE FROM {user_roles} WHERE uid = %d AND rid = %d", $user->uid, $rid);

要提供新角色,您可以这样做:

$record = array(
  'uid' => $user->uid,
  'rid' => y, // y = the id of the role to give.
);
drupal_write_record('user_roles', $record);

答案 2 :(得分:0)

有一个更好的方法来实现这一目标...... 为了响应您的编辑,如果您使用global $user对象,那么下次更新节点的任何人也将应用角色(如果您决定将case 'update':添加到该函数或其他任何内容)。
相反,由于节点将分配$node->uid,因此请使用它。

<?php
function role_change_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
 switch ($op) {
  case 'insert':
  if ($node->type == 'company_post') {
   // Assuming the role id you want to assign is "3"...
   $role_id = 3;
   $role_name = db_result(db_query('SELECT name FROM {role} WHERE rid = %d',$role_id));
   $author = user_load(array('uid' => $node->uid));
   if ($author !== FALSE && !isset($author->roles[$role_id])) {
    $new_roles_combined_with_old_ones = $author->roles + array($role_id => $role_name);
    user_save($author, array('roles' => $new_roles_combined_with_old_ones));
   }
  }
  break;
 }
}
?>

或者,如果您想在可能没有$node->uid的情况下完成同样的事情,global $user也可以正常工作。 请记住,当您使用global $user时,更改将应用​​于当前登录并完成操作的人员的帐户。

<?php
global $user;
// Assuming the role id you want to assign is "5"...
$role_id = 5;
$role_name = db_result(db_query('SELECT name FROM {role} WHERE rid = %d', $role_id));
// Make sure user is valid, has a uid, and does't already have role 5 assigned to them.
if ($user !== FALSE && $user->uid && !isset($user->roles[$role_id])) {
  $new_roles_combined_with_old_ones = $user->roles + array($role_id => $role_name);
  user_save($user, array('roles' => $new_roles_combined_with_old_ones));
}
?>

瞧。我整晚都在这里。 ;)