¿Cómo puedo encontrar una lista de valores de $ string disponibles para la función user_access ($ string)?

27

user_access ($ cadena, $ cuenta = NULL)

$ string: el permiso, como "administrar nodos", que se está buscando.

¿Cómo puedo encontrar una lista de valores de $ string disponibles para la user_access()función?

gilzero
fuente

Respuestas:

12

Mientras cada módulo pueda definir sus propios permisos, no hay una lista "estricta" de esas cadenas. Tendrá que "construirlo" si realmente necesita tener dicha lista mediante programación.

Puede ejecutar este script en una página / devel / php. (Por supuesto, necesita el módulo 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
fuente
26

Como dijo @Berdir, la forma más fácil de ver qué permisos están disponibles es ir a los permisos admin / people / permissions en Drupal 7.

El problema con el que me encontré es que nunca pude averiguar qué cadena necesitaba proporcionar como un 'argumento de acceso' para hacer uso del permiso. Bueno, así es como encuentra el nombre de la cadena para los permisos que desea usar (este ejemplo usa Google Chrome).

Paso uno. Vaya a admin / people / permissions, busque el permiso que le gustaría usar y haga clic derecho en una casilla de verificación a la derecha del permiso que le gustaría usar. Seleccione 'Inspeccionar elemento' o simplemente mire la fuente.

Ejemplo

Luego busque el valor de la casilla de verificación y anote el valor. (En este caso, la cadena es 'crear contenido de cupón')

ingrese la descripción de la imagen aquí

Esta es la cadena que debe proporcionar como argumento de acceso en hook_menu ()

Código de ejemplo: (elementos no relevantes eliminados, no olvide el título, la devolución de llamada, etc. en 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
fuente
9

Aquí hay una versión D7 de la respuesta de Haza, modificada para usar DSM en lugar de print_r y para dejar de lado los módulos que no implementan 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
fuente
6

Puede usar la user_permission_get_modules()función, que devuelve una matriz de todos los permisos definidos y sus módulos.

Determine los módulos a los que pertenecen los permisos.

Valor de retorno

Una matriz asociativa en el formato $ permission => $ module.

Елин Й.
fuente
2
Si lo envuelve, array_keys()obviamente obtendrá solo la información solicitada. También puede utilizar el resultado user_role_grant_permissions, por ejemplo, para otorgarle al rol de administrador todos los permisos:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross
4

La forma más fácil es consultar la página de permisos (D7: admin / people / permissions, D6: admin / user / permissions). Tenga en cuenta que utiliza directamente la cadena que se muestra en Drupal 6, para 7 necesita echar un vistazo al nombre / valor de la casilla de verificación. Esto se debe a que los permisos ahora tienen un título y una descripción traducidos en Drupal 7.

Entonces, si desea el nombre para el permiso "Ver contenido publicado" en Drupal 7, el valor es "acceder al contenido", que es su nombre de permiso.

Si sabe de qué módulo proviene el permiso, también puede verificar la implementación correspondiente de hook_perm () (D6) / hook_pemission () (D7) de ese módulo.

En muchos casos, desea definir sus propios permisos y usarlos, puede hacerlo con los ganchos anteriores.

Berdir
fuente
RE: "La forma más fácil es consultar la página de permisos (D7: admin / people / permissions,)". La página muestra una lista de permisos, pero son cadenas legibles por humanos en lugar de cadenas legibles por máquina.
gilzero
1
Como escribí a continuación, el nombre legible por máquina se puede extraer del valor de cualquiera de las casillas de verificación para un permiso dado.
Berdir
Esta respuesta cubre Drupal 6 y 7, la aceptada solo Drupal 6, pero la respuesta aceptada es un buen truco y podría modificarse fácilmente para Drupal 7. =)
Greg
4

Usando el módulo de desarrollo

  • Después de instalar y habilitar el módulo Devel , navegue hasta admin/config/development/devel. Existe una configuración titulada "Mostrar nombres de máquinas de permisos y módulos". Asegúrese de que esté marcado.

  • Ahora en la página de permisos en people/permissions, desplace el mouse sobre el nombre del permiso que está cuestionando. Puede demorar un segundo o dos, pero luego se mostrará el valor de la cadena.

mlanning
fuente
Wow, no sabía sobre esto. Lo vi después de que publiqué mi respuesta. ¡Gracias!
Batandwa
¡Muy útil! TYVM.
DrCord
¡Dulce, mucho más fácil que abrir el código del módulo!
bloke_zero
1

Aquí hay un formulario simple que agregará la clave de permiso al nombre en la página de permisos. Eso debería hacer que sea más fácil buscarlo. Deberá agregarlo a un módulo personalizado y reemplazar "mymodule" con el nombre de ese módulo.

/**
 * 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
fuente
1

Creé este fragmento de JavaScript que me ayuda con esto. Lo probé en Drupal 7 solo en el tema Shiny .

Básicamente, muestra el nombre de la máquina, tomado de la primera casilla de ese nombre, en la primera celda, debajo de la etiqueta. El script se basa en jQuery, que no debería ser un problema en Drupal 7.

Normalmente lo pego en la consola de Developer Tools y lo ejecuto desde allí. Podría crear un bookmarklet para él en el futuro.

// 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
fuente
Y gracias al servicio Bookmarkify.it puede encontrar el bookmarklet aquí .
Batandwa
Esta es una herramienta realmente útil, ty!
DrCord
1
db_query("SELECT DISTINCT {permission} FROM role_permission");
emallove
fuente
0

simplemente coloque algún módulo, verá los permisos de la máquina en / 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>)'; 
    }
}

Saludos

Yurii K.
fuente