Sie müssen das Anmeldeformular ändern und einen Submit-Handler hinzufügen, der sich um die Umleitung kümmert. Sie können nicht $form_state->setRedirectUrl()
direkt im Formular ändern, da es von überschrieben wird UserForm::submitForm()
.
/**
* Implements hook_form_FORM_ID_alter().
*/
function mymodule_form_user_login_form_alter(&$form, FormStateInterface $form_state) {
$form['#submit'][] = 'mymodule_user_login_submit';
}
/**
* Form submission handler for user_login_form().
*
* Redirects the user to the dashboard after logging in.
*/
function mymodule_user_login_submit(&$form, FormStateInterface $form_state) {
$url = Url::fromRoute('mymodule.dashboard');
// Check if a destination was set, probably on an exception controller.
// @see \Drupal\user\Form\UserLoginForm::submitForm()
$request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$request->request->has('destination')) {
$form_state->setRedirectUrl($url);
}
else {
$request->query->set('destination', $request->request->get('destination'));
}
}
$form_state->setRedirect('mymodule.dashboard);
else
hier los ist? Bestehende Weiterleitung beibehalten?Das Umleiten von Benutzern nach der Anmeldung auf einer Drupal 8-Site unterscheidet sich nicht von der Vorgehensweise auf Drupal 7, mit der Ausnahme, dass der Code für Drupal 8 angepasst werden muss.
Im Speziellen:
hook_user_login()
wird nicht verwendet, um Benutzer nach der Anmeldung umzuleiten, nur weil das Umleiten von Benutzern in diesem Hook das Aufrufen andererhook_user_login()
Implementierungen verhindern würde .Die richtige Möglichkeit, Benutzer umzuleiten, besteht darin, dem Anmeldeformular einen Formularübermittlungs-Handler hinzuzufügen, der Code ähnlich dem folgenden verwendet.
Beachten Sie, dass user.page der Routing-Name für den Drupal-Pfad ist, unter dem der Benutzer umgeleitet werden soll.
Wenn Sie eine Instanz der
Drupal\Core\Url
Klasse haben, können Sie auch den folgenden Code verwenden.Beachten Sie, dass die erste Methode vorzuziehen ist, wenn Sie Benutzer auf eine Seite auf derselben Site umleiten, auf der sie sich angemeldet haben. Die zweite Methode wird normalerweise verwendet, um Benutzer mithilfe einer externen URL umzuleiten.
quelle
Sie können hook_user_login verwenden und versuchen, zu umzuleiten
yourpath
Sie können auch das Rules-Modul verwenden , es gibt jedoch noch KEINE stabile Version für Drupal 8.
quelle
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
bestimmten Umständen Fehler mit den obigen Anweisungen erhalten. Ich empfehle, siereturn;
durchexit;
zu ersetzen , um sicherzustellen, dass die Umleitung, bei der die Header festgelegt werden, als letztes ausgeführt wird.Etwas zu spät zur Party, aber gemäß https://www.drupal.org/node/2068293#comment-11712455 können Sie das Ziel in hook_user_login () so einstellen, dass es am Ende der Anmeldeverarbeitung umgeleitet wird.
dh
Die Verwendung von FormState :: setRedirect () gemäß den anderen Antworten deckt wahrscheinlich die Anwendungsfälle der meisten Personen ab und ist möglicherweise die 'richtige' Antwort. Die Verwendung des Zielabfrageparameters mit hook_user_login bedeutet jedoch, dass jedes Formular, das sich beim Benutzer anmeldet, weiterleitet ohne Einmischung oder vorherige Kenntnis eines anderen Teils des Formulars / der Anfrage.
Das heißt, es funktioniert weiterhin mit einem benutzerdefinierten Anmeldeformular und die Verwendung von destination stoppt keine anderen Hooks (die Implementierung erfolgt
\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
am Ende der Antwortverarbeitung).* Jede Formularübertragung, die hook_user_login (user_login_finalize ()) aufruft und FormState :: setResponse () nicht manuell aufruft .
quelle
mymodule.dashboard
ist der Routenname und kann durch einen beliebigen Routennamen (dh\Drupal\Core\Url::fromRoute('<front>')->toString()
oder\Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
) ersetzt werden. Weitere Informationen finden Sie unter drupal.org/docs/8/api/routing-system/routing-system-overview und api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…Sie können dies einfach mithilfe von Regeln tun
Reagiere auf: Nachdem sich der Benutzer eingeloggt hat
quelle
Sie können auch das Benutzeranmeldeformular ändern und Ihren eigenen benutzerdefinierten Submit-Handler hinzufügen, um die $ form_state-Umleitung festzulegen, anstatt den Benutzer mit hook_user_login direkt zu Ihrer benutzerdefinierten URL umzuleiten .
Durch Hinzufügen in $ form_state redirect wird sichergestellt, dass die anderen Submit-Handler / Login-Hooks aufgerufen werden.
Wie bei Drupal7 können wir $ form_state ['redirect'] nicht direkt setzen, da $ form_state jetzt ein Klassenobjekt ist. Kasse Formstate :: setRedirect () für weitere Details.
quelle
In D8 können Sie zu diesem Zweck das Standard-Seitenmodul des Benutzers verwenden.
quelle
Dazu gibt es ein einfaches Modul, das mit Drupal 8 kompatibel ist. Es heißt User Default Page .
quelle
hook_user_login()
Die Umleitung funktioniert nicht. Sie wird verwendet, wenn Sie beim Anmelden etwas mit dem Benutzer tun möchten. Fx core empfiehlt Benutzern, die lokale Zeitzone festzulegen, wenn sie nicht festgelegt ist.Stattdessen müssen Sie
hook_form_alter
alle Anmeldeformulare verwenden und einen benutzerdefinierten Submit-Handler hinzufügen, der die Umleitung für das Formularstatusobjekt festlegt.quelle
Ich zeige das Anmeldeformular in meinem eigenen Controller an. Auf diese Weise ist es möglich, das Formular zu manipulieren (und den Benutzer nach der Anmeldung umzuleiten), ohne die Nicht-OO-Hooks:
Ändern Sie die Route "proreos.home" zu einem beliebigen Ziel.
Grüße
Rainer
quelle
Fügen Sie einfach einen
destination
Parameter zur Anmelde-URL hinzu.Beispiel:
http://example.com/user/login?destination=/my-page
Wenn Sie dies für 403 (Zugriff verweigert) Seiten tun, verwenden Sie das folgende Modul:
https://www.drupal.org/project/redirect_403_to_login_page
quelle
Verwenden Sie eines dieser Module:
https://www.drupal.org/project/login_redirect
ODER
https://www.drupal.org/project/login_destination
Prost
quelle
Sie können das Logintoboggan- Modul zur Umleitung verwenden. Es hat andere Konfigurationen, die nützlich sein können, wenn Sie andere Funktionen wie die Anmeldung mit Benutzernamen wünschen.
quelle
https://www.drupal.org/project/redirect
Konfigurieren Sie daher das obige Modul, von dem umgeleitet werden soll
/ user / login to / user / login? destination = 'CUSTOM_NODE_PATH'
quelle
Eine weitere Option speziell für dieses Problem ist ein einfaches von Drupal 8 beigesteuertes Modul: Nach der Anmeldung umleiten . Das Modul finden Sie hier:
https://www.drupal.org/project/redirect_after_login
Wie die Beschreibung zeigt, handelt es sich um ein einfaches, fokussiertes Modul, das von der Drupal-Sicherheitsrichtlinie abgedeckt wird.
quelle
quelle
Ich benutze das folgende Snippet ziemlich oft, also dachte ich, ich würde es teilen. Sie können verschiedene Weiterleitungen hinzufügen, je nachdem, welche Rolle der Benutzer hat.
quelle