Вам нужно изменить форму входа и добавить обработчик отправки, который позаботится о перенаправлении. Вы не можете использовать $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'));
}
}
$form_state->setRedirect('mymodule.dashboard);
else
здесь происходит? Поддержание существующего перенаправления?Перенаправление пользователей после входа на сайт Drupal 8 не отличается от того, как это было сделано в Drupal 7, за исключением того, что код должен быть адаптирован для Drupal 8.
Особенно:
hook_user_login()
не используется для перенаправления пользователей после входа в систему, просто потому, что перенаправление пользователей в этом хуке остановит вызов другихhook_user_login()
реализаций.Правильный способ перенаправления пользователей - добавление обработчика отправки формы в форму входа, в которой используется код, подобный следующему.
Обратите внимание, что user.page - это имя маршрута для пути Drupal, куда вы хотите перенаправить пользователя.
Если у вас есть экземпляр
Drupal\Core\Url
класса, вы также можете использовать следующий код.Помните, что первый способ предпочтителен, когда вы перенаправляете пользователей на страницу того же сайта, на котором они вошли; второй метод обычно используется для перенаправления пользователей с использованием внешнего URL.
источник
Вы можете использовать hook_user_login и попытаться перенаправить на
yourpath
Также вы можете использовать модуль Правила , но пока нет стабильной версии для Drupal 8.
источник
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
ошибки в определенных обстоятельствах с вышеупомянутым - я предлагаю заменитьreturn;
наexit;
, чтобы гарантировать, что перенаправление - которое устанавливает заголовки - является последним, что должно быть выполнено.Немного опоздал на вечеринку, но согласно https://www.drupal.org/node/2068293#comment-11712455 вы можете установить пункт назначения в hook_user_login () для перенаправления в конце обработки входа в систему.
т.е.
Использование FormState :: setRedirect () в соответствии с другими ответами, вероятно, охватит случаи использования большинства людей и, возможно, является «правильным» ответом, однако использование параметра запроса назначения с hook_user_login означает, что любая форма submit *, которая регистрирует пользователя, будет перенаправлять, но без вмешательства или предварительного знания любой другой части формы / запроса.
то есть он все еще будет работать с пользовательской формой входа в систему, и использование пункта назначения не останавливает какие-либо другие ловушки (это реализуется
\Drupal\Core\EventSubscriber\RedirectResponseSubscriber
в конце обработки ответа).* Любая форма отправки, которая вызывает hook_user_login (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 с помощью hook_user_login .
Добавление его в перенаправление $ form_state обеспечит вызов других обработчиков отправки / хуков входа в систему.
Как и Drupal7, мы не можем установить $ form_state ['redirect'] напрямую, потому что $ form_state теперь является объектом класса. Checkout FormState :: setRedirect () для получения более подробной информации.
источник
В D8 вы можете использовать пользовательский модуль страницы по умолчанию для этой цели.
источник
Для этого существует простой модуль, совместимый с Drupal 8. Он называется User Default Page .
источник
hook_user_login()
не работает для перенаправления, он используется, если вы хотите что-то сделать с пользователем, когда он входит в систему. Ядро Fx предлагает пользователям установить местный часовой пояс, если он не установлен.Вместо этого вам нужно использовать
hook_form_alter
во всех формах входа в систему и добавить пользовательский обработчик отправки, который устанавливает перенаправление для объекта состояния формы.источник
Я отображаю форму входа в свой собственный контроллер. Таким образом, можно манипулировать формой (и, таким образом, перенаправлять пользователя после входа в систему) без хуков, не относящихся к OO:
Измените маршрут «proreos.home» на нужный вам пункт назначения.
С уважением
Rainer
источник
Просто добавьте
destination
параметр в логин URL.Пример:
http://example.com/user/login?destination=/my-page
Если вы делаете это для 403 страниц (доступ запрещен), используйте следующий модуль:
https://www.drupal.org/project/redirect_403_to_login_page
источник
Я использую следующий фрагмент довольно часто, поэтому я решил поделиться им. Вы можете добавлять различные перенаправления в зависимости от роли пользователя.
источник
Используйте любой из этих модулей:
https://www.drupal.org/project/login_redirect
ИЛИ
https://www.drupal.org/project/login_destination
ура
источник
Вы можете использовать модуль logintoboggan для перенаправления. Он имеет другие конфигурации, которые могут быть полезны, если вам нужны другие функции, такие как вход в систему с использованием имен пользователей.
источник
https://www.drupal.org/project/redirect
Итак, настройте вышеупомянутый модуль для перенаправления с
/ user / войти в систему / user / login? destination = 'CUSTOM_NODE_PATH'
источник
Другим вариантом, специально предназначенным для этой проблемы, является простой модуль для Drupal 8: Redirect After Login . Модуль можно найти здесь:
https://www.drupal.org/project/redirect_after_login
Как видно из описания, это простой, сфокусированный модуль, на который распространяется политика безопасности Drupal.
источник
источник