Respuestas:
Debe modificar el formulario de inicio de sesión y agregar un controlador de envío que se encargará de la redirección. No puede usar $form_state->setRedirectUrl()
directamente en el formulario alter, ya que será sobrescrito por 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
aquí. Mantener una redirección existente?
La redirección de usuarios después de iniciar sesión en un sitio de Drupal 8 no es diferente de cómo se hizo en Drupal 7, excepto que el código debe adaptarse para Drupal 8.
En particular:
hook_user_login()
no se utiliza para redirigir a los usuarios después de que inicien sesión, simplemente por el hecho de que redirigir a los usuarios en ese enlace evitaría que hook_user_login()
se invoquen otras implementaciones.La forma correcta de redirigir a los usuarios es agregar un controlador de envío de formularios al formulario de inicio de sesión que utiliza un código similar al siguiente.
$form_state->setRedirect('user.page');
Tenga en cuenta que user.page es el nombre de ruta para la ruta de Drupal donde desea que se redirija al usuario.
Si tiene una instancia de la Drupal\Core\Url
clase, también puede usar el siguiente código.
$form_state->setRedirectUrl($url);
Tenga en cuenta que el primer método es preferible cuando redirige a los usuarios a una página en el mismo sitio en el que iniciaron sesión; El segundo método se utiliza normalmente para redirigir a los usuarios utilizando una URL externa.
puede usar hook_user_login e intentar redirigir ayourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
También puede usar el módulo Reglas , pero todavía NO hay una versión estable para Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
errores en ciertas circunstancias con lo anterior, sugiero reemplazar return;
con exit;
, para asegurar que la redirección, que establece encabezados, es lo último que se ejecuta.
Un poco tarde para la fiesta, pero según https://www.drupal.org/node/2068293#comment-11712455 puede establecer el destino en hook_user_login () para redirigir al final del proceso de inicio de sesión.
es decir
/**
* 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()
);
}
}
}
El uso de FormState :: setRedirect () según las otras respuestas probablemente cubrirá los casos de uso de la mayoría de las personas y es potencialmente la respuesta 'correcta', sin embargo, usar el parámetro de consulta de destino con hook_user_login significa que cualquier envío de formulario * que inicie sesión en el usuario redirigirá pero sin interferencia o conocimiento previo de cualquier otra parte del formulario / solicitud.
es decir, seguirá funcionando con un formulario de inicio de sesión personalizado y el uso del destino no detiene ningún otro enlace (se implementa \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
al final del proceso de respuesta).
* Cualquier envío de formulario que invoque hook_user_login (user_login_finalize ()) y no llame manualmente a FormState :: setResponse () .
mymodule.dashboard
es el nombre de la ruta y se puede reemplazar con cualquier nombre de ruta (es decir, \Drupal\Core\Url::fromRoute('<front>')->toString()
o \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Para obtener más información, consulte drupal.org/docs/8/api/routing-system/routing-system-overview y api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Simplemente puede hacerlo usando Reglas
Reaccionar: después de que el usuario haya iniciado sesión
También puede modificar el formulario de inicio de sesión del usuario y agregar su propio controlador de envío personalizado para establecer la redirección de $ form_state, en lugar de redirigir directamente al usuario a su URL personalizada utilizando 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');
}
Al agregarlo en $ form_state redirect se asegurará de que se llame a los otros controladores de envío / ganchos de inicio de sesión.
Al igual que Drupal7, no podemos establecer $ form_state ['redirect'] directamente, porque $ form_state ahora es un objeto de clase. Checkout FormState :: setRedirect () para más detalles.
En D8, puede usar el módulo de página predeterminado del usuario para este propósito.
Este módulo le permite personalizar el destino al que se redirige a un usuario después de iniciar o cerrar sesión. Puede personalizar por roles o usuarios individuales.
Hay un módulo simple para hacer esto que es compatible con Drupal 8. Se llama Página predeterminada del usuario .
El módulo le permite personalizar el destino al que se redirige a un usuario después de iniciar o cerrar sesión. Puede personalizar por roles o usuarios individuales. Y personalice los mensajes configurables de drupal para estas acciones.
hook_user_login()
no funciona para la redirección, se usa si desea hacer algo con el usuario cuando inicia sesión. Fx core sugiere a los usuarios que configuren la zona horaria local si no está configurada.
En su lugar, debe usar hook_form_alter
todos los formularios de inicio de sesión y agregar un controlador de envío personalizado que establezca la redirección en el objeto de estado del formulario.
Estoy mostrando el formulario de inicio de sesión en mi propio controlador. De esa manera, es posible manipular el formulario (y así redirigir al usuario después de iniciar sesión) sin los enlaces que no son 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;
Cambie la ruta 'proreos.home' a cualquier destino que necesite.
Saludos
Rainer
Simplemente agregue el destination
parámetro a la URL de inicio de sesión.
Ejemplo:http://example.com/user/login?destination=/my-page
Si lo hace para páginas 403 (acceso denegado) use el siguiente módulo:
https://www.drupal.org/project/redirect_403_to_login_page
Utilizo bastante el siguiente fragmento, así que pensé en compartirlo. Puede agregar diferentes redirecciones dependiendo del rol que tenga el usuario.
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();
}
}
Use cualquiera de estos módulos:
https://www.drupal.org/project/login_redirect
O
https://www.drupal.org/project/login_destination
Salud
Puede usar el módulo logintoboggan para la redirección. Tiene otras configuraciones que pueden ser útiles si desea otras funcionalidades como iniciar sesión con nombres de usuario.
https://www.drupal.org/project/redirect
Entonces, configure el módulo anterior para redirigir desde
/ user / login to / user / login? destination = 'CUSTOM_NODE_PATH'
Otra opción específica para este problema es un simple módulo contribuido con Drupal 8: Redirigir después de iniciar sesión . El módulo se puede encontrar aquí:
https://www.drupal.org/project/redirect_after_login
Como muestra la descripción, es un módulo simple y enfocado que está cubierto por la política de asesoramiento de seguridad de 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);