Предупреждение! В этом вопросе будет сразу ответ. Просто ниже предложенный текст как-то не тянет на полноценную статью.
Вообще hook_user_presave довольно капризная вещь и если работать с объектом $account, а не с массивом $edit для правильной отработки хука необходимо дважды сохранить профиль пользователя.
Условия:
- Используется hook_user_presave;
- В этом хуке используется массив $edit для использования в функции, которая манипулирует данными пользователя.
- В функции из пункта 2 используется
user_access('administer role',$edit);
Проблема:
user_access('administer role',$edit);
вернет TRUE в любом случае(на самом деле возвращает массив, где указано, что пользователь имеет права доступа к чему угодно).
Задача:
Сделать так, чтобы массив $edit['roles'] был правильным для функции user_access();
Решение:
В хук добавляем следующий код:
foreach($edit['roles'] as $key=>$val){
if((bool)$val){
$role = user_role_load($key);
$edit['roles'][$key] = $role->name;
}
else{
unset($edit['roles'][$key]);
}
}
unset($key,$val);
Профит!
P.S. Несколько часов потратил на поиск решения проблемы без такого «велосипеда». Если знаете как решить данную проблему более красивее, прошу в ответы.