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?