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