La redirection d'utilisateurs dans le rappel d'accès de hook_menu aurait-elle des effets indésirables?

8

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?

Felix Eve
la source
ajouter une barre oblique supplémentaire au commentaire php dans le rappel de la page :) la mise en évidence de la syntaxe ne fonctionne pas bien
xurshid29
5
Je pense, mais je ne suis pas positif, que si vous ajoutez ce chemin à un menu, des choses très étranges se produiront b / c, le rappel d'accès est utilisé pour déterminer si l'élément de menu peut être affiché pour un utilisateur particulier.
mpdonadio

Réponses:

6

Je pense que vous pouvez le faire en modifiant la fonction de rappel de livraison. Si le rappel d'accès revient, FALSEc'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 via hook_menu()ou hook_menu_alter(). Si vous souhaitez que le comportement soit global, vous pouvez utiliser a hook_page_delivery_callback_alter()pour le modifier.

Voici un exemple de rappel de livraison.

function custom_deliver_html_page($page_callback_result) {
  if ($page_callback_result === MENU_ACCESS_DENIED) {
    drupal_goto('<front>');
  }
  drupal_deliver_html_page($page_callback_result);
 }

Ce n'est pas testé, et je n'ai jamais modifié le rappel de livraison moi-même auparavant.

Andy
la source
Cela ressemble à une approche intéressante ...
Felix Eve
Confirmé que cela fonctionne. Bien plus propre que la redirection dans le rappel d'accès. Ajouter à hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly
3

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.

awm
la source
Cela a du sens, et je pense que le commentaire de MPD soulève également un bon point.
Felix Eve du