Risposte:
Devi modificare il modulo di accesso e aggiungere un gestore di invio che si occuperà del reindirizzamento. Non è possibile utilizzare $form_state->setRedirectUrl()
direttamente nella modifica del modulo, poiché verrà sovrascritto da 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
qui? Mantenere un reindirizzamento esistente?
Il reindirizzamento degli utenti dopo aver effettuato l'accesso a un sito Drupal 8 non è diverso da come è stato eseguito su Drupal 7, tranne per il fatto che il codice deve essere adattato per Drupal 8.
In particolare:
hook_user_login()
non viene utilizzato per reindirizzare gli utenti dopo il login, semplicemente per il fatto che il reindirizzamento degli utenti in tale hook impedirebbe hook_user_login()
di invocare altre implementazioni.Il modo corretto di reindirizzare gli utenti è l'aggiunta di un gestore di invio modulo al modulo di accesso che utilizza un codice simile al seguente.
$form_state->setRedirect('user.page');
Si noti che user.page è il nome di routing per il percorso Drupal in cui si desidera reindirizzare l'utente.
Se hai un'istanza della Drupal\Core\Url
classe, puoi anche usare il seguente codice.
$form_state->setRedirectUrl($url);
Tieni presente che il primo metodo è preferibile quando stai reindirizzando gli utenti a una pagina nello stesso sito in cui hanno effettuato l'accesso; il secondo metodo viene normalmente utilizzato per reindirizzare gli utenti utilizzando un URL esterno.
puoi usare hook_user_login e provare a reindirizzare ayourpath
function yourmodule_user_login($account) {
// We want to redirect user on login.
$response = new RedirectResponse("yourpath");
$response->send();
return;
}
Inoltre puoi usare il modulo Regole , ma NON esiste ancora una versione stabile per Drupal 8.
ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION
errori in determinate circostanze con quanto sopra - suggerisco di sostituirlo return;
con exit;
, per garantire che il reindirizzamento - che imposta le intestazioni - sia l'ultima cosa da eseguire.
Un po 'tardi alla festa, ma secondo https://www.drupal.org/node/2068293#comment-11712455 è possibile impostare la destinazione in hook_user_login () per reindirizzare alla fine dell'elaborazione dell'accesso.
vale a 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'uso di FormState :: setRedirect () secondo le altre risposte probabilmente coprirà i casi d'uso della maggior parte delle persone ed è potenzialmente la risposta "giusta", tuttavia l'utilizzo della query di destinazione param con hook_user_login significa che qualsiasi modulo inviato * che accede all'utente reindirizzerà ma senza interferenza o conoscenza preliminare di qualsiasi altra parte del modulo / richiesta.
vale a dire che continuerà a funzionare con un modulo di accesso personalizzato e l' utilizzo di destinazione non interrompe nessun altro hook (viene implementato \Drupal\Core\EventSubscriber\RedirectResponseSubscriber
alla fine dell'elaborazione della risposta).
* Qualsiasi modulo che invoca hook_user_login (user_login_finalize ()) e non chiama manualmente FormState :: setResponse () .
mymodule.dashboard
è il nome della rotta e può essere sostituito con qualsiasi nome di rotta (ovvero \Drupal\Core\Url::fromRoute('<front>')->toString()
o \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 123])->toString()
). Per ulteriori informazioni, consultare drupal.org/docs/8/api/routing-system/routing-system-overview e api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Url.php/…
Puoi semplicemente farlo usando le Regole
Riattiva: dopo che l'utente ha effettuato l'accesso
Puoi anche modificare il modulo di accesso dell'utente e aggiungere il tuo gestore di invio personalizzato per impostare il reindirizzamento $ form_state, invece di reindirizzare direttamente l'utente al tuo URL personalizzato utilizzando 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');
}
Aggiungendolo nel reindirizzamento $ form_state si assicurerà che gli altri gestori di invio / hook di login vengano chiamati.
Come Drupal7 non possiamo impostare $ form_state ['redirect'] direttamente, perché $ form_state è ora oggetto di classe. Acquista FormState :: setRedirect () per ulteriori dettagli.
In D8, è possibile utilizzare il modulo di pagina predefinito dell'utente per questo scopo.
Questo modulo consente di personalizzare la destinazione a cui viene reindirizzato un utente dopo aver effettuato l'accesso o disconnesso. È possibile personalizzare in base ai ruoli o ai singoli utenti.
Esiste un semplice modulo per farlo che è compatibile con Drupal 8. Si chiama User Default Page .
Il modulo consente di personalizzare la destinazione a cui viene reindirizzato un utente dopo aver effettuato l'accesso o disconnesso. È possibile personalizzare in base ai ruoli o ai singoli utenti. E personalizza i messaggi drupal configurabili per queste azioni.
hook_user_login()
non funziona per il reindirizzamento, viene utilizzato se si desidera fare qualcosa con l'utente quando accede. Fx core suggerisce agli utenti di impostare il fuso orario locale se non è impostato.
Invece è necessario utilizzare hook_form_alter
su tutti i moduli di accesso e aggiungere un gestore di invio personalizzato che imposta il reindirizzamento sull'oggetto stato del modulo.
Sto visualizzando il modulo di accesso nel mio controller. In questo modo è possibile manipolare il modulo (e quindi reindirizzare l'utente dopo il login) senza gli hook 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;
Cambia il percorso 'proreos.home' in qualunque destinazione ti serva.
Saluti
Rainer
Aggiungi semplicemente il destination
parametro all'URL di accesso.
Esempio:http://example.com/user/login?destination=/my-page
Se lo fai per 403 pagine (Accesso negato) usa il seguente modulo:
https://www.drupal.org/project/redirect_403_to_login_page
Uso abbastanza il frammento seguente, quindi ho pensato di condividerlo. È possibile aggiungere reindirizzamenti diversi a seconda del ruolo dell'utente.
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();
}
}
Utilizzare uno di questi moduli:
https://www.drupal.org/project/login_redirect
O
https://www.drupal.org/project/login_destination
Saluti
È possibile utilizzare il modulo logintoboggan per il reindirizzamento. Ha altri configuratrion che possono essere utili se si desidera che altre funzioni come login usando nomi utente.
https://www.drupal.org/project/redirect
Quindi, configura il modulo sopra da cui reindirizzare
/ user / accedi a / user / login? destination = 'CUSTOM_NODE_PATH'
Un'altra opzione specifica per questo problema è un semplice modulo fornito da Drupal 8: Reindirizzare dopo l'accesso . Il modulo può essere trovato qui:
https://www.drupal.org/project/redirect_after_login
Come mostra la descrizione, si tratta di un modulo semplice e mirato che è coperto dalla politica di consulenza sulla sicurezza di 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);