Antworten:
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'));
}
}
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 anderer hook_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.
$form_state->setRedirect('user.page');
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.
$form_state->setRedirectUrl($url);
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.
Sie können hook_user_login verwenden und versuchen, zu umzuleitenyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Sie können auch das Rules-Modul verwenden , es gibt jedoch noch KEINE stabile Version für Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
bestimmten Umständen Fehler mit den obigen Anweisungen erhalten. Ich empfehle, sie return;
durch exit;
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
/**
* Implements hook_user_login().
*/
function mymodule_user_login(\Drupal\user\UserInterface $account) {
// Ignore password reset.
$route_name = \Drupal::routeMatch()->getRouteName();
if ($route_name !== 'user.reset.login') {
// Do not interfere if a destination was already set.
$current_request = \Drupal::service('request_stack')->getCurrentRequest();
if (!$current_request->query->get('destination')) {
// Default login destination to the dashboard.
$current_request->query->set(
'destination',
\Drupal\Core\Url::fromRoute('mymodule.dashboard')->toString()
);
}
}
}
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 .
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
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 .
<?php
/**
* Implements hook_form_alter().
*/
function [MODULENAME]_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
switch ($form_id) {
// Alter login form and add own custom submit handler.
case 'user_login_form':
$form['#submit'][] = '_[MODULENAME]_user_login_form_submit';
break;
}
}
/**
* Custom submit handler for login form.
*/
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
// Set redirect to login form.
$form_state->setRedirect('YOUR.MENU-ROUTER.NAME');
}
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.
In D8 können Sie zu diesem Zweck das Standard-Seitenmodul des Benutzers verwenden.
Mit diesem Modul können Sie das Ziel anpassen, zu dem ein Benutzer nach dem Anmelden oder Abmelden umgeleitet wird. Sie können nach Rollen oder einzelnen Benutzern anpassen.
Dazu gibt es ein einfaches Modul, das mit Drupal 8 kompatibel ist. Es heißt User Default Page .
Mit dem Modul können Sie das Ziel anpassen, zu dem ein Benutzer nach dem Anmelden oder Abmelden umgeleitet wird. Sie können nach Rollen oder einzelnen Benutzern anpassen. Und passen Sie konfigurierbare Drupal-Nachrichten für diese Aktionen an.
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.
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:
$fb = $this->formBuilder();
$rc['top'] = ['#markup' => '<p>Willkommen im Kundenbereich von proreos.
Bitte melden Sie sich hier mit Ihrem
Benutzernamen oder Ihrer Email Addresse an.</p>'];
$form = $fb->getForm("Drupal\user\Form\UserLoginForm");
$ug = $this->getUrlGenerator();
$redir = $ug->generateFromRoute('proreos.home', [],
['query' => $this->getDestinationArray(), 'external' => FALSE]);
$form['#action'] = $redir;
$rc['login'] = $form;
return $rc;
Ändern Sie die Route "proreos.home" zu einem beliebigen Ziel.
Grüße
Rainer
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
Verwenden Sie eines dieser Module:
https://www.drupal.org/project/login_redirect
ODER
https://www.drupal.org/project/login_destination
Prost
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.
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'
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.
/**
* hook_user_login Redirect to English language whenever admin login
**/
function modulename_user_login($account) {
// We want to redirect user on login.
$response = new Symfony\Component\HttpFoundation\RedirectResponse("/en/admin/config");
$response->send();
return;
}
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.
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Redirect on login.
*/
function MYMODULE_user_login($account) {
$roles = $account->getRoles();
if(in_array('webmaster', $roles)) {
$response = new RedirectResponse('/admin/content');
$response->send();
}
}
$form_state->setRedirect('mymodule.dashboard);