Editar: me perdí la parte sobre el permiso "editar propio nodo", porque entonces no solo debe verificar el permiso sino también si ese nodo pertenece al usuario actual. He actualizado mi ejemplo a continuación, pero dejo la explicación anterior tal como estaba.
¿Está su entrada de menú debajo de nodo / nid (por ejemplo, nodo / 1234 / algo)? Entonces, probablemente ni siquiera necesite una devolución de llamada de acceso personalizada.
Si define su ruta de menú como en el siguiente ejemplo, solo llamará a la devolución de llamada de acceso (y, por lo tanto, a la devolución de llamada de su página), si está viendo un nodo válido.
'node/%node/something'
Esto significa que llamará a node_load (1234) para el ejemplo anterior y solo continuará si se devuelve un objeto de nodo válido. Entonces puede definir su permiso con argumentos de acceso como de costumbre.
Dicho esto, escribir una devolución de llamada de acceso es realmente simple. Es solo una función que recibirá los argumentos que haya definido en los argumentos de acceso. Por ejemplo, la devolución de llamada de acceso predeterminada es user_access () y cuando define sus argumentos de acceso como 'access arguments' => array('a permission string')
, dará como resultado la siguiente llamada:user_access('a permission string')
.
Si tiene múltiples argumentos, estos se pasarán como segundo, tercero y así sucesivamente a su función. Para acceder al nodo actualmente activo, puede usar menu_get_object () .
Por lo tanto, podría escribir su devolución de llamada de acceso de esta manera, pero nuevamente, es posible que ni siquiera necesite crear una.
function yourmodule_access_check() {
global $user;
$node = menu_get_object();
return $node && $node->uid == $user->uid && user_access('edit own ' . $node->type . ' content');
}
En lugar de codificar la cadena de permisos, puede pasarla como un argumento a la función o lo que quiera hacer.
$items['node/%node/edit']['access callback'] = 'admin_access_only';
y$node = menu_get_object();
en la devolución de llamada fn,$node
nunca devolvió nada. En su lugar, utilicé lo$node = node_load(arg(1));
que funcionó ... Más explicaciones serían realmente bienvenidasDrupal es en sí mismo un ejemplo de cómo escribir código.
El ejemplo más fácil es aggregator_menu () , que contiene el siguiente código.
En este caso, la devolución de llamada de acceso es la predeterminada ( user_access () ), y los argumentos de acceso son una matriz que contiene la cadena para el permiso. El código no puede verificar más que un permiso; si los permisos para verificar son dos, o las condiciones para verificar no son solo permisos, entonces la devolución de llamada de acceso debe ser diferente, incluida una personalizada.
node_menu () define algunos menús que usan una devolución de llamada de acceso diferente a la predeterminada. La función contiene el siguiente código.
La función que se define como devolución de llamada de acceso ( node_access () ) es la siguiente:
Hay tres puntos a notar:
TRUE
si el usuario tiene acceso al menú yFALSE
si el usuario no tiene acceso al menú.fuente
access callback
función personalizada , parece que debe vivir en su.module
archivo, porque Drupal parece no poder encontrarla en lafile
declaración (al menos para mí).