hook_permission Permisos de acceso de Drupal 7 para diferentes roles
En las lecciones anteriores mostramos cómo crear páginas y bloques en diferentes ubicaciones del sitio, y también usamos las propiedades 'access arguments' y 'access callback' para controlar el acceso. En esta lección aprenderemos a definir permisos más flexibles a través de una interfaz administrativa. Para ello, usaremos el hook hook_permission() (en Drupal 6 se llamaba hook_perm()).
hook_permission()
Este hook define permisos para los usuarios.
Con él, tu módulo puede declarar nuevos permisos que se mostrarán en la página de administración de permisos. También se usa para controlar el acceso total o parcial a las acciones del módulo.
Los permisos se verifican con la función user_access()
.
Valores de retorno
Devuelve un array donde la clave es el nombre interno del permiso, y el valor es un array asociativo con las siguientes claves:
- title: Nombre legible del permiso (usar
t()
para que sea traducible). - description (opcional): Descripción del permiso (también usar
t()
). - restrict access (opcional): Booleano que indica si solo debe asignarse a usuarios de confianza (por defecto: FALSE).
- warning (opcional): Mensaje de advertencia personalizado que sobrescribe el mensaje por defecto generado por
restrict access
.
Ejemplo: Añadimos este hook al código del módulo del ejemplo anterior:
function sitemade_permission() { return array( 'view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); }
Y actualizamos el hook_menu()
para usar este permiso:
function sitemade_menu() { $items = array(); $items['admin/config/content/page_example'] = array( 'title' => 'Página de ejemplo', 'description' => 'Una página sencilla', 'page callback' => '_page_example', 'access arguments' => array('view page example'), ); return $items; }
La función de contenido no cambia:
function _page_example($content = NULL) { $content = ''; $query = db_select('node_revision', 'n'); $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); $query->innerJoin('node', 'd', 'n.nid = d.nid'); $query->fields('n', array('title', 'nid', 'vid')); $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); $query->orderBy('n.timestamp', 'DESC'); $query->range(0, 10); $result = $query->execute(); while ($nodes = $result->fetch()) { $content .= '' . $nodes->title . '
'; $content .= $nodes->body_value; } return $content; }
Ahora, en la página de permisos admin/people/permissions
, veremos un nuevo permiso:
Asignamos este permiso solo al administrador, para que los usuarios normales no puedan acceder a la página. Si un usuario sin permiso intenta acceder a admin/config/content/page_example
, recibirá un error 403 (acceso denegado).
En la próxima lección crearemos una página de administración con un formulario de configuración para nuestro sitio utilizando la Drupal Forms API.