Respostas:
Como você já encontrou essa postagem , leia também os comentários. Explica claramente por que é recomendável verificar uma permissão em vez de verificar uma função. Ao usar permissões, você pode atribuir essa permissão a várias funções, o que torna seu sistema mais flexível. Além disso, lembre-se de que as funções podem ser renomeadas, o que quebraria seu código.
Dito isto, se você deseja verificar uma função, pode fazer o seguinte:
// Load the currently logged in user.
global $user;
// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
// do fancy stuff
}
Para verificar se o usuário atual tem uma única função ou várias funções, uma ótima maneira é:
//can be used in access callback too
function user_has_role($roles) {
//checks if user has role/roles
return !!count(array_intersect(is_array($roles)? $roles : array($roles), array_values($GLOBALS['user']->roles)));
};
if (user_has_role(array('moderator', 'administrator'))) {
// $user is admin or moderator
} else if(user_has_role('tester')){
// $user is tester
} else{
// $user is not admin and not moderator
}
Atualização para a versão Drupal> = 7.36
Você pode usar a função user_has_role na API Drupal https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7 .
Tente este exemplo:
<?php
function MYMODULE_foo() {
$role = user_role_load_by_name('Author');
if (user_has_role($role->rid)) {
// Code if user has 'Author' role...
}
else {
// Code if user doesn't have 'Author' role...
}
$user = user_load(123);
if(user_has_role($role->rid, $user)) {
// Code if user has 'Author' role...
}
else {
// Code if user doesn't have 'Author' role...
}
}
?>
Você pode instalar o módulo devel e fazer o dpm ($ user). Isso imprimirá uma matriz com todas as informações do usuário, incluindo a função do usuário.
Nessa matriz, você pode encontrar a posição da matriz de "funções" e usá-la em seu módulo para encontrar a função do usuário.
Para ser à prova de futuro, caso o nome da função mude, é melhor verificar o ID da função (rid) que pode ser encontrado na tabela de funções no banco de dados.
Se você deseja procurar uma função com o número 16, faça:
// Load the currently logged in user.
global $user;
// Check if the user has the 'editor' role, when 'editor' has role id 16
if (array_key_exists(16, $user->roles)) {
// do fancy stuff
}
Aqui está o código real do comentário mencionado na resposta aceita como a melhor prática
<?php
function mymodule_perm() {
return array('access something special');
}
function dosomethingspecial() {
// For current user
if (user_access('access something special')) {
// Doing something special!
}
// For a specific user
if (user_access('access something special', $theuser)) {
// Doing something special!
}
}
?>
Você pode verificar o papel de um usuário imprimindo ($ user) e, na saída, obterá algo como isto
Objeto stdClass ( [uid] => 0 [nome do host] => :: 1 [funções] => Matriz ( [1] => usuário anônimo // A função atual do usuário é anônima. No seu caso, pode ser diferente )