Как назначить роль с PHP в Drupal? - PullRequest
4 голосов
/ 20 августа 2010

Мне нужно присвоить своего рода «премиальный статус» участникам, которые покупают сумму, равную или превышающую 100 € через PHP.

Условные действия уже настроены (пользователь = анонимный / аутентифицированный И общая сумма = равно / больше 100 И пользователь =! Премиум), но мне не хватает части PHP, чтобы фактически сказать «тогда предоставьте ему премиум-членство».

Как мне этого добиться?

РЕДАКТИРОВАТЬ: правильный код ниже?

if ($account) {
  $uid = $account->uid;
  $role_name = 'authenticated user';
  $rid = db_result(db_query("SELECT rid FROM {role} WHERE name = '%s'", $role_name));
  db_query("INSERT INTO {users_roles} (uid, rid) VALUES(%d, %d)", $uid, $rid);
  watchdog('user', 'uc ca added role to Ubercart created user');
}

Ответы [ 4 ]

6 голосов
/ 20 августа 2010

Вы можете сделать это с user_load() и user_save():

$uid = 1; // UID of user to add role to
$role_name = 'test role'; // Name of role to add

// Get RID of role
$rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));

// Load user object
$account = user_load(array('uid' => 1));

// Save the user object with the new roles.
if ($account !== FALSE && !isset($account->roles[$rid])) {
  $roles = $account->roles + array($rid => $role_name);
  user_save($account, array('roles' => $roles));
}

Если вы хотите сделать это массово для нескольких пользователей, есть user_multiple_role_edit():

$uids = array(1, 2, 3, 4); // UIDs of users to add role to
$role_name = 'test role'; // Name of role to add

// Get RID of role
$rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));

// Add the role to UIDs
user_multiple_role_edit($uids, 'add_role', $rid);

Редактировать

Если вы хотите сделать это для текущего пользователя (например, часть проверки, упомянутой вами в комментарии), вы можете сделать:

// Check for value over 100.00
if ($total_value > 100) {
  global $user; // Retrieve user object for currently logged in user.

  $role_name = 'test role'; // Name of role to add

  // Get RID of role
  $rid = db_result(db_query("SELECT r.rid FROM {role} r WHERE r.name = '%s'", $role_name));

  // Save the user object with the new role.
  if (!isset($user->roles[$rid])) {
    $roles = $user->roles + array($rid => $role_name);
    user_save($user, array('roles' => $roles));
  }
}
// Other code here.
3 голосов
/ 12 марта 2013

Хотя я бы обновил фрагмент кода для Drupal 7. В противном случае он работает нормально:)

$rid = db_query("SELECT r.rid FROM {role} r WHERE r.name = :rname", 
                array(':rname' => $role_name))->fetchField();
2 голосов
/ 22 мая 2013

Я бы лучше использовал user_role_load_by_name .

0 голосов
/ 30 августа 2013

для друпала 7:

     global $user; // Retrieve user object for currently logged in user.

  $role_name = 'test role'; // Name of role to add

  // Get RID of role
  $rid = db_query("SELECT r.rid FROM {role} r WHERE r.name = :rname", array(':rname' => $role_name))->fetchField();

  // Save the user object with the new role.
  if (!isset($user->roles[$rid])) {
    $roles = $user->roles + array($rid => $role_name);
    user_save($user, array('roles' => $roles));
  }

спасибо, Рикс.

...