@servekon

Роли пользователя vs hook_user_presave

Предупреждение! В этом вопросе будет сразу ответ. Просто ниже предложенный текст как-то не тянет на полноценную статью.

Вообще hook_user_presave довольно капризная вещь и если работать с объектом $account, а не с массивом $edit для правильной отработки хука необходимо дважды сохранить профиль пользователя.

Условия:


  1. Используется hook_user_presave;
  2. В этом хуке используется массив $edit для использования в функции, которая манипулирует данными пользователя.
  3. В функции из пункта 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. Несколько часов потратил на поиск решения проблемы без такого «велосипеда». Если знаете как решить данную проблему более красивее, прошу в ответы.
  • Вопрос задан
  • 2786 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы