Drupal авто смена роли пользователя в модуле - PullRequest
0 голосов
/ 03 мая 2010

Я пытаюсь написать модуль, который будет изменять права пользователя после вставки формы узла в базу данных. Мне уже назначена роль, когда пользователь регистрируется, но я хочу, чтобы эта роль изменялась, когда они создают профиль «company» в этом случае, когда они заполняют форму cck типа «company_post». Мой код ниже ...

type == 'company_post') { } ?>

Я не уверен, что вставить в оператор if, потому что я действительно не знаю, как ссылаться на роли пользователей или как их менять. ? Поэтому мой вопрос: какой код я могу использовать, чтобы изменить текущую роль пользователя на новую? (Обе роли уже созданы в drupal и имеют отдельные разрешения)

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Для удаления фактически существует 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']);
0 голосов
/ 14 ноября 2012

Есть гораздо лучший способ сделать это ...
В ответ на ваше редактирование, если вы используете объект 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));
}
?>

Вуаля. Я здесь всю ночь ;)

0 голосов
/ 03 мая 2010

Вы не можете создавать общий код, так как Drupal использует идентификатор роли (освобождает) роли, являющейся последовательным.

Роли пользователей находятся в таблице user_roles, содержащей uid и rid, поэтому для удаления роли вы должны выполнить:

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);
...