Würde das Umleiten von Benutzern im Zugriffsrückruf von hook_menu unerwünschte Auswirkungen haben?

8

Diese Antwort führte zu einer Diskussion darüber, wie ein Benutzer am besten auf eine bestimmte Seite umgeleitet werden kann, wenn er keinen Zugriff auf die Seite haben soll, auf die er zugreifen möchte.

Eine Möglichkeit besteht darin, den Zugriffsrückruf auf true zu setzen und dann Benutzer im Seitenrückruf umzuleiten. Dies scheint zwar gültig zu sein, aber ich denke, es mischt die Zugriffsfunktionalität mit der Seitenerstellungsfunktionalität im Seitenrückruf.

Z.B

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
}

Eine andere Möglichkeit besteht darin, die Zugriffsrückruffunktion so einzustellen, dass eine Funktion aufgerufen wird, die prüft, ob der Benutzer Zugriff hat. Statt jedoch false zurückzugeben, wird der Benutzer auf eine andere Seite umgeleitet. Dies ist gut, da es die Zugriffslogik und die Seitenerstellungslogik trennt. Der Zweck eines Zugriffsrückrufs besteht jedoch darin, einen booleschen Wert zurückzugeben, sodass diese Logik durch Umleiten des Benutzers verletzt wird.

Z.B

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

Gibt es unerwünschte Auswirkungen der Umleitung von Benutzern im Zugriffsrückruf, die mir nicht bekannt sind?

Was ist Ihrer Meinung nach die beste Vorgehensweise hier?

Felix Eve
quelle
füge einen weiteren Schrägstrich zum PHP-Kommentar im
Seitenrückruf hinzu
5
Ich denke, aber ich bin nicht sicher, dass, wenn Sie diesen Pfad zu einem Menü hinzufügen, einige sehr seltsame Dinge passieren, b / c der Zugriffsrückruf verwendet wird, um herauszufinden, ob der Menüpunkt für einen bestimmten Benutzer angezeigt werden kann.
mpdonadio

Antworten:

6

Ich denke, Sie könnten dies tun, indem Sie die Rückruffunktion für die Zustellung ändern. Wenn der Zugriffsrückruf zurückkehrt, wird FALSEdieser an den Übermittlungsrückruf übergeben. Wenn Sie dieses Umleitungsverhalten nur für bestimmte Seiten wünschen, können Sie den Rückruf für die Zustellung nur für diese Seiten über hook_menu()oder ändern hook_menu_alter(). Wenn Sie möchten, dass das Verhalten global ist, können Sie es mit a hook_page_delivery_callback_alter()ändern.

Hier ist ein Beispiel für einen Rückruf.

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

Übrigens ist dies ungetestet, und ich habe den Rückruf der Lieferung selbst noch nie geändert.

Andy
quelle
Das klingt nach einem interessanten Ansatz ...
Felix Eve
Bestätigt, dass dies funktioniert. Viel sauberer als das Umleiten im Zugriffsrückruf. Hinzufügen zu hook_menu_alter:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
genau
3

Ich würde es nicht im Zugriffsrückruf tun. Wenn ein anderer Entwickler dies zu einem page_callbackspäteren Zeitpunkt ändern möchte, kratzt er sich am Kopf, warum der Rückruf nicht funktioniert, wenn Sie den Zugriffsrückruf umleiten.

awm
quelle
Das macht Sinn, und ich denke, der Kommentar von MPD macht auch einen guten Punkt.
Felix Eve