Il reindirizzamento degli utenti nel callback di accesso di hook_menu avrebbe effetti indesiderati?


8

Questa risposta ha portato a una discussione sul modo migliore per reindirizzare un utente a una pagina specifica se non dovrebbero avere accesso alla pagina a cui stanno tentando di accedere.

Un'opzione è impostare il callback di accesso su true e quindi reindirizzare gli utenti nel callback della pagina. Anche se questo sembra valido, penso che stia mescolando la funzionalità di accesso con la funzionalità di creazione della pagina nel callback della pagina.

Per esempio

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
}

Un'altra opzione è quella di impostare la funzione di callback di accesso per chiamare una funzione che controlla se l'utente ha accesso, ma invece di restituire false, reindirizzerebbe l'utente a un'altra pagina. Questo è buono in quanto sta separando la logica di accesso e la logica di costruzione della pagina. Tuttavia, lo scopo di un callback di accesso è quello di restituire un valore booleano, quindi ciò interrompe tale logica reindirizzando l'utente.

Per esempio

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;
}

Vi sono effetti indesiderati dal reindirizzamento degli utenti nel callback di accesso di cui non sono a conoscenza?

Quale pensi sia la migliore pratica qui?


aggiungi un'altra barra al commento php nel callback della pagina :) L'evidenziazione della sintassi non funziona bene
xurshid29

5
Penso, ma non sono positivo, che se aggiungi questo percorso a un menu accadranno cose molto strane in b / c il callback di accesso viene usato per capire se la voce di menu può essere visualizzata per un particolare utente.
mpdonadio

Risposte:


6

Penso che potresti farlo modificando la funzione di callback di consegna. Se il callback di accesso ritorna, FALSEecco cosa è passato al callback di consegna. Se si desidera questo comportamento di reindirizzamento solo su pagine specifiche, è possibile modificare il callback di consegna solo per tali pagine tramite hook_menu()o hook_menu_alter(). Se si desidera che il comportamento sia globale, è possibile utilizzare a hook_page_delivery_callback_alter()per modificarlo.

Ecco un esempio di callback di consegna.

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);
 }

A proposito, questo non è stato testato e non ho mai modificato personalmente il callback di consegna in precedenza.


Sembra un approccio interessante ...
Felix Eve,

Confermato che funziona. Molto più pulito del reindirizzamento nel callback di accesso. Aggiungi a hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
wxactly

3

Non lo farei nel callback di accesso. Se page_callbackin futuro un altro sviluppatore desidera modificarlo , finirà per grattarsi la testa sul perché il callback non funziona quando si sta reindirizzando nel callback di accesso.


Questo ha senso, e penso che anche il commento di MPD abbia un buon punto.
Felix Eve,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.