Câu trả lời:
Bạn cần thay đổi hình thức đăng nhập và thêm một trình xử lý trình sẽ đảm nhiệm việc chuyển hướng. Bạn không thể sử dụng $form_state->setRedirectUrl()
trực tiếp trong biểu mẫu thay đổi, vì nó sẽ bị ghi đè bởi 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
đây? Duy trì một chuyển hướng hiện có?
Chuyển hướng người dùng sau khi họ đăng nhập trên trang web Drupal 8 không khác với cách thực hiện trên Drupal 7, ngoại trừ mã cần được điều chỉnh cho Drupal 8.
Đặc biệt:
hook_user_login()
không được sử dụng để chuyển hướng người dùng sau khi họ đăng nhập, đơn giản vì thực tế là việc chuyển hướng người dùng trong hook đó sẽ ngăn các hook_user_login()
triển khai khác không được gọi.Cách chính xác để chuyển hướng người dùng là thêm trình xử lý gửi biểu mẫu vào biểu mẫu đăng nhập sử dụng mã tương tự như sau.
$form_state->setRedirect('user.page');
Lưu ý rằng user.page là tên định tuyến cho đường dẫn Drupal nơi bạn muốn người dùng được chuyển hướng.
Nếu bạn có một thể hiện của Drupal\Core\Url
lớp, bạn cũng có thể sử dụng mã sau đây.
$form_state->setRedirectUrl($url);
Hãy nhớ rằng phương pháp đầu tiên là thích hợp hơn khi bạn chuyển hướng người dùng đến một trang trong cùng trang web mà họ đã đăng nhập; phương pháp thứ hai thường được sử dụng để chuyển hướng người dùng sử dụng URL bên ngoài.
bạn có thể sử dụng hook_user_login và cố gắng chuyển hướng đếnyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Ngoài ra, bạn có thể sử dụng mô-đun Rules , nhưng vẫn chưa có phiên bản ổn định cho Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
lỗi trong một số trường hợp ở trên - tôi đề nghị thay thế return;
bằng exit;
, để đảm bảo chuyển hướng - thiết lập tiêu đề - là điều cuối cùng được thực thi.
Đến bữa tiệc muộn nhưng theo https://www.drupal.org/node/2068293#comment-11712455 bạn có thể đặt đích trong hook_user_login () để chuyển hướng khi kết thúc quá trình xử lý đăng nhập.
I E
/**
* 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()
);
}
}
}
Sử dụng FormState :: setRedirect () theo các câu trả lời khác có thể sẽ bao gồm hầu hết các trường hợp sử dụng của mọi người và có khả năng là câu trả lời 'đúng', tuy nhiên sử dụng tham số truy vấn đích với hook_user_login có nghĩa là bất kỳ biểu mẫu nào gửi * mà người dùng đăng nhập sẽ chuyển hướng nhưng không can thiệp hoặc hiểu biết trước về bất kỳ phần nào khác của mẫu / yêu cầu.
tức là nó vẫn sẽ hoạt động với một hình thức đăng nhập tùy chỉnh và việc sử dụng đích không dừng bất kỳ hook nào khác (nó được thực hiện \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
khi kết thúc quá trình xử lý phản hồi).
* Bất kỳ biểu mẫu nào gửi lệnh hook_user_login (user_login_finalize ()) và không gọi thủ công FormState :: setResponse () .
mymodule.dashboard
là tên tuyến và có thể được thay thế bằng bất kỳ tên tuyến nào (tức là \Drupal\Core\Url::fromRoute('<front>')->toString()
hoặc \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Để biết thêm thông tin, hãy xem drupal.org/docs/8/api/routing-system/routing-system-overview và api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/ của
Bạn chỉ có thể làm điều đó bằng cách sử dụng Quy tắc
Phản ứng lại: Sau khi người dùng đã đăng nhập
Bạn cũng có thể thay đổi biểu mẫu đăng nhập người dùng và thêm trình xử lý gửi tùy chỉnh của riêng bạn để đặt chuyển hướng $ form_state, thay vì chuyển hướng trực tiếp người dùng đến URL tùy chỉnh của bạn bằng hook_user_login .
<?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');
}
Thêm nó vào $ form_state redirect sẽ đảm bảo rằng các trình xử lý gửi / móc đăng nhập khác được gọi.
Giống như Drupal7, chúng ta không thể đặt trực tiếp $ form_state ['redirect'], vì $ form_state hiện là đối tượng lớp. Thanh toán FormState :: setRedirect () để biết thêm chi tiết.
Trong D8, bạn có thể sử dụng mô-đun trang mặc định của người dùng cho mục đích này.
Mô-đun này cho phép bạn tùy chỉnh đích mà người dùng được chuyển hướng đến sau khi đăng nhập hoặc đăng xuất. Bạn có thể tùy chỉnh theo vai trò hoặc người dùng cá nhân.
Có một mô-đun đơn giản để làm điều này tương thích với Drupal 8. Nó được gọi là Trang mặc định của người dùng .
Mô-đun cho phép bạn tùy chỉnh đích mà người dùng được chuyển hướng đến sau khi đăng nhập hoặc đăng xuất. Bạn có thể tùy chỉnh theo vai trò hoặc người dùng cá nhân. Và tùy chỉnh các tin nhắn drupal cấu hình cho hành động này.
hook_user_login()
không hoạt động để chuyển hướng, nó được sử dụng nếu bạn muốn làm gì đó với người dùng khi anh ta đăng nhập. Lõi Fx gợi ý người dùng đặt múi giờ cục bộ nếu nó không được đặt.
Thay vào đó, bạn cần sử dụng hook_form_alter
trên tất cả các biểu mẫu đăng nhập và thêm trình xử lý gửi tùy chỉnh để đặt chuyển hướng trên đối tượng trạng thái biểu mẫu.
Tôi đang hiển thị các hình thức đăng nhập trong bộ điều khiển của riêng tôi. Bằng cách đó, có thể thao tác biểu mẫu (và do đó chuyển hướng người dùng sau khi đăng nhập) mà không cần các móc nối không OO:
$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;
Thay đổi tuyến đường 'proreos.home' thành bất kỳ điểm đến nào bạn cần.
Trân trọng
Cơn mưa
Chỉ cần thêm destination
tham số vào url đăng nhập.
Thí dụ:http://example.com/user/login?destination=/my-page
Nếu bạn làm điều đó cho các trang 403 (Truy cập bị từ chối), hãy sử dụng mô-đun sau:
https://www.drupal.org/project/redirect_403_to_login_page
Tôi sử dụng đoạn mã sau khá nhiều vì vậy tôi nghĩ tôi sẽ chia sẻ nó. Bạn có thể thêm các chuyển hướng khác nhau tùy thuộc vào vai trò của người dùng.
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();
}
}
Sử dụng bất kỳ mô-đun nào sau đây:
https://www.drupal.org/project/login_redirect
HOẶC LÀ
https://www.drupal.org/project/login_destination
Chúc mừng
Bạn có thể sử dụng mô-đun logintoboggan để chuyển hướng. Nó có các cấu hình khác có thể hữu ích nếu bạn muốn các chức năng khác như đăng nhập bằng tên người dùng.
https://www.drupal.org/project/redirect
Vì vậy, cấu hình mô-đun trên để chuyển hướng từ
/ người dùng / đăng nhập vào / người dùng / đăng nhập? Destination = 'CUSTOM_NODE_PATH'
Một tùy chọn khác dành riêng cho vấn đề này là một mô-đun đóng góp Drupal 8 đơn giản: Chuyển hướng sau khi đăng nhập . Các mô-đun có thể được tìm thấy ở đây:
https://www.drupal.org/project/redirect_after_login
Như mô tả cho thấy, nó là một mô-đun đơn giản, tập trung được bao phủ bởi chính sách tư vấn bảo mật Drupal.
/**
* 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;
}
$form_state->setRedirect('mymodule.dashboard);