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?
quelle
Antworten:
Ich denke, Sie könnten dies tun, indem Sie die Rückruffunktion für die Zustellung ändern. Wenn der Zugriffsrückruf zurückkehrt, wird
FALSE
dieser 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 überhook_menu()
oder ändernhook_menu_alter()
. Wenn Sie möchten, dass das Verhalten global ist, können Sie es mit ahook_page_delivery_callback_alter()
ändern.Hier ist ein Beispiel für einen Rückruf.
Übrigens ist dies ungetestet, und ich habe den Rückruf der Lieferung selbst noch nie geändert.
quelle
hook_menu_alter
:$items['player/my_page']['delivery callback'] = 'player_my_page_delivery';
Ich würde es nicht im Zugriffsrückruf tun. Wenn ein anderer Entwickler dies zu einem
page_callback
späteren Zeitpunkt ändern möchte, kratzt er sich am Kopf, warum der Rückruf nicht funktioniert, wenn Sie den Zugriffsrückruf umleiten.quelle