Musisz zmienić formularz logowania i dodać moduł obsługi przesyłania, który zajmie się przekierowaniem. Nie możesz użyć $form_state->setRedirectUrl()
bezpośrednio w formularzu alter, ponieważ zostanie on zastąpiony przez 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
tutaj dzieje ? Utrzymanie istniejącego przekierowania?Przekierowywanie użytkowników po zalogowaniu się na stronie Drupal 8 nie różni się od tego, jak to zrobiono na Drupal 7, z wyjątkiem tego, że kod musi zostać dostosowany do Drupal 8.
W szczególności:
hook_user_login()
nie jest używany do przekierowywania użytkowników po zalogowaniu, po prostu dlatego, że przekierowanie użytkowników w tym zaczepie uniemożliwiłobyhook_user_login()
wywołanie innych implementacji.Prawidłowym sposobem przekierowania użytkowników jest dodanie modułu obsługi przesyłania formularzy do formularza logowania, który używa kodu podobnego do poniższego.
Zauważ, że user.page to nazwa routingu dla ścieżki Drupal, do której chcesz przekierować użytkownika.
Jeśli masz instancję
Drupal\Core\Url
klasy, możesz również użyć następującego kodu.Pamiętaj, że pierwsza metoda jest lepsza, gdy przekierowujesz użytkowników na stronę w tej samej witrynie, w której się zalogowali; druga metoda jest zwykle używana do przekierowywania użytkowników za pomocą zewnętrznego adresu URL.
źródło
możesz użyć hook_user_login i spróbować przekierować na
yourpath
Możesz także użyć modułu Reguły , ale NIE ma jeszcze stabilnej wersji dla Drupal 8.
źródło
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
W pewnych okolicznościach otrzymywałem błędy związane z powyższym - sugeruję zastąpieniereturn;
goexit;
, aby przekierowanie - które ustawia nagłówki - było ostatnią rzeczą do wykonania.Trochę za późno na imprezę, ale zgodnie z https://www.drupal.org/node/2068293#comment-11712455 możesz ustawić miejsce docelowe w hook_user_login (), aby przekierowywać na końcu procesu logowania.
to znaczy
Użycie FormState :: setRedirect () zgodnie z innymi odpowiedziami prawdopodobnie obejmie przypadki użycia przez większość ludzi i jest potencjalnie „prawidłową” odpowiedzią, jednak użycie parametru zapytania docelowego z hook_user_login oznacza, że każda przesłana forma *, która loguje użytkownika, przekieruje, ale bez ingerencji lub wcześniejszej znajomości jakiejkolwiek innej części formularza / zapytania.
tzn. nadal będzie działał z niestandardowym formularzem logowania, a użycie miejsca docelowego nie zatrzyma żadnych innych przechwyceń (jest realizowane przez
\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
pod koniec przetwarzania odpowiedzi).* Każdy formularz, który wywołuje hook_user_login (user_login_finalize ()) i nie wywołuje ręcznie FormState :: setResponse () .
źródło
mymodule.dashboard
to nazwa trasy, którą można zastąpić dowolną nazwą trasy (tj.\Drupal\Core\Url::fromRoute('<front>')->toString()
lub\Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Aby uzyskać więcej informacji, zobacz drupal.org/docs/8/api/routing-system/routing-system-overview i api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…Możesz to po prostu zrobić za pomocą Reguł
Reaguj: Po zalogowaniu się użytkownika
źródło
Możesz także zmienić formularz logowania użytkownika i dodać własny niestandardowy moduł obsługi przesyłania, aby ustawić przekierowanie $ form_state, zamiast przekierowywać użytkownika bezpośrednio do niestandardowego adresu URL za pomocą hook_user_login .
Dodanie go w przekierowaniu $ form_state sprawi, że inne wywołania handlerów / haczyków logowania zostaną wywołane.
Podobnie jak Drupal7, nie możemy bezpośrednio ustawić $ form_state ['redirect'], ponieważ $ form_state jest teraz obiektem klasy. Kasa FormState :: setRedirect () w celu uzyskania dalszych szczegółów.
źródło
W D8 możesz użyć do tego celu domyślnego modułu strony użytkownika .
źródło
Jest to prosty moduł do wykonania tego, który jest zgodny z Drupal 8. Nazywa się to Domyślna strona użytkownika .
źródło
hook_user_login()
nie działa na przekierowanie, jest używany, jeśli chcesz zrobić coś z użytkownikiem, gdy się zaloguje. Rdzeń Fx sugeruje użytkownikom ustawienie lokalnej strefy czasowej, jeśli nie jest ustawiona.Zamiast tego musisz użyć
hook_form_alter
wszystkich formularzy logowania i dodać niestandardową procedurę obsługi przesyłania, która ustawia przekierowanie na obiekcie stanu formularza.źródło
Wyświetlam formularz logowania we własnym kontrolerze. W ten sposób można manipulować formularzem (a więc przekierowywać użytkownika po zalogowaniu) bez haków innych niż OO:
Zmień trasę „proreos.home” na dowolne miejsce docelowe.
pozdrowienia
Rainer
źródło
Wystarczy dodać
destination
parametr do adresu URL logowania.Przykład:
http://example.com/user/login?destination=/my-page
Jeśli robisz to dla stron 403 (odmowa dostępu), użyj następującego modułu:
https://www.drupal.org/project/redirect_403_to_login_page
źródło
Często używam następującego fragmentu kodu, więc pomyślałem, że go podzielę. Możesz dodać różne przekierowania w zależności od roli użytkownika.
źródło
Użyj dowolnego z tych modułów:
https://www.drupal.org/project/login_redirect
LUB
https://www.drupal.org/project/login_destination
Twoje zdrowie
źródło
Do przekierowania możesz użyć modułu logintoboggan . Ma inne konfiguracje, które mogą być przydatne, jeśli chcesz innych funkcji, takich jak logowanie przy użyciu nazw użytkowników.
źródło
https://www.drupal.org/project/redirect
Skonfiguruj powyższy moduł, aby przekierowywać
/ user / login to / user / login? destination = 'CUSTOM_NODE_PATH'
źródło
Inną opcją dotyczącą tego problemu jest prosty moduł Drupal 8: Przekieruj po zalogowaniu . Moduł można znaleźć tutaj:
https://www.drupal.org/project/redirect_after_login
Jak pokazuje opis, jest to prosty, skoncentrowany moduł, który jest objęty polityką bezpieczeństwa Drupal.
źródło
źródło
Pracowałem nad sposobem obejścia innych rzeczy, które zależą od hook_user_login, ponieważ wiele nowych opcji psuje się w nowszych wersjach 8. Niektóre inne moduły przekierowujące wykonują dużo pracy nóg, która albo nie jest już istotna i / lub po prostu nieuporządkowane zasoby. Złożyłem tę prostą logikę w niestandardowym module do obsługi procesów logowania:
Korzystam z tego z powodzeniem z Drupal 8.8.3 i nie psuje moich żądań logowania REST z innego zbudowanego przeze mnie modułu, przekierowuje poprawnie na nowe konta, a następnie przekierowuje na inną stronę przy regularnym logowaniu na stronie.
W pobliżu
źródło