Réponses:
Vous devez modifier le formulaire de connexion et ajouter un gestionnaire de soumission qui se chargera de la redirection. Vous ne pouvez pas utiliser $form_state->setRedirectUrl()
directement dans le formulaire alter, car il sera remplacé par 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
ici? Maintenir une redirection existante?
Rediriger les utilisateurs après leur connexion sur un site Drupal 8 n'est pas différent de la façon dont cela a été fait sur Drupal 7, sauf que le code doit être adapté pour Drupal 8.
En particulier:
hook_user_login()
n'est pas utilisé pour rediriger les utilisateurs après leur connexion, simplement parce que la redirection des utilisateurs dans ce hook empêcherait d'autres hook_user_login()
implémentations d'être appelées.La bonne façon de rediriger les utilisateurs consiste à ajouter un gestionnaire de soumission de formulaire au formulaire de connexion qui utilise un code similaire au suivant.
$form_state->setRedirect('user.page');
Notez que user.page est le nom de routage du chemin Drupal vers lequel vous souhaitez rediriger l'utilisateur.
Si vous avez une instance de la Drupal\Core\Url
classe, vous pouvez également utiliser le code suivant.
$form_state->setRedirectUrl($url);
Gardez à l'esprit que la première méthode est préférable lorsque vous redirigez les utilisateurs vers une page du même site auquel ils se sont connectés; la deuxième méthode est normalement utilisée pour rediriger les utilisateurs à l'aide d'une URL externe.
vous pouvez utiliser hook_user_login et essayer de rediriger versyourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Vous pouvez également utiliser le module Rules , mais il n'y a PAS encore de version stable pour Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
erreurs dans certaines circonstances avec ce qui précède - je suggère de le remplacer return;
par exit;
, pour garantir que la redirection - qui définit les en-têtes - est la dernière chose à exécuter.
Un peu tard pour la fête, mais selon https://www.drupal.org/node/2068293#comment-11712455, vous pouvez définir la destination dans hook_user_login () pour rediriger à la fin du processus de connexion.
c'est à dire
/**
* 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()
);
}
}
}
L'utilisation de FormState :: setRedirect () selon les autres réponses couvrira probablement la plupart des cas d'utilisation et est potentiellement la `` bonne '' réponse, cependant l'utilisation du paramètre de requête de destination avec hook_user_login signifie que tout formulaire soumis * que les journaux de l'utilisateur redirigeront mais sans interférence ni connaissance préalable de toute autre partie du formulaire / demande.
c'est-à-dire qu'il fonctionnera toujours avec un formulaire de connexion personnalisé et que l' utilisation de destination n'arrête aucun autre hook (il est implémenté par \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
à la fin du traitement des réponses).
* Tout formulaire soumis qui appelle hook_user_login (user_login_finalize ()) et n'appelle pas manuellement FormState :: setResponse () .
mymodule.dashboard
est le nom de l'itinéraire et peut être remplacé par n'importe quel nom d'itinéraire (c'est \Drupal\Core\Url::fromRoute('<front>')->toString()
-à- dire ou \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Pour plus d'informations, voir drupal.org/docs/8/api/routing-system/routing-system-overview et api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Vous pouvez simplement le faire en utilisant des règles
Réagissez: une fois l'utilisateur connecté
Vous pouvez également modifier le formulaire de connexion utilisateur et ajouter votre propre gestionnaire de soumission personnalisé pour définir la redirection $ form_state, au lieu de rediriger directement l'utilisateur vers votre URL personnalisée à l'aide de 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');
}
L'ajouter dans la redirection $ form_state fera en sorte que les autres gestionnaires de soumission / hooks de connexion soient appelés.
Comme Drupal7, nous ne pouvons pas définir $ form_state ['redirect'] directement, car $ form_state est maintenant un objet de classe. Commander FormState :: setRedirect () pour plus de détails.
Dans D8, vous pouvez utiliser le module de page par défaut de l'utilisateur à cet effet.
Ce module vous permet de personnaliser la destination vers laquelle un utilisateur est redirigé après s'être connecté ou déconnecté. Vous pouvez personnaliser par rôles ou utilisateurs individuels.
Il existe un module simple pour ce faire qui est compatible avec Drupal 8. Il s'appelle Page par défaut de l'utilisateur .
Le module vous permet de personnaliser la destination vers laquelle un utilisateur est redirigé après s'être connecté ou déconnecté. Vous pouvez personnaliser par rôles ou utilisateurs individuels. Et personnalisez les messages drupal configurables pour ces actions.
hook_user_login()
ne fonctionne pas pour la redirection, il est utilisé si vous voulez faire quelque chose avec l'utilisateur lorsqu'il se connecte. Fx core suggère aux utilisateurs de définir le fuseau horaire local s'il n'est pas défini.
Au lieu de cela, vous devez utiliser hook_form_alter
sur tous les formulaires de connexion et ajouter un gestionnaire de soumission personnalisé qui définit la redirection sur l'objet d'état du formulaire.
J'affiche le formulaire de connexion dans mon propre contrôleur. De cette façon, il est possible de manipuler le formulaire (et ainsi de rediriger l'utilisateur après la connexion) sans les hooks non 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;
Modifiez l'itinéraire «proreos.home» vers la destination dont vous avez besoin.
Cordialement
Rainer
Ajoutez simplement un destination
paramètre à l'URL de connexion.
Exemple:http://example.com/user/login?destination=/my-page
Si vous le faites pour 403 pages (accès refusé), utilisez le module suivant:
https://www.drupal.org/project/redirect_403_to_login_page
J'utilise beaucoup l'extrait suivant, j'ai donc pensé le partager. Vous pouvez ajouter différentes redirections selon le rôle de l'utilisateur.
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();
}
}
Utilisez l'un de ces modules:
https://www.drupal.org/project/login_redirect
OU
https://www.drupal.org/project/login_destination
À votre santé
Vous pouvez utiliser le module logintoboggan pour la redirection. Il a d'autres configurations qui peuvent être utiles si vous voulez d'autres fonctionnalités comme la connexion à l'aide de noms d'utilisateur.
https://www.drupal.org/project/redirect
Donc, configurez le module ci-dessus pour rediriger depuis
/ user / login à / user / login? destination = 'CUSTOM_NODE_PATH'
Une autre option spécifiquement pour ce problème est un simple module contribué à Drupal 8: Rediriger après la connexion . Le module se trouve ici:
https://www.drupal.org/project/redirect_after_login
Comme le montre la description, il s'agit d'un module simple et ciblé qui est couvert par la politique de conseil en sécurité 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;
}
Je travaillais sur un moyen de contourner les autres choses qui dépendent de hook_user_login car de nombreuses autres options se brisent dans les nouvelles versions de 8. Certains autres modules redirigeant font beaucoup de travail de jambe qui n'est plus pertinent et / ou tout simplement des ressources de monopolisation. J'ai rassemblé cette logique simple dans un module personnalisé pour gérer les processus de connexion:
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;
}
J'ai utilisé cela avec succès avec Drupal 8.8.3 et cela ne rompt pas mes demandes de connexion REST d'un autre module que j'ai construit, redirige correctement pour les nouvelles créations de compte, puis redirige vers une autre page sur une connexion de site régulière.
La
$form_state->setRedirect('mymodule.dashboard);