Відповіді:
Вам потрібно змінити форму для входу та додати обробник подання, який подбає про перенаправлення. Ви не можете використати $form_state->setRedirectUrl()
безпосередньо форму зміни форми, оскільки вона буде перезаписана 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
тут відбувається ? Підтримання наявного переспрямування?
Перенаправлення користувачів після входу на сайт Drupal 8 не відрізняється від того, як це було зроблено на Drupal 7, за винятком того, що код повинен бути адаптований до Drupal 8.
Зокрема:
hook_user_login()
не використовується для переадресації користувачів після входу в систему, просто для того, що перенаправлення користувачів у цьому гачку перешкоджає hook_user_login()
виклику інших реалізацій.Правильний спосіб перенаправлення користувачів - додавання обробника форми подання до форми для входу, який використовує код, подібний до наступного.
$form_state->setRedirect('user.page');
Зауважте, що user.page - це ім'я маршрутизації для шляху Drupal, куди потрібно переспрямувати користувача.
Якщо у вас є примірник Drupal\Core\Url
класу, ви також можете використовувати наступний код.
$form_state->setRedirectUrl($url);
Майте на увазі, що перший спосіб є кращим, коли ви перенаправляєте користувачів на сторінку на тому самому веб-сайті, на якому вони увійшли; другий метод зазвичай використовується для перенаправлення користувачів за допомогою зовнішньої URL-адреси.
Ви можете використовувати hook_user_login і спробувати переспрямуватиyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Також ви можете використовувати модуль Правила , але поки немає НЕ стабільної версії для Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
помилки при певних обставинах з вищевикладеним - я пропоную замінити return;
з exit;
, щоб забезпечити переадресацію - який встановлює заголовки - це остання річ , яка буде виконана.
Трохи запізнюється на партію, але відповідно до https://www.drupal.org/node/2068293#comment-11712455 ви можете встановити призначення у moll_user_login () для переадресації в кінці обробки входу.
тобто
/**
* 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()
);
}
}
}
Використання FormState :: setRedirect () відповідно до інших відповідей, ймовірно, охоплюватиме випадки використання більшості людей і, можливо, є "правильним" відповіддю, однак використання параметрі запиту призначення за допомогою куки_user_login означає, що будь-яка форма *, яка надсилає *, що журнали в користувачеві буде перенаправлена, але без втручання чи попереднього знання будь-якої іншої частини форми / запиту.
тобто вона все ще працюватиме з власною формою входу, а використання призначення не зупиняє жодних інших гаків (це реалізується \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
в кінці обробки відповіді).
* Будь-яка форма подання, яка викликає прив'язку_користувача (user_login_finalize ()) і не викликає вручну FormState :: setResponse () .
mymodule.dashboard
- назва маршруту, і його можна замінити будь-якою назвою маршруту (тобто \Drupal\Core\Url::fromRoute('<front>')->toString()
або \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Для отримання додаткової інформації див drupal.org/docs/8/api/routing-system/routing-system-overview і api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php / ...
Ви можете просто зробити це за допомогою Правил
Реагуйте на: Після входу користувача
Ви також можете змінити форму входу для користувача та додати власний власний обробник подання, щоб встановити $ form_state переадресацію, замість того, щоб безпосередньо перенаправляти користувача до власної URL-адреси за допомогою гака_користувача .
<?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');
}
Додавши його в $ form_state переспрямування, переконайтеся, що будуть звернуті інші обробники та гачки входу.
Як і Drupal7, ми не можемо встановити $ form_state ['redirect'] безпосередньо, оскільки $ form_state зараз об’єкт класу. Оформити замовлення FormState :: setRedirect () для отримання детальної інформації.
У D8 для цієї мети можна використовувати модуль сторінки користувача за замовчуванням .
Цей модуль дозволяє налаштувати місце призначення, до якого перенаправляється користувач після входу або виходу з системи. Ви можете налаштувати за ролями чи окремими користувачами.
Для цього є простий модуль, сумісний з Drupal 8. Він називається Сторінка користувача за замовчуванням .
Модуль дозволяє налаштувати призначення, на яке перенаправляється користувач після входу або виходу з системи. Ви можете налаштувати за ролями чи окремими користувачами. І налаштувати настроювані друпальські повідомлення для цих дій.
hook_user_login()
не працює для перенаправлення, він використовується, якщо ви хочете щось зробити з користувачем, коли він входить. Ядро Fx пропонує користувачам встановити локальний часовий пояс, якщо він не встановлений.
Натомість вам потрібно скористатись hook_form_alter
усіма формами входу та додати спеціальний обробник подачі, який встановлює переспрямування на об'єкт стану форми.
Я показую форму реєстрації у власному контролері. Таким чином можна маніпулювати формою (і так перенаправляти користувача після входу в систему) без гачків, що не належать до 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;
Змініть маршрут "proreos.home" на будь-яке місце призначення.
З повагою
Райнер
Просто додайте destination
параметр до URL-адреси входу.
Приклад:http://example.com/user/login?destination=/my-page
Якщо ви робите це на сторінках 403 (відмовлено у доступі), використовуйте наступний модуль:
https://www.drupal.org/project/redirect_403_to_login_page
Я використовую такий фрагмент досить багато, тому я подумав, що поділюсь ним. Ви можете додавати різні переадресації залежно від того, яку роль відіграє користувач.
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();
}
}
Використовуйте будь-який з цих модулів:
https://www.drupal.org/project/login_redirect
АБО
https://www.drupal.org/project/login_destination
Ура
Для перенаправлення можна використовувати модуль logintoboggan . У ньому є інші конфігурації, які можуть бути корисні, якщо ви хочете, щоб інші функції, такі як вхід у систему, використовували імена користувачів.
https://www.drupal.org/project/redirect
Отже, налаштуйте вищевказаний модуль для переадресації
/ user / login to / user / login? призначення = 'CUSTOM_NODE_PATH'
Інший варіант спеціально для цього питання - простий модуль, який надав Drupal 8: Перенаправлення після входу . Модуль можна знайти тут:
https://www.drupal.org/project/redirect_after_login
Як видно з опису, це простий, зосереджений модуль, який охоплюється консультаційною політикою щодо безпеки Друпалу.
/**
* 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;
}
Я працював над тим, щоб подолати інші речі, які залежать від mock_user_login, оскільки багато інших варіантів виходять з ладу у новіших версіях 8. Деякі інші модулі для перенаправлення виконують багато роботи на ногах, яка вже не актуальна і / або просто нецільові ресурси для вивільнення. Я зібрав цю просту логіку в спеціальний модуль для обробки процесів входу
function hook_user_login( UserInterface $account ) {
// Doing checks to see if the login is from an HTML origin or not.
// Could be from RESTful request to logins
$request = \Drupal::request();
if ($request->getRequestFormat() !== 'html') {
// default
return;
}
// Get the destination to see where the login request is going.
// This is useful to check for interactions from user creations.
$destination = $request->query->get('destination');
// Check the destination. If the destination will result in a re-direct
// to your homepage (here statically defined, but could be programmatic)
// then you can force re-direct to a different page. This is the URL defined
// in config > system > basic site settings.
if ($destination && $destination === '/whatever-homepage-uri-is') {
// Regular login, send to alternate welcome page
$response = new RedirectResponse('/welcome');
$response->send();
exit;
}
// default
return;
}
Я успішно використовую це з Drupal 8.8.3, і він не порушує мої запити на вхід REST з іншого модуля, який я створив, перенаправляє правильно для створення нових облікових записів, а потім перенаправляє на іншу сторінку в звичайному вході на сайт.
Сігналы абмеркавання
$form_state->setRedirect('mymodule.dashboard);