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'));
}
}
$form_state->setRedirect('mymodule.dashboard);
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 quehook_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.
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.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.
fuente
puede usar hook_user_login e intentar redirigir a
yourpath
También puede usar el módulo Reglas , pero todavía NO hay una versión estable para Drupal 8.
fuente
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
errores en ciertas circunstancias con lo anterior, sugiero reemplazarreturn;
conexit;
, 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
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 () .
fuente
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
fuente
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 .
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.
fuente
En D8, puede usar el módulo de página predeterminado del usuario para este propósito.
fuente
Hay un módulo simple para hacer esto que es compatible con Drupal 8. Se llama Página predeterminada del usuario .
fuente
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.fuente
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:
Cambie la ruta 'proreos.home' a cualquier destino que necesite.
Saludos
Rainer
fuente
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
fuente
Utilizo bastante el siguiente fragmento, así que pensé en compartirlo. Puede agregar diferentes redirecciones dependiendo del rol que tenga el usuario.
fuente
Use cualquiera de estos módulos:
https://www.drupal.org/project/login_redirect
O
https://www.drupal.org/project/login_destination
Salud
fuente
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.
fuente
https://www.drupal.org/project/redirect
Entonces, configure el módulo anterior para redirigir desde
/ user / login to / user / login? destination = 'CUSTOM_NODE_PATH'
fuente
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.
fuente
fuente