Como atribuir permissões a funções programaticamente?

26

Eu tenho algumas permissões que gostaria de atribuir a algumas funções programaticamente para facilitar a instalação.

Como estou instalando o módulo e criando permissões e funções, não tenho os IDs das funções, onde desejo definir as permissões. Até agora, encontrei apenas maneiras de atribuir funções programaticamente que precisam do ID da função.

Gostaria de saber se, de alguma forma, poderia procurar as funções com seu nome (string), recuperar o ID da função e depois atribuir permissão. Apenas não parece certo.

vogelsang
fonte
A tabela de permissão usa o ID da função, não o nome da função. Você precisa obter o ID da função e adicionar a permissão usando esse ID. A tabela de permissão precisa da string para a permissão e o nome do módulo que a implementa (pelo menos no Drupal 7); Não tenho certeza se o nome do módulo é realmente usado de alguma forma.
kiamlaluno
Existe algo específico que você não entende sobre o código que deve usar? Qual código você usou? Mostrar seu código seria útil; ajudaria quem responde a sugerir o que você precisa fazer (por exemplo, relatar o que está errado no seu código).
kiamlaluno
Obrigado pela resposta. Eu acho que tenho que procurar os IDs no banco de dados. Não deve ser tão difícil.
Vogelsang

Respostas:

1

O módulo Features faz isso muito bem, permitindo exportar funções e permissões (e muitas outras coisas) de uma só vez:

http://drupal.org/project/features

Mas se você deseja criar seu próprio check-out API de permissões:

http://drupal.org/project/permissions_api

krlucas
fonte
2
O problema é que você não conhece o ID da função ao usar os recursos, porque eles são atribuídos quando você instala o recurso. Portanto, você precisa encontrar os IDs de alguma forma para atribuir as permissões. Provavelmente é apenas uma pesquisa no banco de dados.
Vogelsang
24

O recurso é bastante útil para coisas como esta. No entanto, se você precisar criar funções e adicionar permissões programaticamente, não precisará pesquisar o banco de dados por conta própria.

Quando você cria uma nova função de usuário user_role_save(), ele atualiza o objeto que você transmitiu com o novo ID de função de usuário atribuído. Você pode ver um exemplo disso na standard_install()função no perfil de instalação padrão.

$admin_role = new stdClass();
$admin_role->name = 'administrator';
...
user_role_save($admin_role);
user_role_grant_permissions($admin_role->rid, array_keys(module_invoke_all('permission')));

Este exemplo mostra que você pode criar uma nova função de usuário e acessar sua ridpropriedade, que foi preenchida por user_role_save(). Também mostra como adicionar permissões a essa função user_role_grant_permissions(). Nesse caso, está concedendo à função 'administrador' todas as permissões disponíveis.

Se você precisar obter o ID de uma função de usuário criada por outra pessoa, poderá usar user_role_load_by_name()para obter o objeto para essa função de usuário. Então você apenas pega o id com $role->rid.

Chaulky
fonte
2
Isso é bom para conceder / revogar várias permissões de uma só vez: api.drupal.org/api/drupal/modules%21user%21user.module/function/…
Brian Wood
20

Eu gostaria de adicionar um exemplo de código mais próximo da pergunta original sobre como atribuir permissões a funções existentes programaticamente.

Você pode procurar as funções com o nome delas, recuperar o ID da função e atribuir permissões da seguinte maneira (por exemplo, em uma implementação de hook_update):

function custommodule_update_7001() {
  $permissions = array('view my custom entity');
  foreach(array('anonymous user', 'authenticated user') as $role_name) {
    $role = user_role_load_by_name($role_name);
    user_role_grant_permissions($role->rid, $permissions);
  }
}
batigolix
fonte