Как назначить роль с PHP в Drupal?
Мне нужно присвоить своего рода "премиум-статус" участникам, которые покупают сумму, равную или превышающую 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 answers
Вы можете сделать это с помощью 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.
Хотя я бы обновил фрагмент для Drupal 7. В противном случае он работает нормально:)
$rid = db_query("SELECT r.rid FROM {role} r WHERE r.name = :rname",
array(':rname' => $role_name))->fetchField();
Я бы предпочел использовать функцию user_role_load_by_name.
Для drupal 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));
}
Спасибо, Рикс.