Essa resposta levou a uma discussão sobre a melhor maneira de redirecionar um usuário para uma página específica, se ele não deveria ter acesso à página que está tentando acessar.
Uma opção é definir o retorno de chamada de acesso como true e redirecionar os usuários no retorno de chamada da página. Embora isso pareça válido, acho que está misturando a funcionalidade de acesso à funcionalidade de criação de página no retorno de chamada da página.
Por exemplo
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
}
Outra opção é definir a função de retorno de chamada de acesso para chamar uma função que verifica se o usuário tem acesso, mas, em vez de retornar falso, redireciona o usuário para outra página. Isso é bom porque está separando a lógica de acesso e a lógica de criação de página. No entanto, o objetivo de um retorno de chamada de acesso é retornar um valor booleano, portanto, isso está quebrando essa lógica redirecionando o usuário.
Por exemplo
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;
}
Existem efeitos indesejáveis ao redirecionar usuários no retorno de chamada de acesso que eu não conheço?
O que você acha que é a melhor prática aqui?
fonte
Respostas:
Eu acho que você poderia fazer isso alterando a função de retorno de chamada de entrega. Se o retorno de chamada de acesso retornar,
FALSE
é isso que é passado para o retorno de chamada de entrega. Se você quiser esse comportamento de redirecionamento apenas em páginas específicas, poderá modificar o retorno de chamada de entrega apenas para essas páginas viahook_menu()
ouhook_menu_alter()
. Se você deseja que o comportamento seja global, use ahook_page_delivery_callback_alter()
para alterá-lo.Aqui está um exemplo de retorno de chamada de entrega.
Mas isso não foi testado e eu nunca alterei o retorno de chamada de entrega antes.
fonte
hook_menu_alter
:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
Eu não faria isso no retorno de chamada de acesso. Se outro desenvolvedor quiser alterar o arquivo
page_callback
em algum momento no futuro, ele acabará coçando a cabeça por que o retorno de chamada não está funcionando quando você está redirecionando no retorno de acesso.fonte