Cette réponse a conduit à une discussion sur la meilleure façon de rediriger un utilisateur vers une page spécifique s'il ne devrait pas avoir accès à la page à laquelle il tente d'accéder.
Une option consiste à définir le rappel d'accès sur true, puis à rediriger les utilisateurs dans le rappel de la page. Bien que cela semble valide, je pense qu'il mélange la fonctionnalité d'accès avec la fonctionnalité de création de page dans le rappel de page.
Par exemple
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
}
Une autre option consiste à définir la fonction de rappel d'accès pour appeler une fonction qui vérifie si l'utilisateur a accès, mais au lieu de renvoyer false, il redirigerait l'utilisateur vers une autre page. C'est bien car cela sépare la logique d'accès et la logique de création de page. Cependant, le but d'un rappel d'accès est de renvoyer une valeur booléenne, donc cela rompt cette logique en redirigeant l'utilisateur.
Par exemple
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;
}
Y a-t-il des effets indésirables de la redirection des utilisateurs dans le rappel d'accès que je ne connais pas?
Selon vous, quelle est la meilleure pratique ici?
la source
Réponses:
Je pense que vous pouvez le faire en modifiant la fonction de rappel de livraison. Si le rappel d'accès revient,
FALSE
c'est ce qui est passé au rappel de livraison. Si vous vouliez ce comportement de redirection uniquement sur des pages spécifiques, vous pouvez modifier le rappel de livraison uniquement pour ces pages viahook_menu()
ouhook_menu_alter()
. Si vous souhaitez que le comportement soit global, vous pouvez utiliser ahook_page_delivery_callback_alter()
pour le modifier.Voici un exemple de rappel de livraison.
Ce n'est pas testé, et je n'ai jamais modifié le rappel de livraison moi-même auparavant.
la source
hook_menu_alter
:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
Je ne le ferais pas dans le rappel d'accès. Si un autre développeur souhaite modifier le
page_callback
à un moment donné dans le futur, il finira par se gratter la tête pour expliquer pourquoi le rappel ne fonctionne pas lorsque vous redirigez dans le rappel d'accès.la source