Comment puis-je trouver une liste des valeurs $ string disponibles pour la fonction user_access ($ string)?

27

user_access ($ string, $ account = NULL)

$ string: l'autorisation, telle que "administrer les nœuds", en cours de vérification.

Comment puis-je trouver une liste des valeurs $ string disponibles pour la user_access()fonction?

gilzero
la source

Réponses:

12

Tant que chaque module peut définir ses propres autorisations, il n'y a pas de liste "stricte" de ces chaînes. Vous devrez le "construire" si vous avez vraiment besoin d'avoir une telle liste par programme.

Vous pouvez exécuter ce script dans une page / devel / php. (Bien sûr, vous avez besoin du module Devel .)

// Render role/permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  print_r($module);
  // Drupal 6
  // if ($permissions = module_invoke($module, 'perm')) {
  //  print_r($permissions);
  // }

  // Drupal 7
  if ($permissions = module_invoke($module, 'permission')) {
    print_r($permissions);
  }
}
Haza
la source
26

Comme l'a dit @Berdir, la façon la plus simple de voir quelles autorisations sont disponibles est d'aller dans les autorisations admin / people / permissions dans Drupal 7.

Le problème que je continuais à rencontrer était que je ne pouvais jamais comprendre quelle chaîne je devais fournir comme «argument d'accès» pour réellement utiliser l'autorisation. Eh bien, voici comment trouver le nom de chaîne pour les autorisations que vous souhaitez utiliser (Cet exemple utilise Google Chrome.)

La première étape. Accédez à admin / personnes / autorisations pour trouver l'autorisation que vous souhaitez utiliser et cliquez avec le bouton droit sur une case à cocher à droite de l'autorisation que vous souhaitez utiliser. Sélectionnez «Inspecter l'élément» ou allez simplement regarder la source.

Exemple

Recherchez ensuite la valeur de la case à cocher et notez la valeur. (Dans ce cas, la chaîne est «créer le contenu du coupon»)

entrez la description de l'image ici

Il s'agit de la chaîne que vous devez fournir comme argument d'accès dans hook_menu ()

Exemple de code: (éléments non pertinents supprimés, n'oubliez pas le titre, le rappel, etc. dans hook_menu ())

function fsrsys_menu() {
    $items = array();
    $items['my-custom-url'] = array(
        'access callback' => 'user_access',
        'access arguments' => array('create coupon content'),
    );
    return $items;
}
Citricguy
la source
9

Voici une version D7 de la réponse de Haza, modifiée pour utiliser DSM au lieu de print_r et pour exclure les modules qui n'implémentent pas hook_permission:

// Render permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  if ($permissions = module_invoke($module, 'permission')) {
    // List only the modules that have permissions.
    dsm($module);
    dsm($permissions);
  }
}
fureigh
la source
6

Vous pouvez utiliser la user_permission_get_modules()fonction, qui renvoie un tableau de toutes les autorisations définies et leurs modules.

Déterminez les modules auxquels les autorisations appartiennent.

Valeur de retour

Un tableau associatif au format $ permission => $ module.

Елин Й.
la source
2
Si vous l'enveloppez, array_keys()vous n'obtenez évidemment que les informations demandées. Vous pouvez ensuite également utiliser le résultat dans user_role_grant_permissions, par exemple pour accorder au rôle d'administrateur toutes les autorisations:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross
4

Le moyen le plus simple consiste à vérifier la page des autorisations (D7: admin / people / permissions, D6: admin / user / permissions). Notez que vous utilisez directement la chaîne affichée dans Drupal 6, pour 7, vous devez regarder le nom / la valeur de la case à cocher. En effet, les autorisations ont désormais un titre et une description traduits dans Drupal 7.

Donc, si vous voulez le nom de l'autorisation "Afficher le contenu publié" dans Drupal 7, la valeur est "accéder au contenu" qui est votre nom d'autorisation.

Si vous savez de quel module provient l'autorisation, vous pouvez également vérifier l' implémentation correspondante de hook_perm () (D6) / hook_pemission () (D7) de ce module.

