Esta respuesta condujo a una discusión sobre la mejor manera de redirigir a un usuario a una página específica si no deberían tener acceso a la página a la que intentan acceder.
Una opción es establecer la devolución de llamada de acceso en verdadero y luego redirigir a los usuarios en la devolución de llamada de la página. Si bien esto parece válido, creo que combina la funcionalidad de acceso con la funcionalidad de creación de páginas en la devolución de llamada de la página.
P.ej
function hook_menu() {
$items['player/my_page'] = array(
'title' => t('My Page'), // note this is a required parameter
'access callback' => TRUE,
'page callback' => 'some_function',
);
return $items;
}
function some_function() {
global $user;
if(!$user->uid) { // here checking if the user is logged in but could be checking for a specific permission or field value
$dest = drupal_get_destination();
drupal_goto('user/login', $dest); // this remembers where the user is coming from
}
// carry on building rest of page
}
Otra opción es configurar la función de devolución de llamada de acceso para llamar a una función que verifica si el usuario tiene acceso, pero luego, en lugar de devolver falso, redirigirá al usuario a otra página. Esto es bueno ya que separa la lógica de acceso y la lógica de creación de páginas. Sin embargo, el propósito de una devolución de llamada de acceso es devolver un valor booleano, por lo que esto está rompiendo esa lógica al redirigir al usuario.
P.ej
function hook_menu() {
$items['player/my_page'] = array(
'title' => t('My Page'), // note this is a required parameter
'access callback' => 'check_access',
'page callback' => 'some_function',
);
return $items;
}
function check_access() {
global $user;
// here checking if the user is logged in but could be checking for a specific permission or field value
if(!$user->uid) {
$dest = drupal_get_destination();
drupal_goto('user/login', $dest);
}
return TRUE;
}
¿Hay algún efecto indeseable al redirigir a los usuarios en la devolución de llamada de acceso que desconozco?
¿Cuál crees que es la mejor práctica aquí?
fuente
Respuestas:
Creo que podría hacer esto alterando la función de devolución de llamada de entrega. Si la devolución de llamada de acceso regresa,
FALSE
eso es lo que se pasa a la devolución de llamada de entrega. Si desea este comportamiento de redireccionamiento solo en páginas específicas, puede modificar la devolución de llamada de entrega solo para esas páginas a través dehook_menu()
ohook_menu_alter()
. Si desea que el comportamiento sea global, puede usar ahook_page_delivery_callback_alter()
para cambiarlo.Aquí hay un ejemplo de devolución de llamada de entrega.
Por cierto, esto no se ha probado, y nunca antes había alterado la devolución de llamada de entrega.
fuente
hook_menu_alter
:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
No lo haría en la devolución de llamada de acceso. Si otro desarrollador quiere alterarlo
page_callback
en algún momento en el futuro, terminarán rascándose la cabeza de por qué la devolución de llamada no funciona cuando se redirige en la devolución de llamada de acceso.fuente