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'));
}
}
$form_state->setRedirect('mymodule.dashboard);
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'autreshook_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.
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.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.
la source
vous pouvez utiliser hook_user_login et essayer de rediriger vers
yourpath
Vous pouvez également utiliser le module Rules , mais il n'y a PAS encore de version stable pour Drupal 8.
la source
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
erreurs dans certaines circonstances avec ce qui précède - je suggère de le remplacerreturn;
parexit;
, 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
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 () .
la source
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é
la source
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 .
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.
la source
Dans D8, vous pouvez utiliser le module de page par défaut de l'utilisateur à cet effet.
la source
Il existe un module simple pour ce faire qui est compatible avec Drupal 8. Il s'appelle Page par défaut de l'utilisateur .
la source
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.la source
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:
Modifiez l'itinéraire «proreos.home» vers la destination dont vous avez besoin.
Cordialement
Rainer
la source
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
la source
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.
la source
Utilisez l'un de ces modules:
https://www.drupal.org/project/login_redirect
OU
https://www.drupal.org/project/login_destination
À votre santé
la source
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.
la source
https://www.drupal.org/project/redirect
Donc, configurez le module ci-dessus pour rediriger depuis
/ user / login à / user / login? destination = 'CUSTOM_NODE_PATH'
la source
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.
la source
la source
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:
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
la source