Dans de nombreux cas, vous souhaitez définir vos propres émissions et les utiliser, vous pouvez le faire avec les crochets ci-dessus.

Berdir
la source
RE: "La manière la plus simple est de vérifier la page des autorisations (D7: admin / people / permissions,).". La page affiche une liste d'autorisations, mais ce sont des chaînes lisibles par l'homme plutôt que des chaînes lisibles par la machine.
gilzero
1
Comme je l'ai écrit ci-dessous, le nom lisible par machine peut être extrait de la valeur de l'une des cases à cocher pour une autorisation donnée.
Berdir
Cette réponse couvre Drupal 6 et 7, la seule acceptée Drupal 6 - mais la réponse acceptée est une astuce intéressante et pourrait être facilement modifiée pour Drupal 7. =)
Greg
4

Utilisation du module Devel

  • Après avoir installé et activé le module Devel , accédez à admin/config/development/devel. Il existe un paramètre intitulé "Afficher les noms de machine des autorisations et des modules". Assurez-vous que cette case est cochée.

  • Maintenant, sur la page des autorisations à people/permissions, passez la souris sur le nom de l'autorisation que vous interrogez. Cela peut retarder une seconde ou deux, mais la valeur de la chaîne s'affichera.

mlanning
la source
Wow, je n'en savais rien. Je l'ai vu après avoir posté ma réponse. Merci!
Batandwa
Très utile! TYVM.
DrCord
Doux, beaucoup plus facile que d'ouvrir le code du module!
bloke_zero
1

Voici une modification de formulaire simple qui ajoutera la clé d'autorisation au nom sur la page des autorisations. Cela devrait faciliter la recherche. Vous devrez l'ajouter à un module personnalisé et remplacer "mymodule" par le nom de ce module.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_user_admin_permissions_alter(&$form, $form_state) {
  foreach ($form['permission'] as $key => &$item) {
    if (isset($item['#type']) && $item['#type'] == 'item') {
      $item['#markup'] .= ' (' . $key . ')';
    }
  }
}
Randall Knutson
la source
1

J'ai créé cet extrait de code JavaScript qui m'aide à ce sujet. Je l'ai testé dans Drupal 7 uniquement sur le thème Shiny .

Il affiche essentiellement le nom de la machine, extrait de la première case à cocher de ce nom, dans la première cellule, sous l'étiquette. Le script repose sur jQuery, ce qui ne devrait pas poser de problème sur Drupal 7.

Je le colle généralement sur la console Developer Tools et je l'exécute à partir de là. Je pourrais créer un bookmarklet pour cela à l'avenir.

// Go through each of the rows on the permissin table
rows = jQuery('#permissions tr');
rows.each(function() {
    // Get the first checkbox in the row.
    checkbox = jQuery('.checkbox .form-checkbox', this).first();
    // Get the first cell, containing the permission label.
    nameCell = jQuery('td:first-child', this);
    // In case this is not a permission row
    if(checkbox.length == 0) {
        return;
    }

    // Embed the permission maching name on permission label cell.
    nameCell.append("<div><code>" + checkbox.val() + "</code></div>");
});
Batandwa
la source
Et grâce au service Bookmarkify.it , vous pouvez trouver le bookmarklet ici .
Batandwa
Ceci est un outil vraiment utile, ty!
DrCord
1
db_query("SELECT DISTINCT {permission} FROM role_permission");
emallove
la source
0

déposez simplement un module, vous verrez les autorisations de la machine dans / admin / people / permissions

function YOURMODULE_form_user_admin_permissions_alter(&$form, &$form_state) 
{
    $perms = &$form['permission'];

    $group_counter = 0;
    foreach ($perms as $k => &$v) {
        if ($k == $group_counter) { // skip fieldsets
            $group_counter++;
            continue;
        }

        $v['#markup'] .= ' (<span class="description" style="color:brown">'.$k.'</span>)'; 
    }
}

Cordialement

Yurii K.
la source